青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 505  文章 - 1034  trackbacks - 0
<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456


子曾經曰過:編程無他,唯手熟爾!

常用鏈接

留言簿(94)

隨筆分類(649)

隨筆檔案(505)

相冊

BCB

Crytek

  • crymod
  • Crytek's Offical Modding Portal

Game Industry

OGRE

other

Programmers

Qt

WOW Stuff

搜索

  •  

積分與排名

  • 積分 - 923077
  • 排名 - 14

最新隨筆

最新評論

閱讀排行榜

評論排行榜

重劍點評: cool! try it! 現在都是5.0了
http://developer.nvidia.com/object/nvperfhud_home.html  上面的視頻很直觀,功能一目了然


用NVPerfHud4剖析Farcry的繪制過程







    NVPerfHud4是Nvidia推出的配合Geforce6系列顯卡對DX9應用程序進行性能剖析的強大工具,通過它可以從宏觀和微觀兩個角度剖析圖形應用程序性能。宏觀上可以看到整體繪制中CPU、GPU分別占用了多少時間,PS、VS分別占用了多少時間,CPU等待時間,GPU等待時間。微觀上可以看到每一個DP調用的過程,顯示每一個DP調用過程中PS、VS和光柵化分別占用了多少時間以及每個DP調用所使用的VS、PS代碼,所用到的貼圖和所有繪制狀態。得到如此強大的功能對應用程序代碼的修改卻只需要一句,就是用下面的方式創建3D設備:
g_pD3D->CreateDevice( g_pD3D->GetAdapterCount()-1, D3DDEVTYPE_REF, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice );
其中最關鍵的參數是前兩個,也就是說只要按照上面方法創建3D設備的應用程序都可以通過NVPerfHud進行剖析。要用NVPerfHud對Farcry進行剖析就是要在Farcry的二進制代碼中找到CreateDevice()函數的調用位置,并將調用參數按要求修改。下面簡單說說這個過程。

    用IDA打開Farcry的D3D9繪制模塊XRenderD3D9.dll,在Strings窗口發現了我們感興趣的字符串"Creating D3D device (Adapter format: %s, BackBuffer format: %s, Depth format: %s)",用右鍵菜單跳到引用這個字符串的地址發現如下代碼:

01 push    offset aCreatingD3dDev ; "Creating D3D device (Adapter format: %s"...
02 .text:38054CF3                 push    ecx
03 .text:38054CF4                 call    dword ptr [edi+8]
04 .text:38054CF7                 mov     eax, dword_389E67D8
05 .text:38054CFC                 add     esp, 14h
06 .text:38054CFF                 test    eax, eax
07 .text:38054D01                 jnz     short loc_38054D51
08 .text:38054D03                 mov     al, [esi+1D650h]
09 .text:38054D09                 test    al, al
10 .text:38054D0B                 jz      short loc_38054D15
11 .text:38054D0D                 mov     eax, [esi+1D65Ch]
12 .text:38054D13                 jmp     short loc_38054D1B
13 .text:38054D15
14 .text:38054D15 loc_38054D15:                           ; CODE XREF: sub_38054B00+20Bj
15 .text:38054D15                 mov     eax, [esi+1D694h]
16 .text:38054D1B
17 .text:38054D1B loc_38054D1B:                           ; CODE XREF: sub_38054B00+213j
18 .text:38054D1B                 mov     ebp, [esp+21Ch+var_20C]
19 .text:38054D1F                 mov     ecx, [eax]
20 .text:38054D21                 mov     eax, [esi+1D620h]
21 .text:38054D27                 mov     edx, [eax]
22 .text:38054D29                 lea     edi, [esi+1E698h]
23 .text:38054D2F                 push    edi
24 .text:38054D30                 lea     ebx, [esi+1D6C0h]
25 .text:38054D36                 push    ebx
26 .text:38054D37                 push    ebp
27 .text:38054D38                 mov     ebp, [esi+1F494h]
28 .text:38054D3E                 mov     ebp, [ebp+0]
29 .text:38054D41                 push    ebp
30 .text:38054D42                 mov     ebp, [esp+22Ch+var_208]
31 .text:38054D46                 mov     ebp, [ebp+4]
32 .text:38054D49                 push    ebp
33 .text:38054D4A                 push    ecx
34 .text:38054D4B                 push    eax
35 .text:38054D4C                 call    dword ptr [edx+40h]
36 .text:38054D4F                 jmp     short loc_38054D8A
37 .text:38054D51
38 .text:38054D51 loc_38054D51:                           ; CODE XREF: sub_38054B00+201j
39 .text:38054D51                 mov     ecx, [esp+21Ch+var_20C]
40 .text:38054D55                 mov     edx, [esi+1F494h]
41 .text:38054D5B                 mov     eax, [esi+1D620h]
42 .text:38054D61                 mov     ebp, [eax]
43 .text:38054D63                 lea     edi, [esi+1E698h]
44 .text:38054D69                 push    edi
45 .text:38054D6A                 lea     ebx, [esi+1D6C0h]
46 .text:38054D70                 push    ebx
47 .text:38054D71                 and     ecx, 0FFFFFFEFh
48 .text:38054D74                 push    ecx
49 .text:38054D75                 mov     ecx, [edx]
50 .text:38054D77                 push    ecx
51 .text:38054D78                 push    2
52 .text:38054D7A                 push    eax
53 .text:38054D7B                 call    dword ptr [ebp+10h]
54 .text:38054D7E                 mov     edx, [esi+1D620h]
55 .text:38054D84                 dec     eax
56 .text:38054D85                 push    eax
57 .text:38054D86                 push    edx
58 .text:38054D87                 call    dword ptr [ebp+40h]

第1行將我們感興趣的字符串地址壓入堆棧,第3行應該是輸出日志之類的調用,下面應該離創建設備的調用(CreateDevice)不遠了。再看看IDirect3D9接口的定義:

DECLARE_INTERFACE_(IDirect3D9, IUnknown)
{
    /*** IUnknown methods ***/
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE;
    STDMETHOD_(ULONG,AddRef)(THIS) PURE;
    STDMETHOD_(ULONG,Release)(THIS) PURE;

    /*** IDirect3D9 methods ***/
    STDMETHOD(RegisterSoftwareDevice)(THIS_ void* pInitializeFunction) PURE;
    STDMETHOD_(UINT, GetAdapterCount)(THIS) PURE;
    STDMETHOD(GetAdapterIdentifier)(THIS_ UINT Adapter,DWORD Flags,D3DADAPTER_IDENTIFIER9* pIdentifier) PURE;
    STDMETHOD_(UINT, GetAdapterModeCount)(THIS_ UINT Adapter,D3DFORMAT Format) PURE;
    STDMETHOD(EnumAdapterModes)(THIS_ UINT Adapter,D3DFORMAT Format,UINT Mode,D3DDISPLAYMODE* pMode) PURE;
    STDMETHOD(GetAdapterDisplayMode)(THIS_ UINT Adapter,D3DDISPLAYMODE* pMode) PURE;
    STDMETHOD(CheckDeviceType)(THIS_ UINT Adapter,D3DDEVTYPE DevType,D3DFORMAT AdapterFormat,D3DFORMAT BackBufferFormat,BOOL bWindowed) PURE;
    STDMETHOD(CheckDeviceFormat)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,DWORD Usage,D3DRESOURCETYPE RType,D3DFORMAT CheckFormat) PURE;
    STDMETHOD(CheckDeviceMultiSampleType)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SurfaceFormat,BOOL Windowed,D3DMULTISAMPLE_TYPE MultiSampleType,DWORD* pQualityLevels) PURE;
    STDMETHOD(CheckDepthStencilMatch)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,D3DFORMAT RenderTargetFormat,D3DFORMAT DepthStencilFormat) PURE;
    STDMETHOD(CheckDeviceFormatConversion)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SourceFormat,D3DFORMAT TargetFormat) PURE;
    STDMETHOD(GetDeviceCaps)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DCAPS9* pCaps) PURE;
    STDMETHOD_(HMONITOR, GetAdapterMonitor)(THIS_ UINT Adapter) PURE;
    STDMETHOD(CreateDevice)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DDevice9** ppReturnedDeviceInterface) PURE;
   
    #ifdef D3D_DEBUG_INFO
    LPCWSTR Version;
    #endif
};

    仔細數一數可以看到CreateDevice()是接口的第17個函數,也就是說它在虛函數表里的偏移量應該是0x40。再回頭看上面的匯編代碼,可以發現有兩處"call    dword ptr [ebp+40h]"這樣的函數調用,這應該就是對CreateDevice()函數的兩次調用了。再看第53行還有這樣一個調用"call    dword ptr [ebp+10h]",對照IDirect3D9接口定義我們知道這是GetAdapterCount()函數,第55行對函數GetAdapterCount()的返回值減一,這不正是我們需要的CreateDevice()函數的第一個參數嗎,那再看看第二個參數是不是也是我們需要的D3DDEVTYPE_REF。第51行的指令"push    2"壓入CreateDevice()函數的第二個參數,查找相關頭文件我們發現D3DDEVTYPE_REF的值正好是2,這使我們相信第58行的CreateDevice()調用就是為NVPerfHud提供的,我們甚至都不需要修改調用參數,只需要把程序的執行路徑引到這里就行了。

    將IDA的代碼窗口切換到圖形視圖可以更容易地看到代碼跳轉路徑。



    可以看到代碼在最上面分為兩叉,右邊的綠色箭頭指向我們需要的CreateDevice()調用,我們只需要把最上面那個框里的"jnz     short loc_38054D51"指令修改成"jz     short loc_38054D51",也就是取反條件判斷,就能讓代碼走我們需要的執行路徑。在十六進制編輯窗口找到相關代碼,將75改為74(jnz改為jz),然后存盤就完成了對XRenderD3D9.dll的修改。

posted on 2007-08-29 11:03 七星重劍 閱讀(305) 評論(0)  編輯 收藏 引用 所屬分類: Game Graphics
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲美女色禁图| 欧美日韩国产精品一区| 一区二区三区免费网站| 久久婷婷激情| 午夜久久久久久| 亚洲免费黄色| 亚洲黄色在线观看| 国产精品久久久久毛片软件| 美国成人直播| 久久av免费一区| 亚洲一品av免费观看| 91久久精品国产| 久久久夜夜夜| 久久国产精品久久久| 亚洲性图久久| 在线亚洲+欧美+日本专区| 亚洲福利一区| 国产综合18久久久久久| 国产欧美一区二区精品仙草咪| 欧美日韩国产首页在线观看| 麻豆精品网站| 快播亚洲色图| 久久久午夜精品| 久久精品国产免费观看| 欧美一区二区视频97| 亚洲欧美日韩中文播放| 亚洲深夜影院| 亚洲一区二区四区| 亚洲无线一线二线三线区别av| 99精品视频免费观看视频| 亚洲人成网站777色婷婷| 欧美激情国产日韩| 亚洲电影免费观看高清完整版在线 | 亚洲欧美国产三级| 亚洲主播在线播放| 亚洲欧美国产77777| 亚洲欧美日韩一区二区三区在线观看| 一本色道久久综合亚洲精品婷婷| 一本不卡影院| 亚洲视频大全| 亚洲一区在线观看视频 | 一本色道88久久加勒比精品| 亚洲九九爱视频| 日韩小视频在线观看| 一区二区三区久久网| 亚洲女人av| 久久9热精品视频| 久久这里只精品最新地址| 久久躁狠狠躁夜夜爽| 欧美国产日韩一区二区在线观看| 欧美精品久久久久久久免费观看| 欧美日韩卡一卡二| 国产精品久久二区二区| 国产精品成人v| 国产偷国产偷精品高清尤物| 一区二区三区在线看| 亚洲精品视频免费| 亚洲免费伊人电影在线观看av| 欧美一区二区视频在线| 久久一二三国产| 亚洲欧洲日产国产综合网| 99综合在线| 香蕉久久夜色| 欧美成人激情视频| 国产精品九色蝌蚪自拍| 国内精品免费在线观看| 亚洲免费成人av电影| 欧美亚洲一区二区三区| 免费看亚洲片| 一本久久a久久精品亚洲| 欧美一级视频一区二区| 久热精品视频在线免费观看| 欧美午夜不卡影院在线观看完整版免费| 国产精品视频久久久| 亚洲福利视频一区| 亚洲欧美日本国产有色| 久久亚洲精品伦理| 亚洲最新在线| 久久久久五月天| 国产精品成人v| 在线欧美亚洲| 香蕉乱码成人久久天堂爱免费| 欧美成人乱码一区二区三区| 亚洲视频在线一区| 久久香蕉国产线看观看av| 国产精品高潮久久| 亚洲国产日韩综合一区| 欧美一级免费视频| 亚洲精品激情| 久久久精品国产99久久精品芒果| 欧美日韩亚洲天堂| 亚洲高清在线精品| 久久国产精品久久精品国产| 亚洲人线精品午夜| 久久久久久久综合| 国产精品资源在线观看| 夜夜精品视频| 欧美电影免费网站| 欧美伊人久久久久久午夜久久久久 | 另类天堂av| 国产欧美日韩一区二区三区在线观看 | 欧美激情一区二区三区| 午夜欧美精品久久久久久久| 欧美啪啪一区| 亚洲大胆人体视频| 久久精品国产久精国产爱| 99re视频这里只有精品| 免费成人毛片| 在线观看日韩| 久久精品中文字幕一区| 亚洲一区二区少妇| 欧美午夜无遮挡| 一本色道久久综合亚洲精品小说| 欧美华人在线视频| 久久深夜福利免费观看| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 欧美日本一道本| 亚洲国产合集| 欧美超级免费视 在线| 欧美在线观看视频在线| 国产精品中文字幕在线观看| 亚洲欧美日韩天堂一区二区| a91a精品视频在线观看| 欧美日韩大片| av72成人在线| 亚洲免费观看| 欧美日韩国产一区二区三区地区| 亚洲免费观看在线视频| 亚洲精品久久久一区二区三区| 欧美激情精品久久久久久| 91久久久久久久久久久久久| 久久久精品国产免大香伊| 久久av在线| 激情小说另类小说亚洲欧美| 久久久久久久欧美精品| 久久av一区| 亚洲福利电影| 亚洲国产日韩一级| 欧美理论电影网| 亚洲一级黄色av| 亚洲影院免费观看| 国产日本欧美一区二区三区在线| 久久9热精品视频| 久久精品导航| 亚洲国产欧美久久| 亚洲日本无吗高清不卡| 欧美午夜精品久久久久久人妖| 亚洲综合不卡| 欧美一区二区三区另类| 一色屋精品视频免费看| 亚洲福利免费| 欧美体内谢she精2性欧美| 亚洲综合视频一区| 翔田千里一区二区| 亚洲第一区在线观看| 亚洲乱码国产乱码精品精可以看 | 亚洲一二三区在线观看| 国产日韩欧美一区二区三区在线观看 | 久久精品一区二区三区中文字幕| 欧美在线资源| 亚洲精品国精品久久99热一| 日韩天堂在线观看| 国产精品一区在线观看你懂的| 久久久噜噜噜久久狠狠50岁| 久久人人97超碰国产公开结果| 亚洲韩日在线| 亚洲一区二区在| 亚洲国产精品99久久久久久久久| 99国产精品99久久久久久| 国产日本欧美在线观看 | 欧美一级二区| 亚洲人久久久| 亚洲免费一在线| 亚洲欧洲精品一区二区三区| 在线视频精品一区| 在线色欧美三级视频| 一区二区免费看| 亚洲第一福利社区| 亚洲影院色无极综合| 亚洲人成亚洲人成在线观看| 亚洲免费在线视频| 亚洲破处大片| 欧美一区二区三区日韩视频| 亚洲最新中文字幕| 久久久欧美精品| 亚洲专区一区| 欧美成人精品影院| 久久精品视频免费观看| 欧美日韩国产精品成人| 美国十次了思思久久精品导航| 欧美午夜视频在线| 亚洲国产精品一区二区第四页av| 国产亚洲毛片在线| 亚洲精品中文字幕在线| 精品999日本| 亚洲欧美国内爽妇网| 99精品热视频| 免费高清在线视频一区·| 久久精品男女| 欧美性猛交xxxx乱大交退制版|