|
|

楼主 |
发表于 2007-3-23 10:42:00
|
显示全部楼层
Re:我用D3D写的三维游戏,画面挺卡,但CPU占用率不到20%,
这是WinMain()函数的大况,看一下就会发现每次消息循环的时候CPU的工作并不大,就是赋一下值什么的,渲染的工作都是通过调用Render()来完成的,而Render()中会调用D3D的API来渲染的。
int APIENTRY WinMain(HINSTANCE hInstance,//传入的窗口句柄
HINSTANCE hPrevInstance,//已存在的窗口句柄
LPSTR lpCmdLine,//传入的命令行参数
int nCmdShow/*显示方式*/)
{
init_flag=0;
MSG msg;//消息结构体
if(!hPrevInstance)
{
RegWndClass(hInstance);
}
if(!InitWnd(hInstance,nCmdShow))
{
return FALSE;
}
Missile_oldtime=Bullet_oldtime=0;
//将实例句柄和窗口句柄赋予对应的输入处理变量
/////////////////////////////调用与初始化d3d有关的函数/////////////////////////////////////
//将敌机开火标志清0
for(int i=0;i<6;i++)
e_shoot[6]=0;
stup_bgtime=timeGetTime();
InitKeyboard();
InitD3D();//初始化设备与场境
InitGeometry();//载入各个模型,并对其进行参数属性设置
......
......
///////////////////////////////////消息循环////////////////////////////////////////
ZeroMemory(&msg,sizeof(msg));
//在使用msg之前一定要用ZeroMemory将其清0否则出错
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
//用D3D输入设备来处理键盘输入
if(IsKeyPressed(DIK_W))
{
m_nRotateX+=0.5;
}
if(IsKeyPressed(DIK_S))
{
m_nRotateX-=0.5;
}
if(IsKeyPressed(DIK_A))
{
m_nRotateZ+=3;
}
......
......
//渲染游戏场景
if(game_step==0||game_step==2||game_step==3)
Render_0();
if(game_step==106)//过场动画106
{
Render_106();
if(timeGetTime()-game_bg>10000)
{
game_step=0;//退出到菜单
//清理内存
pVF1->Cleanup();
pABus->Cleanup();
sky->Cleanup();
land->Cleanup();
for(int i=0;i<6;i++)
pMle->Cleanup();
for(int i=0;i<2;i++)
pEExpS->Cleanup();
InitGeometry();
Sound_BGM->Stop();
Sound_Plane.Stop();
sd_bg_bgm-> lay(1);
}
}
if(game_step==1)
Render();
if(game_step==-1)
Render__1();
}
}
//此处添加释放D3D设备和资源的代码
Cleanup();
//释放与输入有关的设备
ReleaseCOMObject();
//结束释放
UnregisterClass(g_szWndClass,g_wcex.hInstance);
return msg.wParam;
} |
|