我正在使用libgdx来编写我正在编写的游戏,其中我有另一个需要更新图形线程的线程。因为libgdx不是线程安全的(故意)我正在崩溃,我允许其他线程直接修改图形线程中的变量。
libgdx docs建议类似于以下代码。它基本上是一个包含传入信息的闭包,然后在图形线程到达时处理。
我已修改它以在侦听器之外声明runnable,希望我可以避免垃圾收集,但是我发现我可能已经创建了一个竞争条件,现在可以在图形之前覆盖runnable线程消耗以前的信息?
到目前为止,我已经能够在其他地方避免垃圾收集,而且我的游戏也在Android中使用低延迟音频绑定,所以垃圾收集真的是我的敌人。
有什么建议吗?
private Runnable runnable;
private SomeListener listener = new SomeListener() {
@Override
public void messageIn(final String source, final String s, final Object... l) {
runnable = new Runnable() {
@Override
public void run() { getWorkspace().messageIn(s,l); }
};
Gdx.app.postRunnable(runnable);
}
};
答案 0 :(得分:1)
由于您正在开发游戏,我建议您将所有消息发布到队列中,然后根据需要在游戏循环中消费。
答案 1 :(得分:1)
我已修改它以在侦听器之外声明runnable,希望我可以避免垃圾收集,但是我发现我可能已经创建了一个竞争条件,现在可以在图形之前覆盖runnable线程消耗以前的信息?
是的,这肯定会发生。此外,您不能使用ThreadLocal
,因为它将处理回调与运行的不同线程。
您可以做的是创建BlockingQueue
个Runnable
类。运行方法完成后,Runnable
可以将自己置于BlockingQueue
的末尾以供重用。调用messageIn(...)
方法时,如果队列中没有方法,它将调用queue.poll()
并仅创建一个新方法。这会增加内存同步,但会降低GC带宽。它可能不会给你带来太多。
您可以考虑运行内存分析器,以确保您应该集中精力来尝试降低内存使用量。