저는 Android 플랫폼 용 Java에서 대화 형 게임 성능 튜닝을하고 있습니다. 가끔씩 가비지 수집을 위해 그리기 및 상호 작용에 어려움이 있습니다. 일반적으로 1 초의 10 분의 1 미만이지만 때로는 매우 느린 장치의 경우 최대 200ms가 될 수 있습니다.Java 게임에서 가비지 수집 지연을 방지하려면 어떻게해야합니까? (우수 사례)
ddms 프로파일 러 (Android SDK의 일부)를 사용하여 내 메모리 할당이 어디에서 왔는지 파악하고 내 드로잉 및 논리 루프에서이를 제거합니다. 같은 일
최악의 범죄자가 있었다 짧은 루프, 루프가 실행 된 모든 단일 시간이 할당 된 iterator
있었다
for(GameObject gob : interactiveObjects)
gob.onDraw(canvas);
. 내 객체에 배열 (
ArrayList
)을 사용하고 있습니다. 내 루프에서 나무 나 해시를 원한다면 자바 콜렉션 프레임 워크를 사용하는 대신 조심하거나 다시 구현해야 할 필요가 있다는 것을 알고있다. 여분의 가비지 콜렉션을 가질 여력이 없기 때문이다. 우선 순위 대기열을 볼 때 그럴 수 있습니다.
또한 Canvas.drawText
을 사용하여 점수와 진행 상황을 표시하려는 문제가 있습니다. 이
canvas.drawText("Your score is: " + Score.points, x, y, paint);
Strings
때문에, char
배열과 StringBuffers
온통 할당됩니다 그것을 작동하도록, 나쁘다. 몇 가지 텍스트 표시 항목이 있고 프레임을 초당 60 회 실행하면 합계가 시작되어 가비지 수집 딸꾹질이 증가합니다. 여기서 가장 좋은 선택은 char[]
배열을 유지하고 int
또는 double
을 수동으로 디코드하고 문자열을 시작과 끝으로 연결하는 것입니다. 뭔가 깨끗한 것이 있는지 듣고 싶습니다.
나는이 문제를 다루는 다른 사람들이 있어야한다는 것을 알고 있습니다. 어떻게 처리하고 Java 또는 Android에서 대화식으로 실행하기 위해 발견 한 함정 및 모범 사례가 무엇입니까? 이러한 gc 문제는 나를 수동 메모리 관리를 그리워 할만큼 충분하지만 그리 많지는 않다.
이보기 무효화 및 GC와 로맹 가이의 이야기 마지막 Googe I/O에 할당 뷰어 도구에 대한 섹션을 참조 할 수 있습니다. co.kr/events/io/2009/sessions/TurboChargeUiAndroidFast.html 공식 Android 성능 가이드 라인 : http://developer.android.com/guide/practices/design/performance.html 지금은 향상된 기능을 사용하지 않는 것이 좋습니다. 반복자 반복자 할당 때문에 표준 배열의 for-loop 구문. 문자열을 결합하려면 +로 연결하는 대신 StringBuilder를 사용하십시오 (한 번 할당하고 다시 필요할 때 지워야 함). –
지난 몇 년 동안 Google의 중요한 세션이 Chris Pruett의 게임에 관한 세션이었습니다. 실시간 게임의 성능에 대한 좋은 단서가 많이 있습니다. http://code.google.com/intl/de-DE/events/io/2009/sessions/WritingRealTimeGamesAndroid.html – Moritz
@Moritz의 링크가 업데이트되었습니다. http : // www.google.com/events/io/2010/sessions/writing-real-time-games-android.html – maaartinus