我正在使用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傢伙) –