2012-03-22 3 views
0

나는 다음 타이머 클래스있다 :타이머 클래스의 속도 요소 설정?

//Create a timer and lock at 60fps 
Timer timer(60.0f); 

while() 
{ 
    float delta; 
    float velocity = 4.0f; 

    timer.Update(); 

    delta = timer.GetDelta(); 

    sprite.SetPosition(sprite.GetVector() + Vector2(0.0,velocity * delta)); 
    sprite.Draw(); 
} 

을하지만 큰 문제가있다 : 그리고 나는이처럼

class Timer 
{ 
    private: 
    unsigned int curr,prev; 
    float factor; 
    float delta; 

    public: 
    Timer(float FrameLockFactor) 
    { 
     factor = FrameLockFactor; 
    } 

    ~Timer() 
    { 

    } 

    void Update() 
    { 
     curr = SDL_GetTicks(); 
     delta = (curr - prev) * (1000.f/factor); 
     prev = curr; 
    } 

    float GetDelta() 
    { 
     return delta; 
    } 
}; 

를 사용하여 내 게임에 예상되는 프로그램에 대한 너무 느리게 실행 초당 60 프레임으로 실행되며 프레임 독립적 인 동작을 사용하지 않을 때 동일한 테스트 코드가 원활하게 실행되므로 코드에 문제가있을 수 있습니다.

어떤 도움이 필요합니까?

답변

1

, 그것은

delta = (curr - prev) * (factor/1000.f); 
+0

감사합니다. 몇 가지 연구를 한 후에 프레임 독립적 인 게임에서 고정 된 프레임 속도를 갖는 것이 실제로 더 나은 것으로 나타났습니다. – user1010005

0

코드로 무엇을 하려는지 실제로 알 수 없습니다. 특히 줄 delta = (curr - prev) * (1000.f/factor);은 내가 볼 수있는 한 이해가 가지 않습니다.

정확하게 이해하면 마지막 업데이트 이후 경과 한 시간을 계산하고 이것을 프레임 당 밀리 초로 변환하려고합니다. 어떤 단위를 사용하고 있습니까?

나는 무엇이 SDL_GetTicks();에 의해 반환되는지 모른다. 이것은 반환되는 프로세서 또는 실제 시계 틱의 수입니까? 실제 클럭 틱을 반환하는 경우 (curr-prev) 부분은 프레임 당 여러 번 업데이트해야하므로 대부분 0이됩니다.

실제 시계가 돌아 오지 않는 경우 왜 1000f을 곱한 것입니까? 이 요인은 어디서 비롯된 것입니까?

이와 같은 코드를 사용하면 반올림 오류를 처리하는 것이 매우 중요하므로 문제가이 영역의 어딘가에 있다고 추측합니다. 추가 정보가 없어도 액츄얼 문제가 무엇인지 알 수는 없습니다. delta은 프레임 수 있어야 할 경우

+0

임 공식을 이용하여 프레임 indepented 이동을 달성하기 위해서 보정 값과 모든 속도를 곱으로 계산되지 않아야 (currTicks -PrevTicks)/1000.0f. 하지만 이제는 가변 인수, 즉 60fps로 프레임을 제한 할 수 있기를 원합니다. – user1010005