性能优化:(From D3D9 SDK)

本文提供了一系列针对Direct3D 9 (D3D9) 的性能优化建议,包括减少Clear函数调用、状态切换、光源使用及纹理管理等方面的技术细节。通过遵循这些建议,开发者可以显著提升游戏或应用程序的运行效率。

性能优化:(From D3D9 SDK)

常规技巧

1 只在必须的时候Clear。
   IDirect3DDevice9::Clear函数通常需要花费较多的时间,因此要尽量少调用,而且只清空的确需要清空的缓存。

2 尽量减少状态切换。并且将需要进行的状态切换组合在一起设置。
   状态包括RenderState,SamplerState,TextureStageState等

3 纹理尺寸尽可能小

4 从前至后渲染场景中的对象
   从前至后渲染可以尽可能早地精选出不需要绘制的对象和象素

5 使用三角条带代替三角列表和三角扇。为了能更有效利用顶点高速缓存(cache),在排列条带时因考虑尽快重用顶点。

6  根所需要据消耗的系统资源来逐步减少特效。

7 经常性地检测程序的性能。
   这样可以更容易发现引起性能突变的部分

8 最小化顶点缓存的切换

9 尽可能使用静态顶点缓存

10 对静态对象,对每种FVF使用一个大的静态顶点缓存来保存多个对象的顶点数据,而不是每个对象使用一个顶点缓存。
   其目的也是减少顶点缓存的切换

11 如果程序需要随机访问AGP内存中的顶点缓存,顶点格式的大小最好是32bytes的倍数。否则,选择合适的最小的格式。
32bytes 也就是8个float数据或2个vector4。

12 使用顶点索引方式渲染,这样可以更有效利用顶点高速缓存。

13 如果深度缓存格式中包含有模版缓存,总是将两者一起Clear。

14 将计算结果和输出的shader指令合并:
// Rather than doing a multiply and add, and then output the data with
//   two instructions:
mad r2, r1, v0, c0
mov oD0, r2

// Combine both in a single instruction, because this eliminates an 
//   additional register copy.
mad oD0, r1, v0, c0

建立一个场景对象的数据库,首先使用最低精度的模型,在保证性能的前提下逐步使用更高精度的模型。密切关注渲染的总的三角面数。

将使用相同渲染状态和贴图的图元集中在一起绘制,这样能尽量减少顶点缓存和状态的切换。并且将状态切换操作集中成一组设置。

尽量减少光源数量,使用环境光来提高亮度。方向光源比点光源和聚光灯更高效,因为光的方向是固定的。使用光照范围参数来剔除不受光照影响的物体。镜面高光几乎使光照计算量加倍,因此只在需要时使用,将D3DRS_SPECULARENABLE设为FALSE,将材质的specular power 设为0,将材质的specular color 设为0。

尽量减小纹理尺寸,这样可以增加纹理被缓存的可能性。尽量减少纹理的切换,将使用同一纹理的对象集中绘制。尽量使用正方形纹理。最快的纹理是256×256,将4张128×128的纹理拼接成256×256使用。

连接World-View Matrix, 将ViewMatrix设为Identity减少矩阵乘法运算。

动态纹理。首先要检查D3DCAPS2_DYNAMICTEXTURES来判断硬件是否支持。
其二,动态纹理不能放在MANAGED pool中。动态纹理总是能锁定,甚至是在D3DPOOL_DEFAULT中。D3DLOCK_DISCARD是合法的。
DrawProceduralTexture(pTex)
{
    // pTex should not be very small because overhead of
    //   calling driver every D3DLOCK_DISCARD will not
    //   justify the performance gain. Experimentation is encouraged.
    pTex->Lock(D3DLOCK_DISCARD);
    <Overwrite *entire* texture>
    pTex->Unlock();
    pDev->SetTexture();
    pDev->DrawPrimitive();
}

当需要在每帧里锁定顶点或索引缓存是,应该使用动态缓存(D3DUSAGE_DYNAMIC)。对动态缓存使用D3DLOCK_DISCARD锁定能减少延迟。D3DLOCK_NOOVERWRITE锁定可以用于在缓存空闲处添加新的数据而不修改已经写入的数据。

使用Effect时,应该根据Effect,然后根据Technique来安排渲染顺序,也就是使用相同Effect和Technique的物体应该集中绘制。这样可以减少状态切换开销。  
根据C:\gkoudai\口袋贵金属.exe软件,在GkoudaiDataCollector.py编写使用DirectX钩子技术(D3D11的hook)来自动获取口袋贵金属.exe进程和窗口句柄为00050412(Intermediate D3D Window)中的的卖价、买价格和交易量的代码并实时显示在程序面板上的优化以下方案:口袋贵金属.exe 行情数据采集方案(DirectX Hook 实现) 核心思路:通过注入 DLL 挂钩目标进程的 D3D 渲染管线(优先 D3D9,兼容主流桌面应用),拦截绘制调用后解析显存/绘制数据中的行情字段,实时回显到面板。 一、开发环境 - 语言:Python 3.8+(主面板)+ C++ 17(D3D Hook DLL,Python 无法直接实现底层挂钩) - 依赖: - Python: pywin32 (进程/窗口操作)、 PyQt5 (实时面板)、 ctypes (调用 DLL) - C++:DirectX SDK(D3D11 库)、MinHook(挂钩框架)、Detours(备选挂钩库) 二、核心实现步骤(分模块) 1. Python 主程序(GkoudaiDataCollector.py) 负责进程注入、窗口句柄绑定、数据接收和面板显示: 2. C++ D3D Hook DLL(核心逻辑) 负责注入进程、挂钩 D3D 绘制函数(如  EndScene )、解析行情数据: 三、关键说明 1. D3D 版本适配:优先 D3D9(口袋贵金属这类桌面软件常用),若检测到 D3D10/11,需替换对应接口(如  ID3D11DeviceContext::Present )。 2. 数据解析优化:示例中用正则解析显存文本,实际需用 Spy++ 抓取行情控件的坐标/文本格式,或通过 D3D 绘制对象遍历(更精准)。 3. 注入安全:需关闭目标软件的反作弊(若有),否则注入可能被拦截;建议以管理员权限运行采集程序。 4. 稳定性:Hook 可能导致目标软件崩溃,需添加异常捕获和资源释放逻辑。 四、编译与运行步骤 1. 编译 C++ DLL:用 Visual Studio 配置 DirectX SDK 和 MinHook,编译为 32/64 位 DLL(匹配目标软件架构)。 2. 放置 DLL 与 Python 脚本同目录,运行  GkoudaiDataCollector.py (需管理员权限)。 3. 确保口袋贵金属.exe 已启动,且窗口句柄为  0x00050412 (若句柄变化,需在 Python 中添加窗口查找逻辑)。
最新发布
11-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值