主题:为什么是在20毫秒以后才能进行下一次的处理,不是小于20毫秒就直接返回了吗?
将一个物体沿Z轴进行移动,了为防止物体移动过快或过慢,程序中使用了定时控制,这样在不同的机器上可以得到大差不多的移动速度.
使用一个全局变量来保存WINDOWS启动后毫秒数,在进入渲染处理函数时,调用GetTickCount()函数获取当前的毫秒数。在进行转换和渲染操作以后,使用一个循环进行等待。
while((GetTickCount() - g_Time) < 20)
return;
即在20毫秒以后才能进行下一次的处理。通过这种定时方式,可以保证程序每一帧的处理时间在任何机器上都相同,除非机器慢得处理一次转换和渲染的时间大于等待的时间。
为什么是在20毫秒以后才能进行下一次的处理,不是小于20毫秒就直接返回了吗?
VOID RenderSene()
{
//检查Direct3D设备是否已经创建,如果没有创建就直接返回
if( NULL == g_pMyd3dDevice )
return;
g_Time = GetTickCount();
MoveAndRota();
// 清除Direct3D设备的后台表面,背景颜色为蓝色RGB(0,0,255)
g_pMyd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,255,255), 1.0f, 0 );
// 打开3D渲染开关
g_pMyd3dDevice->BeginScene();
// 设置待渲染顶点的来源
g_pMyd3dDevice->SetStreamSource( 0, g_pMyVxBuffer, sizeof(CUSTOMVERTEX) );
// 进行3D渲染,在这里设置渲染的顶点格式,并调用DrawPrimitive完成顶点渲染处理
g_pMyd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX );
g_pMyd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
// 关闭3D渲染开关
g_pMyd3dDevice->EndScene();
// 展现后台表面到窗口的客户区域中,即把渲染后的图像显示到窗口中
g_pMyd3dDevice->Present( NULL, NULL, NULL, NULL );
while((GetTickCount() - g_Time) < 20)
return;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// 定义一个Windows类,指定消息的处理函数为MsgProc
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
MY_WINCLASS_NAME, NULL };
// 注册这个窗口类
RegisterClassEx( &wc );
// 创建应用程序窗口
HWND hWnd = CreateWindow( MY_WINCLASS_NAME, "3D游戏编程——世界坐标系转换",
WS_OVERLAPPEDWINDOW, 100, 100, 400, 300,
GetDesktopWindow(), NULL, wc.hInstance, NULL );
// 调用InitMy3D函数进行3D对象和设备的创建,传入参数为窗口的句柄hWnd
if( SUCCEEDED( InitMy3D( hWnd ) ) )
{
// 显示窗口
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
// 程序主循环,进行窗口消息的分发,消息的处理在MsgProc函数中完成
MSG msg;
while( msg.message != WM_QUIT)
{
if(PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ))
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
RenderSene();
}
}
}
// 调用Cleanup函数清除3D对象和设备
Cleanup();
// 注销窗口类
UnregisterClass( MY_WINCLASS_NAME, wc.hInstance );
return 0;
}
使用一个全局变量来保存WINDOWS启动后毫秒数,在进入渲染处理函数时,调用GetTickCount()函数获取当前的毫秒数。在进行转换和渲染操作以后,使用一个循环进行等待。
while((GetTickCount() - g_Time) < 20)
return;
即在20毫秒以后才能进行下一次的处理。通过这种定时方式,可以保证程序每一帧的处理时间在任何机器上都相同,除非机器慢得处理一次转换和渲染的时间大于等待的时间。
为什么是在20毫秒以后才能进行下一次的处理,不是小于20毫秒就直接返回了吗?
VOID RenderSene()
{
//检查Direct3D设备是否已经创建,如果没有创建就直接返回
if( NULL == g_pMyd3dDevice )
return;
g_Time = GetTickCount();
MoveAndRota();
// 清除Direct3D设备的后台表面,背景颜色为蓝色RGB(0,0,255)
g_pMyd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,255,255), 1.0f, 0 );
// 打开3D渲染开关
g_pMyd3dDevice->BeginScene();
// 设置待渲染顶点的来源
g_pMyd3dDevice->SetStreamSource( 0, g_pMyVxBuffer, sizeof(CUSTOMVERTEX) );
// 进行3D渲染,在这里设置渲染的顶点格式,并调用DrawPrimitive完成顶点渲染处理
g_pMyd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX );
g_pMyd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
// 关闭3D渲染开关
g_pMyd3dDevice->EndScene();
// 展现后台表面到窗口的客户区域中,即把渲染后的图像显示到窗口中
g_pMyd3dDevice->Present( NULL, NULL, NULL, NULL );
while((GetTickCount() - g_Time) < 20)
return;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// 定义一个Windows类,指定消息的处理函数为MsgProc
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
MY_WINCLASS_NAME, NULL };
// 注册这个窗口类
RegisterClassEx( &wc );
// 创建应用程序窗口
HWND hWnd = CreateWindow( MY_WINCLASS_NAME, "3D游戏编程——世界坐标系转换",
WS_OVERLAPPEDWINDOW, 100, 100, 400, 300,
GetDesktopWindow(), NULL, wc.hInstance, NULL );
// 调用InitMy3D函数进行3D对象和设备的创建,传入参数为窗口的句柄hWnd
if( SUCCEEDED( InitMy3D( hWnd ) ) )
{
// 显示窗口
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
// 程序主循环,进行窗口消息的分发,消息的处理在MsgProc函数中完成
MSG msg;
while( msg.message != WM_QUIT)
{
if(PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ))
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
RenderSene();
}
}
}
// 调用Cleanup函数清除3D对象和设备
Cleanup();
// 注销窗口类
UnregisterClass( MY_WINCLASS_NAME, wc.hInstance );
return 0;
}