2023-01-19 368
我只是在正在开发的Android游戏中添加了一些计算昂贵的代码.所讨论的代码是碰撞检测例程的集合,这些例程经常被调用(游戏环的每一次迭代),并且正在进行大量计算.我觉得我的碰撞检测实现相当出色,并且在Java中可以做到这一点.
我一直在使用 traceView ,这件新的碰撞检测代码毫不奇怪地使我的游戏逻辑持续时间翻了一番.这显然是一个问题,因为对于某些设备,这种性能可能会使我的游戏从可玩的状态变为无法播放的状态.
我一直在考虑优化此代码的不同方法,我想知道是否将代码移动到C ++并使用JNI访问它,是否会获得一些明显的性能节省?
上面的问题是我的主要关注点,也是我询问的理由.我已经确定,以下两个原因将是使用JNI的其他积极结果.但是,说服我将代码移植到C ++是不够的.
这将使代码清洁器.由于大多数碰撞检测是某种矢量数学,因此能够使用过载的操作员而不是在Java中使用更多的详细矢量类.
,它更加干净.
内存管理将更简单.你说的简单?好吧,这是一款游戏,因此不受欢迎垃圾收集器跑步,因为GC可能会不断中断才能清理游戏,最终可能会破坏游戏的性能.在C中,我不必担心垃圾收集器,因此我可以避免使用临时静态变量在Java中所做的所有丑陋的事情,而只需依靠C ++的旧堆栈内存
可能是这个问题,我想我涵盖了所有观点.鉴于此信息,是否值得将我的代码从Java移植到C ++并使用JNI访问它(出于提高性能的原因)?另外,是否有一种方法来衡量或估计潜在的绩效增长?
编辑:
所以我做到了.结果?从TraceView的角度来看,我的碰撞检测程序速度增加了6倍.
不容易到达那里.除了必须进行JNI舞蹈之外,我还必须进行一些我没想到的优化.主要是,使用直接分配的浮点缓冲区将数据从Java传递到本机.我的最初尝试只是使用浮点数组来保存所讨论的数据,因为从Java到C ++的转换更为自然,但这确实很慢.直接缓冲区完全侧向性能问题,在Java和本地之间复制数组,并使我有6倍的颠簸.
另外,我只是使用了eigen数学库,而不是滚动自己的矢量类.我不确定这对性能有多大的影响,但至少,它节省了我自己(效率较低)向量类的时间.
唯一的教训是,过多的记录对性能不利(JIC不明显).
并不是真正对您的问题的直接答案,但是以下链接可能对您有用:
在第二个链接中写下以下内容:
本机代码不一定比Java更有效.一件事
与Java-native过渡和JIT有相关的成本
无法在这些边界上进行优化.如果您要分配本地人
资源(本机堆上的内存,文件描述符或其他),
及时安排及时收集可能会更加困难
这些资源.您还需要为每个编译代码
您希望运行的架构(而不是依靠它具有JIT).
您甚至可能必须为您考虑的内容编译多个版本
相同的架构:为ARM处理器编译的本机代码
G1无法充分利用Nexus One的手臂,并代码
编译为Nexus中的手臂,一个不会在G1中的手臂上奔跑.当您拥有现有本地的本机时,本机代码主要是有用的
您要移植到Android的代码库,而不是”加速”零件
java应用程序.
如果您仍处于游戏开发的早期阶段,则可以考虑使用游戏引擎,该游戏引擎提供了良好的碰撞检测机制,例如LibGDX,它在Box2D碰撞检测方面做得很好.
以上所述是小编给大家介绍的使用JNI,或不使用JNI(Android性能),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/25776.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态