我正在使用libgdx作为我正在写的游戏,其中有另一个线程需要更新图形线程。由于libgdx不是线程安全的(故意),我得到了崩溃,我允许其他线程直接修改图形线程中的变量。是否有可能重新使用包含闭包的Runnable
libgdx docs建议类似于下面的代码。它基本上是一个包含传入信息的闭包,当图形线程到达时,它将被处理。
我修改了它来声明侦听器之外的可运行内存,希望我可以避免垃圾回收,但是对我而言,现在我可能已经创建了竞争条件,其中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);
}
};
我的消息很小(关键字和一个浮点或两个),所以这可能是一个不错的选择。我假设内存同步成本与消息的大小成正比?而且..哦,如果我不在新的Runnable中,我该如何让我的闭包工作? –
同步成本可能是线性成本 - 并未考虑到消息大小@DarenSchwenke。关闭的地方在哪里?这是一个匿名课程,但我没有看到任何关闭。 – Gray
使用s和l from messageIn通过getWorkspace()调用runnable run。messageIn(s,l);可能会让人困惑。外部messageIn是我另一个线程中的一个方法,inner是图形线程中的一个方法。在新的Runnable权利声明中使用时,在外部进行最终决策时会创建一个闭包......或者我误会了。 (约6个月前开始java的perl家伙) –