首页
社区
课程
招聘
[旧帖] 降低网络游戏CPU占用率 0.00雪花
发表于: 2009-11-6 19:34 2738

[旧帖] 降低网络游戏CPU占用率 0.00雪花

2009-11-6 19:34
2738
#include <d3d9.h>
#include <D3dx9core.h>
#pragma comment(lib, "D3D9.lib")
#pragma comment(lib, "D3Dx9.lib")
void GameD3D_HOOK();
IDirect3D9 * _stdcall New_Direct3DCreate9(UINT SDKVersion);
HRESULT _stdcall New_CreateDevice(
                                    LPDIRECT3D9 pDx9,
                                    UINT Adapter,
                                    D3DDEVTYPE DeviceType,
                                    HWND hFocusWindow,
                                    DWORD BehaviorFlags,
                                    D3DPRESENT_PARAMETERS * pPresentsentationParameters,
                                    IDirect3DDevice9 ** pPresentturnedDeviceInterface

                                    );

HRESULT _stdcall New_Present(
                              LPDIRECT3DDEVICE9 pDxdevice,
                              CONST RECT * pSourceRect,
                              CONST RECT * pDestRect,
                              HWND hDestWindowOverride,
                              CONST RGNDATA * pDirtyRegion
                              );

LPDIRECT3D9 m_pD3D=NULL; //Direct3D对象的接口指针

void * pDirect3DCreate9=NULL;//Direct3DCreate9函数地址指针
void * pCreateDevice=NULL;//IDirect3D9::CreateDevice函数地址指针
void * pPresent=NULL;//IDirect3DDevice9::Present函数地址指针

int Sleeptime=50;//延时时间

BYTE Direct3DCreate_Begin[5];//用于保存Direct3DCreate9入口的5字节
BYTE CreateDevice_Begin[5];//用于保存IDirect3D9::CreateDevice入口的字节
BYTE Present_Begin[5];//用于保存IDirect3DDevice9::Present入口的5字节

void GameD3D_HOOK()
{
    //hook Direct3DCreate9
    pDirect3DCreate9=GetProcAddress(GetModuleHandle("d3d9.dll"),"Direct3DCreate9");
    DWORD oldproc=0;
    memcpy(Direct3DCreate_Begin,pDirect3DCreate9,5);
    VirtualProtect(pDirect3DCreate9,5,PAGE_EXECUTE_READWRITE,&oldpro);
    *(BYTE*)pDirect3DCreate9=0xe9;
    *(DWORD*)((BYTE*)pDirect3DCreate9+1)=(DWORD)New_Direct3DCreate9-(DWORD)pDirect3DCreate9-5;
}
//当运行到Direct3DCreate9时跳转到这里
IDirect3D9 * _stdcall New_Direct3DCreate9(
    UINT SDKVersion
    )
{
    __asm pushad
        memcpy(pDirect3DCreate9,Direct3DCreate_Begin,5);//首先还原入口的5个字节
    m_pD3D=Direct3DCreate9(SDKVersion);
    if(m_pD3D){//如果成功
        pCreateDevice=(void*)*(DWORD*)(*(DWORD*)m_pD3D+0x40);//获得IDirect3D9::CreateDevice的地址指针

        DWORD oldpro=0;
        memcpy(CreateDevice_Begin,pCreateDevice,5);//保存IDirect3D9::CreateDevice入口5个字节
        VirtualProtect(pCreateDevice,5,PAGE_EXECUTE_READWRITE,&oldpro);
        *(BYTE*)pCreateDevice=0xe9;
        *(DWORD*)((BYTE*)pCreateDevice+1)=(DWORD)New_CreateDevice-(DWORD)pCreateDevice-5;

    }else{//如果失败就再hook一次
        DWORD oldpro=0;
        VirtualProtect(pDirect3DCreate9,5,PAGE_EXECUTE_READWRITE,&oldpro);
        *(BYTE*)pDirect3DCreate9=0xe9;
        *(DWORD*)((BYTE*)pDirect3DCreate9+1)=(DWORD)New_Direct3DCreate9-(DWORD)pDirect3DCreate9-5;
    }

    __asm popad
        return m_pD3D;
}
//hook CreateDevice
HRESULT _stdcall New_CreateDevice(
                                    LPDIRECT3D9 pDx9,
                                    UINT Adapter,
                                    D3DDEVTYPE DeviceType,
                                    HWND hFocusWindow,
                                    DWORD BehaviorFlags,
                                    D3DPRESENT_PARAMETERS * pPresentsentationParameters,
                                    IDirect3DDevice9 ** pPresentturnedDeviceInterface

                                    )
{
    __asm pushad

        memcpy(pCreateDevice,CreateDevice_Begin,5);//先还原入口的5个字节

    HRESULT ret=pDx9->CreateDevice( //创建设备
        Adapter,
        DeviceType,
        hFocusWindow,
        BehaviorFlags,
        pPresentsentationParameters,
        pPresentturnedDeviceInterface);

    if (ret==D3D_OK){//如果创建设备成功

        LPDIRECT3DDEVICE9 m_pDevice=*pPresentturnedDeviceInterface;

        pPresent=(void*)*(DWORD*)(*(DWORD*)m_pDevice+0x44);//获得IDirect3DDevice9::Present的地址指针
        memcpy(Present_Begin,pPresent,5);//保存IDirect3DDevice9::Present入口的5个字节
        DWORD oldpro=0;
        VirtualProtect(pPresent,5,PAGE_EXECUTE_READWRITE,&oldpro);
        *(BYTE*)pPresent=0xe9;
        *(DWORD*)((BYTE*)pPresent+1)=(DWORD)New_Present-(DWORD)pPresent-5;

    }else{//如果失败再hookIDirect3D9::CreateDevice一次
        DWORD oldpro=0;
        VirtualProtect(pCreateDevice,5,PAGE_EXECUTE_READWRITE,&oldpro);
        *(BYTE*)pCreateDevice=0xe9;
        *(DWORD*)((BYTE*)pCreateDevice+1)=(DWORD)New_CreateDevice-(DWORD)pCreateDevice-5;
    }
    __asm popad
        return ret;
}

//当程序运行到IDirect3DDevice9::Present入口处将跳转到这里
HRESULT _stdcall New_Present(
                              LPDIRECT3DDEVICE9 pDxdevice,//类的this指针
                              CONST RECT * pSourceRect,//此参数请参考dx sdk
                              CONST RECT * pDestRect,//同上
                              HWND hDestWindowOverride,//同上
                              CONST RGNDATA * pDirtyRegion//同上

                              )
{
    Sleep(Sleeptime);
    __asm pushad

        if(pDirect3DCreate9 && pCreateDevice && pPresent)
            memcpy(pPresent,Present_Begin,5);//先还原IDirect3DDevice9::Present入口的5字节

        HRESULT retdata= pDxdevice->Present(pSourceRect,pDestRect,hDestWindowOverride,pDirtyRegion);

        if(pDirect3DCreate9 && pCreateDevice && pPresent){
            //DWORD oldpro=0;
            //VirtualProtect(pPresent,5,PAGE_EXECUTE_READWRITE,&oldpro);
            //调用完IDirect3DDevice9::Present后再hook一次
            *(BYTE*)pPresent=0xe9;
            *(DWORD*)((BYTE*)pPresent+1)=(DWORD)New_Present-(DWORD)pPresent-5;
        }

        __asm popad
            return retdata;
}

帮忙解释下代码

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
网游的资源占用主要是人物场景模型 技能特效 这些方面
如果能不显示这些或者以简单的阴影代替(详见梦幻诛仙的优化方法) 可以大大降低资源占用,
但同时也失去了网络游戏的乐趣
非工作室之属没必要如此
不懂汇编~ 飘过
2009-11-6 20:33
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
哦   我只是想找人 解释下 这段代码
2009-11-7 12:29
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
没高人给我们这些菜人上上课啊.
2009-11-7 21:29
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
貌似不是汇编  糗大了
2009-11-8 12:26
0
雪    币: 52
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
高人都休息区了?
2009-11-8 12:35
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
。。。。。看不明白啊。。 怎么得到这些代码的啊·??
2009-11-8 16:57
0
雪    币: 40
活跃值: (145)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢楼主的分享,收下了
2009-11-8 17:26
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
Sleep(Sleeptime);

关键是这一句吧,游戏绘制画面前Sleep了50毫秒....
2009-11-9 00:02
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
继续膜拜一下,等高人讲课.
2009-11-9 01:09
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
天天 泡百度  能 得到很多东西
2009-11-9 19:35
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
还是自己百度,或者谷歌,好人再次是发不到帖子的!
2009-11-15 15:40
0
雪    币: 323
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
有没降内存的
2012-6-16 21:37
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
只有代碼
不能用...
2012-6-20 21:21
0
雪    币: 332
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
有没降内存的
2013-1-12 13:06
0
雪    币: 297
活跃值: (120)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
16
d3d游戏的CPU占用率居高不下,主要是因为它的刷新画面的函数调用太频繁,在这个函数里加入一个sleep函数,就可以降低这个函数的调用频率,使CPU获得更多的时间处理其他的线程.
2013-1-12 13:20
0
游客
登录 | 注册 方可回帖
返回
//