gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:24:50 26 4
gpt4 key购买 nike

我仍在努力将我的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com