나는 자연스러운 속도로 재생하려는 200Hz에서 샘플링 한 데이터를 이미 읽었습니다. 나는. 샘플링 된 데이터의 1 초는 1 초 동안 렌더링되어야한다.
첫 번째 : 렌더링 조정을 위해 타이머를 사용하지 마십시오. 제대로 작동하지 않을 수 있습니다. 대신 전체 렌더링주기 (v-sync 포함)가 소요되는 시간을 측정하고이를 통해 애니메이션 시간 카운터를 향상시켜야합니다. 이제 200Hz는 이미 아주 좋은 시간 분해능입니다. 따라서 데이터가 충분히 부드러 우면 전혀 보간 할 필요가 없습니다. 이와 같이 (의사 코드) :
objects[] # the objects, animated by the animation
animation[] # steps of the animation, sampled at 200Hz
ANIMATION_RATE = 1./200. # Of course this shouldn't be hardcoded,
# but loaded with the animation data
animationStep = 0
timeLastFrame = None
drawGL():
timeNow = now() # time in seconds with (at least) ms-accuracy
if timeLastFrame:
stepTime = timeNow - timeLastFrame
else:
stepTime = 0
animationStep = round(animationStep + stepTime * ANIMATION_RATE)
drawObjects(objects, animation[animationStep])
timeLastFrame = timeNow
렌더링이 화면 새로 고침 사이의 시간보다 훨씬 빠르다는 것입니다. 이 경우 중간 단계의 일부를 렌더링하여 모션 블러 효과를 얻을 수도 있습니다 (애니메이션 데이터를 사용하여 모션 벡터를 얻고 쉐이더에서 벡터 흐림 효과를 만들 수 있음)), 렌더 루프는 다음과 같이 보일 것입니다 :
drawGL():
timeNow = now() # time in seconds with (at least) ms-accuracy
if timeLastFrame:
stepTime = timeNow - timeLastFrame
else:
stepTime = 0
timeRenderStart = now()
animationStep = round(animationStep + stepTime * ANIMATION_RATE)
drawObjects(objects, animation[animationStep])
glFinish() # don't call SwapBuffers
timeRender = now() - timeRenderStart
setup_GL_for_motion_blur()
intermediates = floor(stepTime/timeRender) - 1 # subtract one to get some margin
backstep = ANIMATION_RATE * (stepTime/intermediates)
if intermediates > 0:
for i in 0 to intermediates:
drawObjects(objects, animation[animationStep - i * backstep])
timeLastFrame = timeNow
실제로는 거의 200fps로 표시 할 수 없습니다. 대부분의 LCD는 현재 60hz로 표시됩니다. 애니메이션 데이터를 60fps로 샘플링 한 다음 거기에서부터 시작하십시오. – Olhovsky