小试DirectX游戏CPU优化
效果:优化前 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优化相关推荐
- Unity移动端游戏性能优化简谱之 以引擎模块为划分的CPU耗时调优
<Unity移动端游戏性能优化简谱>从Unity移动端游戏优化的一些基础讨论出发,例举和分析了近几年基于Unity开发的移动端游戏项目中最为常见的部分性能问题,并展示了如何使用UWA的性能 ...
- 游戏开发43课 移动游戏性能优化1
1. 前言 很多年前就想将这些年工作中积累的优化经验撰写成文章,但懒癌缠身,迟迟未动手,近期总算潜下心写成文章. 涉及到具体优化技巧时,博主会尽量阐述原理和依据,让读者知其然也知其所以然.要完全读懂这 ...
- 移动游戏性能优化建议与字体剥离精简工具
/ 在 Unity 中制作游戏时对动态字体的剥离和精简是现在常用的手段,现在有两篇博客是大家阅读和参照较多的,分别是 如何精简Unity中使用的字体文件 和 FontPruner 字体精简工具.他们各 ...
- 移动游戏性能优化通用技法
1. 前言 很多年前就想将这些年工作中积累的优化经验撰写成文章,但懒癌缠身,迟迟未动手,近期总算潜下心写成文章. 涉及到具体优化技巧时,我会尽量阐述原理和依据,让读者知其然也知其所以然. 要完全读懂这 ...
- 游戏性能优化技术干货分享——内存管理
项目的性能优化主要围绕CPU.GPU和内存三大方面进行.接上期CPU优化专讲,我们本期和大家分享内存方面的优化心得. 无论是游戏还是VR应用,内存管理都是其研发阶段的重中之重. 然而,在我们测评过的大 ...
- UE4制作多人大地型游戏的优化
摘自https://gameinstitute.qq.com/course/detail/10131 8月11日,由腾讯游戏学院举办的第二届腾讯游戏开发者大会(TGDC)在深圳举行.大会技术论坛中,E ...
- 极光会客厅:大型H5游戏如何登陆微信小游戏及游戏性能优化分享
上周末,由极光网络主办的首期"极光会客厅"正式开门迎客.在本次的"2D小游戏开发实战技术沙龙"上,极光网络客户端主程陈策以及极光网络项目总监陈源向一众与会者分享 ...
- unity 转微信小游戏 资源优化
资源优化 可通过转换工具配套提供的资源优化工具,将游戏内纹理资源针对webgl导出做优化. 工具入口 菜单栏-微信小游戏-资源优化工具 工具介绍 Texture 区域1: 选中目录,以设定规则扫描目录 ...
- LayaBox H5游戏性能优化
对于游戏开发避免不了性能相关优化,小编总结了如下: 一.内存优化(如:代码不规范,初始化定义的变量,销毁时未及时清理会存在内存中) 1.对象池优化,LayaAir引擎中的对象池:laya.utils. ...
最新文章
- npm获取配置,设置代理
- jQuery选择器和选取方法 http://www.cnblogs.com/MaxIE/p/4078869.html
- 并行算法 Parallel Algorithm -- 提高执行效率
- node 获取mysql数据类型,node连接mysql获取数据
- bzoj 1654: [Usaco2006 Jan]The Cow Prom 奶牛舞会 -- Tarjan
- IMP-00009:异常结束导出文件解决方案
- (26)System Verilog范围随机函数约束类内变量
- cuBLAS矩阵乘法性能分析(附代码示例)
- 深入理解事件(event)与委托(delegate)
- 对接微信支付服务商后商户能得到哪些服务?
- 微信小程序双击底部导航栏刷新页面
- Base16,Base32,Base64编码的介绍
- mysql date的写法_mysql 对日期的写法 mybatis
- 卡尔曼滤波/粒子滤波融合定位模拟器
- 怎么给图片添加水印?教你一个图片加水印小妙招
- 傅里叶变换音频可视化_音频可视化中的信号处理方案
- Idea生成英文JavaDoc以及中文编码问题
- linux右键没有创建新文件夹,将新建文档添加回Ubuntu 18.04中的右键菜单
- ROS系统与开源社区介绍
- 手把手教你设计一个通用BootLoader