2014-01-19 5 views
0

여기 멍청한 놈. SFML을 사용하여 C++에서 기본 Pong 복제 게임을 만들고 있지만 다른 컴퓨터에서 .exe를 실행하면 프로그램이 (다른 대부분의 PC에서는) 느리게 실행됩니다. 내가 전에 자바를 사용하고 초당 업데이트의 양을 조절하기 위해이 방법을 사용했습니다 :다른 컴퓨터에서 동일한 속도로 프로그램을 실행하는 방법은 무엇입니까?

long lastTime = System.nanoTime(); 
    final double ns = 1000000000.0/60.0; 
    double delta = 0; 

    while(running) 
     { 
      long now = System.nanoTime(); 
      delta += (now - lastTime)/ns; 
      lastTime = now; 
      while(delta >= 1) 
       { 
        update(); 
        delta--; 
       } 
     render(); 
     }        
    } 
내가 이것을 사용하여 계획되었다

을하지만, C 자바의 System.nanoTime() 메소드와 같은 아무것도 않습니다 ++? 다른 컴퓨터에서 동일한 속도로 내 프로그램이 실행되거나 (또는 ​​적어도 실행되는 것으로 보이는) 다른 방법은 있습니까? WD3010

+0

당신을위한 독서물 : [deWiTTERS Game Loop] (http://www.koonsolo.com/news/dewitters-gameloop/). 기타 : ['] (http://en.cppreference.com/w/cpp/header/chrono). –

+0

[SFML에는 시간 처리 기능이 있습니다 ...] (http://www.sfml-dev.org/tutorials/2.0/system-time.php) – Borgleader

+0

@JosephMansfield 한 주석에 어떻게 두 개의 링크를 게시 했습니까? – Gasim

답변

1

Windows의 경우 timeGetTime 또는 QueryPerformanceCounter을 시도 할 수 있습니다. 전자는 약간 정확하지는 않지만 훨씬 쉽게 소화 할 수 있습니다.

Windows가 아닌 사용자의 경우 clock 또는 time을 사용할 수 있습니다. 저 밖에서도 많은 사람들이 있습니다.

+1

또는 ... SFML의 시간 유틸리티 또는 ""의 더 정상적인 접근 방식 ... – Rapptz

1

당신은 시간의 함수이다하거나 이미, 당신이 직접 기능을 사용할 수 있습니다 SFML을 사용하고 있기 때문에 모두와 C++ (11) <chrono> 헤더를 사용 할 수 있습니다. 가능한 경우 sleep()을 사용하여 CPU 사용을 줄이는 window.setFramerateLimit(uint)이 있지만 sleep()은 항상 부정확합니다. 그런 다음 VSync를 비활성화 (비활성화) 할 window.setVerticalSyncEnabeled(bool)이 있습니다. 그것은 가장 가능성이있는 방법이지만, VSync가 드라이버에 의해 강제로 해제 될 수 있다는 것을 명심하십시오.

시간을 기록하려면 sf::Timesf::Clock을 사용할 수 있습니다. sf::Time은 특정 시간 범위를 보유하고 있으며 수 초, 밀리 초 및 마이크로 초로 쉽게 변환 될 수있는 컨테이너입니다. sf::Clock은 다시 시작할 수만 있습니다. 시계를 중지 할 수는 없으며 (시계 기능이 필요한 경우 here 참조) 시계가 마지막으로 재설정 되었기 때문에 sf::Time 개체로 전달 된 시간을 검색 할 수 있습니다.

SFML tutorialsdocumentation을 잊지 말고 SFML에 대해 알고 싶은 모든 것을 포함해야합니다.

btw. 나노초로 작업하는 것이 무엇보다 환상이며, 정확하지 않으며 게임에 그렇게 작은 해상도가 필요한 경우 게임 논리에 최적화가 필요할 수 있습니다.

관련 문제