不同 Android 设备上 box2D 中出现奇怪的“口吃”

2024-05-21

我正在用 C++ 同时开发引擎和游戏,并使用 box2D 作为物理后端。我正在不同的 Android 设备上进行测试,在三分之二的设备上,游戏运行良好,物理效果也很好。然而,在我的 Galaxy Tab 10.1 上,我偶尔会遇到某种“口吃”的情况。这是一个 YouTube 视频演示:

http://www.youtube.com/watch?v=DSbd8vX9FC0 http://www.youtube.com/watch?v=DSbd8vX9FC0

运行游戏的第一台设备是 Xperia Play...第二台设备是 Galaxy Tab 10.1。不用说,Galaxy Tab 的硬件比 Xperia Play 好得多,但 Box2D 会以随机间隔、随机时间长度出现滞后。两台机器的代码完全相同。此外,引擎/游戏的其余部分实际上并不落后。自始至终,它都以稳定的 60 fps 运行。因此,这种“口吃”似乎是实际从 box2D 读取值时出现的某种延迟或故障。

您看到移动的精灵会在渲染时检查它们是否具有附加的物理主体,并根据物理主体的世界位置设置其位置值。因此,在这个特定过程中,box2D 似乎与应用程序的其余部分不同步。很奇怪。我意识到这是一个渺茫的机会,但我想无论如何我都会将其发布在这里,看看是否有人有想法......因为我完全被难住了。感谢您提前提供任何意见!

哦,附注我使用固定时间步长,因为这似乎是此类问题最常建议的解决方案。当我在桌面上开发这个程序时,我转向了固定时间步骤,我遇到了类似的问题,只是更严重,固定步骤就是解决方案。也正如我所说,游戏稳定地以 60 fps 运行,这是由低延迟计时器控制的,所以我怀疑简单的延迟就是问题所在。再次感谢!


正如我在这里的评论中提到的,这归结为计时器分辨率问题。我正在使用一个计时器类,它应该访问跨平台的最高分辨率系统计时器。一切都运行良好,除了 Android 之外,有些版本可以运行,有些版本则不能。 Galaxy Tab 10.1 就是这样的例子。

我最终重写了我的getSystemTime()使用 C++11 新增功能的方法称为std::chrono::high_resolution_clock。这也很有效(除了 Android 之外的任何地方)...除了它尚未在任何适用于 Android 的 NDK 中实现。它应该在crystax NDK R7 的第5 版中实现,在本文发表时已完成80%。

我对访问系统时间的各种方法或可以在 NDK 端建立可靠计时器的方法进行了一些研究,但归根结底是并非所有平台都支持这些不同的方法。我经历了从头开始编写自己的引擎的痛苦过程,只是为了支持每个版本的android,所以把赌注押在实现不一致的方法上是没有意义的。

在我看来,对于任何面临这个问题的人来说,唯一明智的解决方案就是放弃在 NDK 端实现此类代码的想法。我将在 Java 端执行此操作,因为到目前为止,在我的所有测试中,这在我测试过的所有设备上都足够可靠。更多信息请参见这里:

http://www.codeproject.com/Articles/189515/Androng-a-Pong-clone-for-Android#Gettinghigh-ologiestimingfromAndroid7 http://www.codeproject.com/Articles/189515/Androng-a-Pong-clone-for-Android#Gettinghigh-resolutiontimingfromAndroid7

Update
我现在已经实现了我提出的解决方案,在 java 端进行计时,并且它已经起作用了。我还发现,在 NDK 端处理任何相对较大的数字,无论数据类型如何(例如调用单调时钟的纳秒数),也会导致某些版本的 android 上出现严重滞后。因此,我通过传递指向系统时间的指针来尽可能地优化它,以确保我们不会传递副本。

最后一件事是,我关于从 NDK 端调用单调时钟不可靠的说法似乎是错误的。从 Android 基座上System.nanoTime() http://developer.android.com/reference/android/os/SystemClock.html,

...和 ​​System.nanoTime()。这个时钟保证是单调的, 是通用间隔计时的推荐基础 用户界面事件、性能测量和其他任何内容 不需要测量设备睡眠期间经过的时间。

因此,如果这是可信的,那么调用时钟是可靠的,但正如前面提到的,还会出现其他问题,例如处理分配和转储所导致的大量数字,仅此一项就几乎将我在 Galaxy 上的帧率降低了一半Android 3.2 的选项卡 10.1。最终结论: 平等地支持所有 Android 设备要么几乎是不可能的,要么根本不可能,而使用本机代码似乎会让情况变得更糟.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不同 Android 设备上 box2D 中出现奇怪的“口吃” 的相关文章

随机推荐