【发布时间】:2012-02-14 10:00:27
【问题描述】:
我正在使用 C++ 同时开发引擎和游戏,并且我正在使用 box2D 作为物理后端。我正在不同的安卓设备和三分之二的设备上进行测试,游戏运行良好,物理也是如此。但是,在我的银河选项卡 10.1 上,我偶尔会遇到一种“口吃”。这是一个 youtube 视频演示:
http://www.youtube.com/watch?v=DSbd8vX9FC0
运行游戏的第一台设备是 Xperia Play……第二台设备是 Galaxy Tab 10.1。不用说 Galaxy 标签的硬件比 Xperia Play 好得多,但 Box2D 在随机时间间隔内滞后。两台机器的代码完全相同。此外,引擎/游戏的其余部分实际上并没有滞后。整个时间,它以稳定的 60 fps 运行。因此,这种“口吃”似乎是从 box2D 实际读取值时出现的某种延迟或故障。
您看到移动的精灵会在渲染时检查它们是否有附加的实体,并根据实体的世界位置设置它们的位置值。所以在这个特定的过程中,box2D 似乎与应用程序的其余部分不同步。很奇怪。我意识到这是一个长镜头,但我想无论如何我都会把它贴在这里看看是否有人有想法......因为我完全被难住了。感谢您提前提供任何意见!
哦,附言我使用的是固定时间步长,因为这似乎是此类事情最常见的建议解决方案。我在我的桌面上开发这个时移到了一个固定的时间步骤,我遇到了一个更严重的类似问题,固定的步骤就是解决方案。就像我说的游戏以 60 fps 稳定运行,这是由低延迟计时器控制的,所以我怀疑简单的延迟是问题所在。再次感谢!
【问题讨论】:
-
您是否尝试过输出物理步骤之间的时间,也许您的代码中存在错误导致它们不规则?
-
只是为了确定,您是否只为时间步长的 Box2D 的 Step() 函数提供了一个文字浮点值,例如 1/60.0?你确定每秒调用 60 次?
-
@iforce2d 是的,在初始化时我设置了一个 1/60 的浮点数并将我的最大全局 FPS 限制为 60,这就是我传递给 step() 方法的全部内容。
-
@tm1rbrt 我会这样做并回复你...我没有打扰,因为我认为它肯定是物理代码无论如何都滞后了,所以追踪步骤时间只会确认怀疑。感谢大家的建议,我稍后会更新。
-
似乎是使用 NDK 在 C/C++ 中访问系统时间的错误。它应该是低延迟的,但它似乎与不同版本的 android 不同,这是命中注定的。我称之为错误,因为这样的事情应该在所有平台上都是一致的。毕竟,如果您可以依靠获得准确的系统时间,那将是一个问题。有关更多信息,请参阅有关 Ovidiu 问题的我的 cmets。我可能会发布自己的答案,以提供更多详细信息+解决方法。
标签: android c++ android-ndk box2d