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

在不同的Android设备上的box2D中奇怪的“口吃”,第1张

概述我正在C中同时开发一个引擎和一个游戏,我正在使用box2D进行物理后端.我正在测试不同的 Android设备和3个设备中的2个,游戏运行良好,物理也是如此.然而,在我的Galaxy tab 10.1上,我偶尔会得到一种“口吃”.这是一个youtube视频演示: http://www.youtube.com/watch?v=DSbd8vX9FC0 游戏运行的第一个设备是Xperia Play ……第 我正在C中同时开发一个引擎和一个游戏,我正在使用Box2D进行物理后端.我正在测试不同的 Android设备和3个设备中的2个,游戏运行良好,物理也是如此.然而,在我的galaxy tab 10.1上,我偶尔会得到一种“口吃”.这是一个youtube视频演示:

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

游戏运行的第一个设备是Xperia Play ……第二个设备是galaxy Tab 10.1.毋庸置疑,galaxy标签的硬件要比Xperia Play好得多,但Box2D在随机时间长度内随机间隔滞后.两台机器的代码完全相同.此外,引擎/游戏的其余部分实际上并不落后.整个时间,它以60 fps的速度运行.所以这种“口吃”似乎是从Box2D实际读取值的某种延迟或故障.

你看到的精灵会在渲染时查看它们是否有一个附加的物体,并根据物体的世界位置设置它们的位置值.因此,似乎在这个特定的过程中,Box2D似乎与应用程序的其余部分不同步.很奇怪.我意识到这是一个很长的镜头,但我想我会在这里发布它,看看是否有人有想法…因为我完全被难倒了.感谢提前输入!

哦,P.S.我正在使用一个固定的时间步骤,因为这似乎是这类事情最常建议的解决方案.我在桌面上开发这个时移动到一个固定的时间步骤,我遇到了类似的问题,更严重,固定步骤是解决方案.也像我说的那样游戏稳定运行在60 fps,由低延迟计时器控制,所以我怀疑简单滞后是个问题.再次感谢!

解决方法 正如我在这里的评论中所提到的,这归结为计时器解决问题.我正在使用一个计时器类,它应该访问最高分辨率的系统计时器,跨平台.一切都运行得很好,除了它来到AndroID,一些版本工作,一些版本没有.星系标签10.1就是这样一种情况.

我最后重新编写了我的getSystemTime()方法,使用了一个名为std :: chrono :: high_resolution_clock的新增加到C11.这也很好(除了AndroID之外)……除了它还没有在任何NDK for androID中实现.它应该在crystax NDK R7的第5版中实现,该文章在本文发布时已完成80%.

我对访问系统时间的各种方法做了一些研究,或者我可以在NDK端建立一个可靠的计时器,但归结为所有平台都不支持这些不同的方法.我经历了从头开始编写自己的引擎的痛苦过程,因此我可以支持每个版本的androID,所以投注不一致实现的方法是荒谬的.

对于任何面临这个问题的人来说,唯一明智的解决方案就是放弃在NDK方面实现此类代码的想法.我将在Java端执行此 *** 作,因为到目前为止,在我的所有测试中,这已经在我测试过的所有设备上足够可靠.更多内容如下:

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

更新

我现在已经实现了我提出的解决方案,在java方面进行计时并且它已经工作了.我还发现,在NDK方面处理任何相对较大的数字,无论数据类型(调用单调时钟的纳秒数)都会导致某些版本的androID严重滞后.因此,我通过传递指向系统时间的指针尽可能地优化了这一点,以确保我们不是通过复制.

最后一点,我的说法是,从NDK方面调用单调时钟是不可靠的,但这似乎是错误的.来自System.nanoTime()的AndroID底座,

…and System.nanoTime(). This clock is guaranteed to be monotonic,
and is the recommended basis for the general purpose interval timing
of user interface events,performance measurements,and anything else
that does not need to measure elapsed time during device sleep.

所以看起来,如果这可以信任,那么调用时钟是可靠的,但是正如所提到的那样,还会出现其他问题,例如处理分配和转储大量数据,而这些数据在galaxy上几乎将我的帧速率降低了一半使用AndroID 3.2的Tab 10.1.最终结论:平等地支持所有AndroID设备是不可能接近或完全不可能使用本机代码似乎使它变得更糟.

总结

以上是内存溢出为你收集整理的在不同的Android设备上的box2D中奇怪的“口吃”全部内容,希望文章能够帮你解决在不同的Android设备上的box2D中奇怪的“口吃”所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1127040.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存