9

我在一个 2D 射击游戏上工作,屏幕上有很多移动的物体(子弹等)。

我使用 BitmapData.copyPixels(...) 将整个屏幕渲染到缓冲区:BitmapData。然后我从“缓冲区”“复制像素”到屏幕:BitmapData。帧率为60。

private var bitmap:Bitmap = new Bitmap();
private var buffer:Bitmap = new Bitmap();

private function start():void {
    addChild(bitmap);
}

private function onEnterFrame():void {
    // render into "buffer"
    // copy "buffer" -> "bitmap"
}

问题是精灵正在撕裂:精灵的某些部分水平移动。

看起来像是关闭了 VSYNC 的 PC 游戏。

有没有人解决这个问题?

更新:问题不在于性能,而在于摆脱屏幕撕裂

[!] 更新:我创建了另一个问题,在这里您可以尝试两种实现方式:使用 Flash 方式或 BitmapData+copyPixels()

4

3 回答 3

7

当我正在开发自己的游戏时,我感受到了你的痛苦。在默认设置下,无论您生成什么代码,Flash 渲染器都会产生可怕的屏幕撕裂/垂直同步问题。

这就是为什么我很高兴找到了最简单、最优雅的答案,这不是重构代码(这没有一点帮助,问题在于 Flash 播放器,而不是代码)。

只需在您的发布设置中启用硬​​件加速。有两种不同的选择:

1级:直接;和2 级:GPU

在官方文档中阅读更多相关信息:指定 SWF 文件的发布设置,并确定最适合您的游戏的选项。

目标市场确实在这里发挥了作用,如果它对游戏玩家来说是一款严肃的游戏,那么您无需担心可能出现的性能问题,因为大多数游戏玩家都有 GPU。

这篇文章并没有专门为我提供解决方案,但引导我朝着正确的方向前进。但是,如果您的游戏将在浏览器窗口中运行,您可能还必须使用相同的技术将 wmode 设置为 direct 或 gpu。

于 2010-03-14T22:42:04.847 回答
-4

您可能想要做的第一件事是停止将 Flash Player 视为 DOS。Flash Player 是一个高度优化的 2D 游戏引擎,我真的不明白您为什么要通过复制大量位图切片来重新发明轮子。当然你会遇到性能问题。

Flash Player 不允许您同步到任何垂直或水平空白,因为 Flash Player 根本没有这个概念。

我个人认为如果你想要“更流畅”的动画,你应该重新考虑你的方法。Flash Player 肯定能够做到这一点,你只是在尝试错误的方法。

于 2009-06-12T23:21:03.627 回答
-5

不要将东西保存到 BitmapData,这会杀死,绝对杀死你的应用程序。位图数据的性能不是很好。

在 Flash 中制作所有游戏元素,如 Sprites(或 MovieClips,如果你必须),然后按照 Flash 的工作方式工作,作为矢量动画平台。它从未针对 2d 位图图形进行优化。2d 矢量图形效果很好,即使您导入位图,它们也能更好地四处移动,然后它们将渲染到 BitmapData 对象。

于 2009-06-12T23:25:19.450 回答