2012-04-18 2 views
0

저는 Libgdx로 작은 게임을 쓰고 있습니다.렌더링/동기화 스레드 동기화

모든 개체에 render()을 계속 호출하는 [렌더링] 스레드와 모든 개체에 update(double delta)을 계속 호출하는 업데이트 스레드가 있습니다.

업데이트 스레드가 빠르게 반복됩니다. 일부 종류의 동기화를 사용하여 업데이트 스레드가 약간의 휴식을 취해야합니까? 혜택이 있습니까?

업데이트

public void run() { 
    while(true){ 
     nano = System.nanoTime(); 
     long delta = nano - timestamp; 
     timestamp = nano; 
     accumulator+=(double)delta/BILION; 
     while(accumulator >= step){ 
      update(step); 
      accumulator-=step; 
     } 
     long loc = (long) ((step -accumulator)*1000)+1; 
     try { 
      Thread.sleep(loc); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

나는 그것의 경우 문제를 잘 모릅니다,하지만 내 현재 업데이트는 2500-20000 FPS입니다. 따라서 업데이트 속도가 충분합니다.

답변

0

데이터 업데이트 및 렌더링은 독립적이어야하며 synchronized이 아니어야합니다.

업데이트 기능은 사용자에게 가장 사용자 친화적 인 속도로 작동해야합니다.

렌더링 속도는 최종 사용자가 사용하는 하드웨어로 인해 변경 될 수 있으므로 렌더링과는 독립적이어야합니다. 예를 들어, 마지막 세대의 타블렛에서 "괴물"이 10 배 더 빠르게 걷는 것을 원하지 않으므로 재생할 수 없게됩니다.

업데이트 속도를 원하는 상수로 설정해야합니다. 그러면 프레임 속도가 너무 느리면 업데이트 속도가 조금 느려지 길 원할 것입니다.

그건 내 의견으로는 도움이 될 것입니다.

+0

"가장 사용자 친화적 인 업데이트 속도"는 무엇을 의미합니까? 내 업데이트는 최소 단계 이상으로 빠르게 실행됩니다. 주어진 델타로 woks를 업데이트하십시오, 그래서 괴물 속도는 동일 할 것입니까? – jellyfication

1

업데이트 논리를 위해 별도의 스레드를 사용하지 마십시오. 이유가 없습니다.

업데이트 방법을 초당 5000 번 실행하지만 렌더링이 60 분으로 끝나는 이유는 무엇입니까? 그것은 엄청난 자원 낭비입니다.

렌더 메소드의 첫 번째 행은 update 메소드라고해야합니다.

시간 차이를 확인하려면 Gdx.graphics.getDeltaTime()을 사용하십시오. Math.max(1/30f, Gdx.graphics.getDeltaTime()으로 부드럽지만 느린 업데이트를 위해 오래되거나 둔한 휴대 전화의 갑작스런 병약을 트레이드 오프 할 수 있습니다. 30fps의 최소 업데이트 시간이 필요합니다.