가비지 수집을 위해 거의 완성 된 게임 (libgdx로 작성)을 테스트하고있었습니다. verbose gc 및 2MB 힙 VM 옵션 만 사용하여 데스크톱 버전을 실행했습니다.간단한 화면 (libgdx)을 렌더링하는 동안 가비지 콜렉터가 호출됩니다.
나는 화면 렌더링 중에 gc가 매번 실행되는 것을주의해야합니다.
단일 스테이지로 간단한 화면을 만들고 하나의 이미지 액터를 추가하기로 결정했습니다. 다른 개체가 생성되지 않았습니다. 나는 그런 간단한 설정 gc로조차도 매번 킥을 발견했다. 나는 두 개의 GC 호출 약 5 분 동안 실행 한 후 얻을 수 아래의 코드와
:[GC [DefNew: 998K->4K(1024K), 0.0014329 secs] 2336K->1359K(3124K), 0.0015340 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [DefNew: 964K->3K(1024K), 0.0005355 secs] 2319K->1358K(3124K), 0.0006174 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
그리고 요약 :
Heap
def new generation total 1024K, used 133K [0x323c0000, 0x324d0000, 0x325c0000)
eden space 960K, 13% used [0x323c0000, 0x323e0918, 0x324b0000)
from space 64K, 5% used [0x324c0000, 0x324c0d10, 0x324d0000)
to space 64K, 0% used [0x324b0000, 0x324b0000, 0x324c0000)
tenured generation total 2100K, used 1355K [0x325c0000, 0x327cd000, 0x329c0000)
the space 2100K, 64% used [0x325c0000, 0x32712c48, 0x32712e00, 0x327cd000)
compacting perm gen total 12288K, used 2520K [0x329c0000, 0x335c0000, 0x369c0000)
the space 12288K, 20% used [0x329c0000, 0x32c36140, 0x32c36200, 0x335c0000)
ro space 10240K, 54% used [0x369c0000, 0x36f3daf0, 0x36f3dc00, 0x373c0000)
rw space 12288K, 55% used [0x373c0000, 0x37a61ce8, 0x37a61e00, 0x37fc0000)
다음
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.actions.Actions;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
public class TestScreen implements Screen {
private static final float viewportWidth = 40f;
private static final float viewportHeight = 24f;
private final Assets assets = new Assets();
private Stage stage;
@Override
public void render(float delta) {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
stage.act();
stage.draw();
}
@Override
public void resize(int width, int height) {
}
@Override
public void show() {
stage = new Stage(viewportWidth, viewportHeight, false);
Image image = new Image(assets.getMenuSkin(), "stars");
image.setSize(viewportWidth, viewportHeight);
image.setPosition(0f, 0f);
stage.addActor(image);
}
@Override
public void hide() {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void dispose() {
assets.dispose();
stage.dispose();
}
}
출력의 가비지 수집 된 배열을 통해 OpenGL 데이터를 보내고 있습니까?
Mario의 책 (Android 게임 시작)에서 읽은 바에 따르면 나는 그렇지 않다는 것을 알았습니다. 내가 기억하는 한, Mario는 gc를이 경우 실행시킨 버그에 대해 썼지 만 초기 Android 버전에서만 존재했습니다.
데스크톱 구현이 gc로 실행되고 Android가 실행되지 않을 수 있습니다.
당신이 사용하고있는 OpenGL 라이브러리에 대해 조금 아는 것이 얼마나 자주 show()가 호출되는지 궁금하십니까? 매번 새로운 이미지를 생성하고 너무 많은 객체를 사용하여 힙을 낭비하여 GC를 많이 강제 실행하지 않을 수 있습니다. – arynaq
show()는 화면이 표시 될 때 한 번만 호출됩니다. 클래스 생성자에서 libgdx 항목을 만들 때 초기화되지 않은 오류가 발생하기 때문에 모든 생성 논리를 여기에 넣는 경향이 있습니다. – Dzik