正如我在这里的评论中提到的,这归结为计时器分辨率问题。我正在使用一个计时器类,它应该访问跨平台的最高分辨率系统计时器。一切都运行良好,除了 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 设备要么几乎是不可能的,要么根本不可能,而使用本机代码似乎会让情况变得更糟.