小试DirectX游戏CPU优化
来源:互联网 发布:淘宝上卖高仿的处罚 编辑:程序博客网 时间:2024/05/19 19:56
效果:优化前 10-15%左右 优化后 0%-2% 观察没超过3
[ 破解过程 ]-----------------------------------------
看到论坛上有人在问D3D游戏CPU占用问题,自己晚上抽空学习了一下
典型的D3D程序渲染过程如下
//-----------------------------------------------------------------------------
// Desc: 渲染图形
//-----------------------------------------------------------------------------
VOID Render()
{
//清空后台缓冲区
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 );
//开始在后台缓冲区绘制图形
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
//设置世界矩阵
SetupWorldMatrice();
//在后台缓冲区绘制图形
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2*50-2 );
//结束在后台缓冲区渲染图形
g_pd3dDevice->EndScene();
}
//将在后台缓冲区绘制的图形提交到前台缓冲区显示
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
研究后发现
SetStreamSource
EndScene
此二函数消耗CPU较多 做法也很简单 直接 NOP 不掉这俩函数 不让调就行了
比较极端,这样子的坏处就是游戏界面显示不了了..见附图
具体分析过程
先断 D3D.Present 然后
SHIFT+F9向上找(这个过程比较漫长,我的方法比较笨,一层一层的试,把每一层调用NOP掉,找这样子的
层,NOP掉后黑屏,并且不掉线,并且越上层越好,因为越上层NOP 那么省掉的运算就越少,效果也越好..)
我定位出来是在这个一层
0079751E E8 AD2DFBFF call 0074A2D0
这里是 SetStreamSource 已经被我NOP掉了
00797523 90 nop
00797524 90 nop
00797525 90 nop
00797526 90 nop
00797527 90 nop
00797528 8BF8 mov edi, eax
0079752A 33F6 xor esi, esi
0079752C 85FF test edi, edi
0079752E 74 10 je short 00797540
00797530 E8 7B4B2200 call 009BC0B0
00797535 . 6A 01 push 1
00797537 . 8BC8 mov ecx, eax
00797539 . E8 32412C00 call 00A5B670
0079753E . 8BF0 mov esi, eax
00797540 > E8 6B502200 call 009BC5B0
00797545 . 8BC8 mov ecx, eax
00797547 . E8 74512200 call 009BC6C0
0079754C . 57 push edi
这里应该是 EndScene 也已经被NOP掉
0079754D 90 nop
0079754E 90 nop
0079754F 90 nop
00797550 90 nop
00797551 90 nop
00797552 . 83C4 04 add esp, 4
00797555 . E8 56502200 call 009BC5B0
0079755A . 8BC8 mov ecx, eax
0079755C . E8 2F522200 call 009BC790
00797561 . 85F6 test esi, esi
00797563 . C705 A86AC400 >mov dword ptr [C46AA8], 0
0079756D . 74 2A je short 00797599
0079756F . E8 3C4B2200 call 009BC0B0
00797574 . 6A 01 push 1
00797576 . 8BC8 mov ecx, eax
00797578 . E8 A34C2200 call 009BC220
0079757D . E8 2E4B2200 call 009BC0B0
00797582 . 6A F4 push -0C
00797584 . 6A 01 push 1
00797586 . 68 00006040 push 40600000
0079758B . 6A 00 push 0
0079758D . 68 00008040 push 40800000
00797592 . 8BC8 mov ecx, eax
00797594 . E8 474D2200 call 009BC2E0
00797599 85FF test edi, edi
0079759B ^ 0F84 8BE4FFFF je 00795A2C
007975A1 C645 FC 1F mov byte ptr [ebp-4], 1F
007975A5 . E8 86001100 call 008A7630
007975AA . 8B10 mov edx, dword ptr [eax]
007975AC . 8BC8 mov ecx, eax
007975AE . FF92 18010000 call dword ptr [edx+118]
007975B4 . 85C0 test eax, eax
007975B6 . 74 0F je short 007975C7
007975B8 . E8 636EF9FF call 0072E420
007975BD . 8B10 mov edx, dword ptr [eax]
007975BF . 8BC8 mov ecx, eax
007975C1 . FF92 9C000000 call dword ptr [edx+9C]
007975C7 > E8 A4222200 call 009B9870
007975CC . 8BC8 mov ecx, eax
007975CE . E8 AD242200 call 009B9A80
007975D3 . E8 C85E2200 call 009BD4A0
007975D8 . 8B10 mov edx, dword ptr [eax]
007975DA . 8BC8 mov ecx, eax
007975DC . FF52 40 call dword ptr [edx+40]
007975DF . B9 50EFC700 mov ecx, 00C7EF50
007975E4 . E8 E7621700 call 0090D8D0
007975E9 . E8 42001100 call 008A7630
007975EE . 8B10 mov edx, dword ptr [eax]
007975F0 . 8BC8 mov ecx, eax
看起来很简单 实际上真正动手做的时候还是有点麻烦,需要耐心
- 小试DirectX游戏CPU优化
- FLASH游戏开发CPU优化11条
- unity游戏性能优化之cpu优化第一节
- DirectX游戏开发入门
- Delphi+DirectX游戏编程
- DirectX游戏编程基础教程
- DirectX 游戏编程系列
- DirectX 游戏开发
- Delphi+DirectX游戏编程
- 08 通过比较操作符实现代码优化-DirectX游戏开发初级教程
- DirectX 优化声音特性
- DirectX 性能优化
- DirectX 性能优化
- DirectX 性能优化
- DirectX 性能优化
- 对 IO 和 CPU 使用率 的一次小优化
- 对 IO 和 CPU 使用率 的一次小优化
- cpu 优化
- Android动态加载(下)——加载已安装APK中的类和资源
- TreeView控件中拖拽事件与鼠标事件的坐标问题(MouseEventArgs 和 DragEventArgs 坐标问题)
- ListView下拉刷新数据功能篇一
- hdu 1196 Lowest Bit
- GO 语言 读写文件
- 小试DirectX游戏CPU优化
- uva 10404 - Bachet's Game
- 网络下载器
- 无法显示进程。没有正确安装调试器。请运行安装程序安装或修复调试器。
- Spring Batch任务的异步执行
- 关于hibernate中报Duplicate class/entity mapping org.model.User错的问题
- 通过flash builder查看由MXML文件所翻译的actionscript
- couldn't connect to server 127.0.0.1:27017 src/mongo/
- ListView下拉刷新数据功能篇二