是否可以重用包含Runnable的闭包

时间:2013-07-16 16:59:19

标签: java android multithreading garbage-collection libgdx

我正在使用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);
    }

};

2 个答案:

答案 0 :(得分:1)

由于您正在开发游戏,我建议您将所有消息发布到队列中,然后根据需要在游戏循环中消费。

答案 1 :(得分:1)

  

我已修改它以在侦听器之外声明runnable,希望我可以避免垃圾收集,但是我发现我可能已经创建了一个竞争条件,现在可以在图形之前覆盖runnable线程消耗以前的信息?

是的,这肯定会发生。此外,您不能使用ThreadLocal,因为它将处理回调与运行的不同线程。

您可以做的是创建BlockingQueueRunnable类。运行方法完成后,Runnable可以将自己置于BlockingQueue的末尾以供重用。调用messageIn(...)方法时,如果队列中没有方法,它将调用queue.poll()并仅创建一个新方法。这会增加内存同步,但会降低GC带宽。它可能不会给你带来太多。

您可以考虑运行内存分析器,以确保您应该集中精力来尝试降低内存使用量。