2013-08-08 2 views
2

stackoverflowers 및 기타 좋은 사람들 시도하는 데 2 ​​일 후에 해결 방법을 모르는 한 가지 문제가 있습니다. libgdx 프로젝트가 있습니다. 몇 가지 (4-5) 렌더링은 약 0.04 초 델타가TextureAtlas가로드 된 후 잠시 동안 낮은 fps 속도입니다

  1. 먼저 빈 화면 설정 : 내가 코멘트 모든 것을 유용하고 문제가되지 않습니다에 추가 곳 ') 단계와 배우를 사용하고 있습니다,하지만 지금은 중요하지는 간단하다 , 그 다음 0,01
  2. 화면을 설정합니다. 여기서 resize 메서드에서 TextureAtlas의 새 인스턴스를 만들었습니다. 두 개의 1024 x 1024 텍스처를로드하는데 0.5-0.8 초 정도 소요됩니다. 렌더링이 시작되고 처음 몇 번의 렌더링 (5)은 0.1 초 (SGS II) 또는 약 0.2 - 0.3 초 ​​(SG ACE)의 델타 시간을 갖습니다. 그리고 이것은 실제로 상당한 문제입니다. 왜냐하면 어떤 페이드 인 효과 또는 어떤 애니메이션이든 화면의 시작 부분에서 애니메이션의 두 번째 절반을 보게 될 것입니다 - 그렇지 않으면 낮은 fps 등급을 가졌을 때 ... 아무것도 그리지 않습니다. (심지어 렌더링이 심지어는 호출 된 것을 볼 수는 없습니다. 0.3 초 ​​후)

내 질문은 : TextureAtlas는 호출 될 때 모든 페이지 이미지를로드하므로로드 된 후 실행에 영향을 미치는 이유는 무엇입니까? 아니면 적어도 정상적으로 그리기가 언제 실행되는지를 알 수 있습니까?

답변 해 주셔서 감사합니다.

는 Obivously 여기에 코드입니다,하지만이 같이 간단합니다

public class App extends Game { 

    @Override 
     public void create() {  
      Gdx.app.log(this.LOG, "Creating game"); 
      fpsLogger = new FPSLogger(); 
       setScreen(new IntroScreen(this)); 

    } 
} 

IntroScreen :

public class IntroScreen implements Screen { 
    @Override 
    public void resize(
     int width, 
     int height) 
    { 
     super.resize(width, height); 
     Gdx.app.log("IntroScreen", "Resize start: "); 
     atlas = new TextureAtlas(Gdx.files.internal("image-atlases/pages-info.atlas")); 
     Gdx.app.log("IntroScreen", "Resize finished: "); 
    } 

    @Override 
    public void render(
     float delta) 
    { 
     Gdx.gl.glClearColor(0f, 0f, 0f, 1f); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

     Gdx.app.log("IntroScreen", "Delta: " + delta); 

     // stage is empty 
     stage.act(delta); 
     stage.draw(); 
    } 
} 

그리고 여기에 로그 캣에서 출력 : 어떤 도움

08-09 01:09:53.689: I/IntroScreen(9757): Resize start: 
08-09 01:09:54.004: I/IntroScreen(9757): Resize finished: 
08-09 01:09:54.009: I/IntroScreen(9757): Delta: 0.10668343 
08-09 01:09:54.009: I/IntroScreen(9757): Delta: 0.1037551 
08-09 01:09:54.024: I/IntroScreen(9757): Delta: 0.1006427 
08-09 01:09:54.039: I/IntroScreen(9757): Delta: 0.09953054 
08-09 01:09:54.054: I/IntroScreen(9757): Delta: 0.099971004 
08-09 01:09:54.074: I/IntroScreen(9757): Delta: 0.009933725 
08-09 01:09:54.089: I/IntroScreen(9757): Delta: 0.012701442 
08-09 01:09:54.104: I/IntroScreen(9757): Delta: 0.015878525 
08-09 01:09:54.124: I/IntroScreen(9757): Delta: 0.016689042 
08-09 01:09:54.144: I/IntroScreen(9757): Delta: 0.017476525 
08-09 01:09:54.159: I/IntroScreen(9757): Delta: 0.017719833 
08-09 01:09:54.174: I/IntroScreen(9757): Delta: 0.017750284 
08-09 01:09:54.189: I/IntroScreen(9757): Delta: 0.017803017 
... 

감사합니다.

+1

왜 모든 크기를 다시로드합니까? 또한 자산 관리자 – Lestat

+1

을 사용해야합니다. 동의합니다. libgdx assetmanager를 조사해야합니다. – Jyro117

+0

답장을 보내 주셔서 감사합니다. 비동기 적으로 무언가를로드하고 싶지 않기 때문에 assetmanager가 필요하지 않습니다. 새로운 TextureAtlas는 완전히로드 될 때까지 프로그램을 멈출 것입니다 -로드 스크린 (필자는 필요하지 않음)이 없으므로 나에게 좋습니다. 이미 "nEx Software"의 답변으로이 문제를 해결했습니다. 어쩌면 내 문제를 더 잘 이해할 수있는 의견을 제시 할 수 있습니다. 이제 해결되었습니다 :). 어쨌든 고마워. – Jozef

답변

5

Android의 경우 델타 시간은 마지막 5 프레임에 걸쳐 평균화됩니다. TextureAtlas (또는 다른 애셋)을로드하는 과정에서 프레임이 오래 걸리면 (그럴 가능성이 있으므로) 다음 5 개 정도의 프레임에 대해 더 높은 델타 시간이 표시됩니다. 평활화 된 델타를 원한다면 getRawDeltaTime을 시도해보십시오. 물론 render 메소드에 전달 된 델타 시간을 무시하고 렌더링 메소드 시작시 Gdx.graphics.getRawDeltaTime()에서 원시 델타를 가져와야합니다.

+1

당신은 정말로 생명의 은인입니다. 당신은 문제가 실제 델타 (RawDeltaTime)가 0.01이지만 smoothed 델타 시간이 0.2이고 stage.act (delta)를 호출 할 때 - 그것은 매끄러운 델타 시간이었고 5 프레임이 0.05-0.1 초를 통과 한 후에 발생했습니다. , 그러나 무대는 5 * 0.2 = 1 초처럼 행동했습니다! 이제 그 문제를 이해합니다. 나는 나 자신에 그것을 생각할 것이라고 생각하지 않는다. 정말 고마워! – Jozef

관련 문제