小试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
 
 
看起来很简单 实际上真正动手做的时候还是有点麻烦,需要耐心

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 喜欢我的人太多怎么办 假如战争今夜打响我们该怎么办 约客户客户说忙怎么办 第一天来姨妈痛怎么办 痛经痛的很厉害怎么办 工作第一天被辞怎么办 第一天练车紧张怎么办 到新公司第一天怎么办 我妈上班别人欺负怎么办 欺负别人他妈来找了怎么办 家人都欺负我妈怎么办 人老了日不动了怎么办? 日照职业技术学院公租房怎么办留宿 眼镜上沾了胶水怎么办 近视镜片刮花了怎么办 墨镜镜片磨花了怎么办 邻居养狗味道大怎么办 邻居不让养狗了怎么办 养狗地板有味道怎么办 狗狗嘴巴被大狗咬肿了怎么办 花了钱心里难受怎么办 狗在屋里有味道怎么办 养狗家里有异味怎么办 养狗房子有味道怎么办 狗身上有腥臭味怎么办 狗狗不想养了怎么办 药流2天后没出血怎么办 药流当天血多怎么办 怀孕四十天不想要怎么办 人流后出血量大怎么办 药流一直不出血怎么办 药流一直不见红怎么办 药流12天还流血怎么办? 把别人车刮了怎么办 车划掉漆了怎么办啊 倒车时碰了车怎么办 车头掉了一点漆怎么办 新买的车被刮了怎么办 白色车车头漆掉了一小块怎么办 临时牌照丢了1张怎么办 临牌遗失了一张怎么办