我尝试过不同的机器,开启和关闭VSync。
我提供了我的主要方法和显示方法。在主要外观中,我使用GLFWs GetTime方法计算delta。
如果我明确设置deltaTime = 0.016来锁定目标速度,则三角形会平滑移动。
int main(int argc, char** argv)
{
/*
INIT AND OTHER STUFF SNIPPED OUT
*/
double currentFrame = glfwGetTime();
double lastFrame = currentFrame;
double deltaTime;
double a=0;
double speed = 0.6;
//Main loop
while(true)
{
a++;
currentFrame = glfwGetTime();
deltaTime = currentFrame - lastFrame;
lastFrame = currentFrame;
/** I know that delta time is around 0.016 at my framerate **/
//deltaTime = 0.016;
x = sin( a * deltaTime * speed ) * 0.8f;
y = cos( a * deltaTime * speed ) * 0.8f;
display();
if(glfwGetKey(GLFW_KEY_ESC) || !glfwGetWindowParam(GLFW_OPENED))
break;
}
glfwTerminate();
return 0;
}
void display()
{
glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(playerProgram);
glUniform3f(playerLocationUniform,x,y,z);
glBindBuffer(GL_ARRAY_BUFFER, playerVertexBufferObject);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glUseProgram(0);
glfwSwapBuffers();
}
答案 0 :(得分:4)
您正在使用deltaTime
,就像它是全局帧速率一样,并根据帧数(a
)乘以该速率计算正弦和余弦。这意味着帧之间deltaTime
的轻微波动会导致位置发生较大变化,因为a
会变大。
在另一种情况下,在设置常量deltaTime
的情况下,当在错误的时间渲染帧时,仍然会出现小毛刺。
你真正需要做的是:
#define TAU (M_PI * 2.0)
currentFrame = glfwGetTime();
deltaTime = currentFrame - lastFrame;
lastFrame = currentFrame;
a += deltaTime * speed;
// Optional, keep the cycle bounded to reduce precision errors
// if you plan to leave this running for a long time...
if( a > TAU ) a -= TAU;
x = sin( a ) * 0.8f;
y = cos( a ) * 0.8f;