저는 그래픽 스레드를 업데이트해야하는 다른 스레드가있는 쓰고있는 게임에 libgdx을 사용하고 있습니다. libgdx가 의도적으로 스레드로부터 안전하지 않고 다른 스레드가 그래픽 스레드의 변수를 직접 수정하도록 허용했기 때문에 충돌이 발생했습니다.클로저를 포함한 Runnable을 재사용 할 수 있습니까?
libgdx docs에는 다음 코드와 비슷한 것이 좋습니다. 이것은 기본적으로 들어오는 정보를 포함하는 클로저이며, 그래픽 스레드가 도착할 때 처리됩니다.
가비지 수집을 피하기 위해 리스너 외부에서 실행 파일을 선언하도록 수정했습니다.하지만 이전에 실행 가능 파일을 덮어 쓸 수있는 위치에서 경쟁 조건을 만들었습니다. 그래픽 스레드는 이전 정보를 소비합니까?
지금까지 다른 곳에서는 가비지 수집을 피할 수 있었고, 게임에서 안드로이드의 낮은 대기 시간 오디오 바인딩을 활용하기 때문에 가비지 수집이 정말 적군입니다.
제안 사항?
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);
}
}};
내 메시지가 작습니다 float 또는 two)를 사용하므로 좋은 옵션이 될 수 있습니다. 메모리 동기화 비용이 메시지 크기에 비례한다고 가정합니다. 그리고 .. 오 .. 만약 내가 새로운 Runnable에 없다면 어떻게하면 내 클로저가 작동 할까? –
동기화 비용은 아마도 선형 비용 일 수 있습니다. @DarenSchwenke 메시지의 크기를 고려하지 않았습니다. 폐쇄 장소는 어디입니까? 익명의 클래스이지만 클로저가 표시되지 않습니다. – Gray
getWorkspace()를 통해 실행 가능한 실행 호출 내에서 messageIn의 s 및 l을 사용합니다. messageIn (s, l); 아마도 혼란스러워 할 것입니다. 외부 messageIn은 다른 스레드의 메소드이고 내부는 그래픽 스레드의 메소드입니다. 새로운 Runnable 권한의 선언에 사용될 때 바깥 쪽에서 최종적으로 클로저가 생성됩니다 ... 아니면 실수입니다. (약 6 개월 전에 자바를 시작한 펄 녀석) –