我使用
感谢 Eduard Wirch 和 Ben Voigt 的帮助,我们修复了计时器的问题(尽管这并未解决初始问题)。
所有方法的工作方式基本相同,固定时间步长看起来更好,但不能完全依赖帧率,也无法完全解决问题(仍然偶尔会出现跳跃(卡顿)现象)。
到目前为止,禁用AERO透明玻璃或切换到全屏模式是唯一显著的积极变化。
我正在使用NVIDIA最新驱动程序GeForce 332.21 Driver和Windows 7 x64 Ultimate。
ID3DXSprite
在 Direct3D9
中创建了简单、独立于帧率、可变时间步长、线性移动。大多数用户可能无法注意到它,但在某些电脑上(包括我的电脑)经常发生卡顿。
开启或关闭
VSync
均会出现卡顿。我发现在
OpenGL
渲染器中也有同样的问题。这不是浮点数问题。
似乎问题只存在于
AERO Transparent Glass
窗口模式中(全屏、无边框全屏或禁用 Aero 时问题可以得到缓解),当窗口失去焦点时问题更加严重。
编辑:
即使发生卡顿,帧间隔时间也不会超出 16 到 17 毫秒。
看起来我的帧间隔时间测量日志代码有问题。我现在已经修复了它。
- 通常情况下,开启 VSync 后一帧渲染需要 17 毫秒,但有时候(可能是在发生卡顿时)会跳到 25-30 毫秒。
(我只在应用程序退出时记录日志,不会影响性能)
device->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, 255, 255, 255), 0, 0);
device->BeginScene();
sprite->Begin(D3DXSPRITE_ALPHABLEND);
QueryPerformanceCounter(&counter);
float time = counter.QuadPart / (float) frequency.QuadPart;
float deltaTime = time - currentTime;
currentTime = time;
position.x += velocity * deltaTime;
if (position.x > 640)
velocity = -250;
else if (position.x < 0)
velocity = 250;
position.x = (int) position.x;
sprite->Draw(texture, 0, 0, &position, D3DCOLOR_ARGB(255, 255, 255, 255));
sprite->End();
device->EndScene();
device->Present(0, 0, 0, 0);
感谢 Eduard Wirch 和 Ben Voigt 的帮助,我们修复了计时器的问题(尽管这并未解决初始问题)。
float time()
{
static LARGE_INTEGER start = {0};
static LARGE_INTEGER frequency;
if (start.QuadPart == 0)
{
QueryPerformanceFrequency(&frequency);
QueryPerformanceCounter(&start);
}
LARGE_INTEGER counter;
QueryPerformanceCounter(&counter);
return (float) ((counter.QuadPart - start.QuadPart) / (double) frequency.QuadPart);
}
编辑 #2:
到目前为止,我尝试了三种更新方法:
1) 变量时间步长
x += velocity * deltaTime;
2) 固定时间步长
x += 4;
3) 固定时间步长+插值
accumulator += deltaTime;
float updateTime = 0.001f;
while (accumulator > updateTime)
{
previousX = x;
x += velocity * updateTime;
accumulator -= updateTime;
}
float alpha = accumulator / updateTime;
float interpolatedX = x * alpha + previousX * (1 - alpha);
所有方法的工作方式基本相同,固定时间步长看起来更好,但不能完全依赖帧率,也无法完全解决问题(仍然偶尔会出现跳跃(卡顿)现象)。
到目前为止,禁用AERO透明玻璃或切换到全屏模式是唯一显著的积极变化。
我正在使用NVIDIA最新驱动程序GeForce 332.21 Driver和Windows 7 x64 Ultimate。