java - 有没有更理想的发送绘图命令的方式?

标签 java android multithreading opengl-es synchronization

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

我已经到了一切正常的地步,唯一的问题是动画看起来有点困惑。

我正在监控帧速率,发现绘图线程没有变慢,但每隔一段时间,主循环就会变慢一点,我怀疑我遇到了我担心的问题。

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

每次更改对象的属性(例如其坐标)时,对象都会将必要的命令传递给其对应的网格(在本例中为平移网格。)

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

你能想出一种方法使它更高效和线程安全吗?

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

最佳答案

看起来你需要类似 ScheduledThreadPoolExecutor 的东西.

使用其中之一,您可以将渲染器安排在一个时间表上,使其以 30fps 的速度执行,让您的主/控制线程对帧之间的对象映射做任何它需要做的事情。

我认为您不需要任何 wait/notify 联锁,因为您真正需要的只是在渲染器遍历 map 时阻止对它的访问。为此,您只需使 map 同步。由于这只会每 1/30 秒发生一次,因此您肯定不会引入显着的开销。

您的主要目标应该是尽可能减少 CPU 上不必要的负载,这是顺利进行多线程工作的关键。尽量花更多的时间 sleep 或休息。

已添加

I subtract the time it took to loop from 33ms, and use the result to specify the length of sleep().

我想知道这是否是您的问题的一部分。在 Windows 机器上,您通常会在 currentTimeMillis 上获得 15 毫秒的分辨率,因此您可能根本睡不着觉。可能值得尝试使用 ScheduledThreadPoolExecutor 看看它是否可以改善您的计时。 ... 糟糕 ... 这是 Android,不是吗?不过……也许值得一试。

关于java - 有没有更理想的发送绘图命令的方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8685102/

相关文章:

java - Log4j2配置位置

java - 错误 : package org. Threeten.bp.format 不存在

java - 将文本文件写入内部存储的最佳方法?

c++ - 混合松弛和释放-获取内存指令

java - 在 ANDROID 中后台运行时出现 java.lang.RunTimeException

java - 使用 XPATH 表达式和 Java 解析 XML 文件

android - 如何从 expo android 应用程序中删除核心功能(SMS 小区广播)

java - ANDROID:从 Android 软键盘获取按键

Android 线程与异步任务

c# - 尝试并行运行多个 HTTP 请求,但受到 Windows(注册表)的限制