我有一个具有视网膜分辨率(大约 200 帧)和一些动作脚本的 Flash 影片剪辑。我想使用 stage3d 来提高性能。这是否可能只是将影片剪辑添加到 stage3d 舞台而不会丢失动作脚本?
2 回答
简短的回答:没有。
长答案:不完全是。无论您的输出如何,ActionScript 仍然以相同的方式执行。但是,如果您有想要在 GPU 中呈现的内容,则需要将其与 ActionScript 代码分离。您必须执行相同的影片剪辑,然后将所有帧即时发送到 GPU。这将是一个巨大的资源消耗 - GPU 在渲染事物时很棒,但你必须在那里获取你的数据(你的“纹理”),这需要时间。这种上传到 GPU 的过程很复杂,并且可能是一个真正的瓶颈——当然不是每帧都应该做的事情。在这种情况下,无论如何您仍然需要 draw() 电影,因此最终 blitting 期间的任何性能提升都是没有意义的。
如果您的动画足够小且足够短,您可以将每一帧渲染到与平铺动画相同的单个位图(如精灵表)。然后,您将这个巨大的图像(在大多数情况下最高为 2048x2048,或者在较新的 GPU 中为 4096x4096)上传到硬件,然后通过更改 (UV) 映射坐标来更改“帧”。这是迄今为止在 Flash 中播放动画最快的方法。但如前所述,它要求将所有帧组合成同一张图像(无论是否即时),并上传一次。对于 200 帧,您的动画的尺寸必须为 146x146(或多或少)才能实现,因此它可能很复杂(您需要更多的 spritesheets)。
显然,每帧也可以有一个纹理。加载会有点烦人,但它会起作用。然后,您可以使用Starling 的 MovieClip 之类的东西来播放它。但是话又说回来,您的 ActionScript 会丢失 - 您需要以某种方式将它们重新添加到您的代码中,例如通过不断检查框架。
另一种解决方案可能是将您的动画作为视频并改用 StageVideo。它超级好,更适合复杂的动画内容。
TL;DR:硬件加速在 Flash 中很棒,但根据定义,它只在某些情况下有效。Flash 可以更好地处理某些事情。
No, you can't just "enable" stage3d and have it work.
Look into Starling framework, that might be the easiest way for you (unless you have text inputs, which will require a bit of a workaround). You'll still have to change a few things in the code, though; it won't be a simple plug and play.