是否有更理想的方式发送绘图命令?

时间:2011-12-30 23:41:56

标签: java android multithreading opengl-es synchronization

我仍在努力将我的Android应用程序转移到OpenGL上,我又一次遇到了问题。

我已经达到了所有功能的地步,唯一的问题是动画看起来有点抖动。

我正在监视帧速率并且看到绘制线程没有减速,但是每隔一段时间,主循环就会慢一点,我怀疑我遇到了一个我担心的问题。

应用程序的工作方式是,当创建新对象(例如,敌人)时,实际创建了2个对象。第一个是在主线程中创建并映射的,然后在它的构造函数中,它创建一个网格对象,然后将其添加到一个组中,由渲染器连续绘制。

每次更改对象的属性时(例如其坐标)该对象将必要的命令中继到其网格对应物(在此示例中为平移网格。)

有人建议这是线程安全的通信,但我有疑虑。我还注意到在创建新对象时有更多的帧跳过,我可以通过为相同的Game对象重用相同的网格对象来解决这个问题,但我不相信这会自行解决所有问题。

你能想出一种方法来提高效率和线程安全吗?

另一种可能的解决方案:游戏逻辑不必全速运行(实时)我实际设置它以便不进行任何更新,直到33毫秒通过。很明显,我应该在帧之间有足够的时间来绘制,我可以设置它以便只在线程中的命令上调用绘制(在游戏逻辑更新之后)?

1 个答案:

答案 0 :(得分:1)

看起来你需要像ScheduledThreadPoolExecutor这样的东西。

使用其中一个可以将渲染器按计划放置,以便以30fps执行,让主/控制线程对帧之间的对象映射执行任何操作。

我认为您不需要任何wait/notify互锁,因为您真正需要的是在渲染器移动时阻止对map的访问。为此,您只需制作地图synchronized即可。因为这只会在每1/30秒发生一次,所以肯定不会带来很大的开销。

您的主要目标应该是尽可能减少对CPU的负担,这是平滑多线程工作的关键。尝试尽可能多地花时间睡觉或阻止。

<强>加

  

我从33ms中减去循环所花费的时间,并使用结果指定sleep()的长度。

我想知道这可能是你问题的一部分。在Windows机器上,你经常会在currentTimeMillis上获得15ms的分辨率,这样你的睡眠可能最终几乎无法入睡。可能值得尝试使用ScheduledThreadPoolExecutor来查看它是否可以改善您的时间安排。 ...哎呀......这不是Android。仍然......可能值得一试。