2012-01-06 3 views
1

실시간 게임 안드로이드 게임을 만들고 있고 모든 것이 잘 작동하지만 가비지 수집기가 로딩 스레드 후에 정리하기 때문에 게임이 시작될 때 처음 몇 초가 매우 늦습니다. 물론, 플레이어는 완료 후 매끄럽게 실행되기 때문에 몇 초 (예 : 10 초 이상) 기다릴 수 있습니다.하지만보기에는 흉칙하고 게임이 버그처럼 느껴집니다.Java로 게임을 시작하기 전에 GC가 끝나기를 기다리고 있습니까?

실시간 부분이 시작되면 가비지 컬렉터가 미쳐서 시작하지 않도록 게임을 시작할 때 안전하다는 것을 알 수있는 방법 (또는 기술)이 있습니까? 큰 뚱뚱한 짐 실은 끊는 것없이 다량으로 감소 될 수 없다.

+1

"가비지 수집기가로드 스레드 후 정리 중이기 때문에 매우 지연됩니다." - 당신이로드하는 동안 메모리를 휘젓다 고 제안하지 않습니까, 아니면 그냥로드 시간입니까? 전자라면, 피할 수있는 그 무엇입니까? –

+0

@Mitch : 로더가 많은 수의 오브젝트 (또는 큰 수의 오브젝트)를 사용함을 나타냅니다. 어느 누구도 초기화가 완료 될 때까지는 수령 자격이 없습니다. – cHao

+0

@cHao : 왜 로더가 많은 물체를 필요로하는지 궁금합니다. –

답변

3

이 경우 System.gc()이 도움이 될 수 있습니다. 그것은 쓰레기를 수집하는 좋은 시간이 될 것이라고 시스템에 알려줍니다. 설명서에 따라

컨트롤이 메서드 호출에서 반환되면 Java 가상 컴퓨터는 모든 삭제 된 개체의 공간을 확보하기 위해 최선을 다했습니다. 당신이 아직 멀리 squirreled 일부 참조가 경우 특히 도움이됩니다 보장은 없다, 즉 -

워드 프로세서는 또한 방법이 수집하는 객체는 "제안"고하지만, 말한다. 작동하지 않으면 런타임을 포함하여 실행 코드에서 도달 할 수없는 객체 만 수집합니다. (당신의 코드가 더 이상 참조가 없습니다을 실행하고 끝낸 때까지 그 로더 스레드는, 예를 들어, 콜렉션에 적합하지 않습니다.)

1

가비지 수집기를 수동으로 실행하도록 게임을 시작하기 직전에 System.gc()을 실행할 수 있습니다 (적어도 공식 JavaDoc here에 따라이 메소드 호출에서 돌아 오기 전에 완료). 그러나 GC는 일반적으로 비 결정적이며 다시 실행되지 않을 것이라는 보장이 없습니다. 즉, System.gc()에 대한 호출이 전혀 수행하지 않을 것입니다.

+1

사실,하지만 [이 질문] (http://stackoverflow.com/questions/3117429/garbage-collector-in-android)은 System.gc()가 Android에서 무언가를하는 것으로 나타났습니다. GC를 실행하는 매우 합법적 인 사례입니다. 그것은 확실히 상처를주지 않을 것입니다. –

1

이 들여다 경우 더 깊이 당신은 아마 대부분의 (그 정도를 찾을 수)의 "지연"은 GC의 잘못이 아닙니다. 나는 이것이 주로 JIT 편집으로 인한 것 같아요. System.gc()를 호출하면 상황이 개선 될 수 있지만 전반적으로 느린 것을 없앨 수 있을지는 의문입니다.

+0

지연이 생길 때 내 로그에 "GC_CONCURRENT ... blah blah blah ..."라고 말한 줄이 표시되고 지연이 사라진 후 표시가 중지되므로 \ EDIT : 게다가 시작한 게임이 점점 더 복잡해지고 나서 로딩 기능에 점점 더 많은 것을 추가해야한다는 것을 알기 시작했습니다. 처음에는 많이 뒤지지 않았다. – AlexRamallo

관련 문제