1.主体思路
在游戏创建中,GameTimer用于计算两个动画帧之间的资源消耗,由于不同机器的CPU的频率(f)不同,即时间周期(T)不同,它们之间计算资源消耗的基本单位数值不同,所以需要获取当前机器处理器的频率,在记录两帧之间的时间间隔Δt后,再计算两帧之间时间周期的消耗ΔT。
T = 2 GHz //当前机器的时钟周期
Δt = CurrentTime - PreviousTime // 当前t帧的Time - 上一帧t-1帧的Time
ΔT = T*Δt
而如何获取CPU的时钟周期和计时?即通过QueryPerformanceFrequency和QueryPerformanceCounter方法,它们正是构成GameTimer的主要部分。
2.使用场景
Windows DirectX的文档对计时器的使用如下所示:
BeginScene();
...
// Start profiling
LARGE_INTEGER start, stop, freq;
QueryPerformanceCounter(&start); //获取t-1帧的counter
SetTexture(...);
DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);//绘制动画 t-1帧->t帧
QueryPerformanceCounter(&stop); //获取t帧的counter
stop.QuadPart -= start.QuadPart;
QueryPerformanceFrequency(&freq); //获取当前CPU的频率f,与时间周期的关系:T=1/f
// Stop profiling
...
EndScene();
Present();
在Direct3D12的游戏开发中,GameTimer用于在异步消息循环队列中调用,计算上一帧与当前帧的时间周期T的消耗,以此来更新游戏动画场景。如下所示:
int D3DApp::Run()
{
MSG msg = {
0};
mTimer.Reset(); //初始化GameTimer计数器
while(msg.message != WM_QUIT)
{
// If there are Window messages then process them.
if