首页
论坛
课程
招聘
[原创]关于降低指定进程cpu占用率那些事
2020-7-23 16:46 1835

[原创]关于降低指定进程cpu占用率那些事

2020-7-23 16:46
1835

外网查了一晚上资料.看论坛上没人发,我来总结下.
1.windows job机制
把进程放入job容器,调用job api实现

    DWORD nderror;
    HANDLE m_hJob = CreateJobObject(NULL,"ProcessGroup");

    //STARTUPINFO stInfo;

    //memset(&stInfo, 0, sizeof(STARTUPINFO));

    //(2)向job作业添加进程:
    //这里是伪代码

        创建一个进程
        把进程句柄传入 AssignProcessToJobObject
        //
    BOOL ret = AssignProcessToJobObject(m_hJob,进程句柄);
    if (ret)
    {
        printf("向作业添加进程成功");
    }else
    {
        nderror = GetLastError();
    }


    JOBOBJECT_BASIC_LIMIT_INFORMATION limitInfo;
    limitInfo.LimitFlags = JOB_OBJECT_LIMIT_PROCESS_TIME|JOB_OBJECT_LIMIT_PRIORITY_CLASS;
    limitInfo.PerProcessUserTimeLimit.QuadPart=10000;
    limitInfo.PriorityClass=IDLE_PRIORITY_CLASS;

   //这里是参数填这个 JobObjectCpuRateControlInformation  
   //https://docs.microsoft.com/en-us/windows/win32/api/jobapi2/nf-jobapi2-setinformationjobobject开发文档

    ret = SetInformationJobObject(m_hJob,JobObjectBasicLimitInformation ,&limitInfo, sizeof(limitInfo));

注意:系统必须win8以上,win7没这功能,代码我也没跑通,据说是所有由系统创建的进程已经放入了一个job,(为了解决兼容性)

 

2.对于游戏进程,hook dx接口,sleep 20ms-50ms 代码百度太多了.
注意,dx接口太容易被检测了,个人建议hook点选深点

 

3.hook消息处理函数,引用自大佬@wzanthony

while (1)
{
    if (PeekMessage(...))
    {
        TranslateMessage(...);
        DispatchMessage(...);
    }
    else
    {
        Sleep(1);
    }
}

4.我要降低的是无窗口进程的cpu占用率,消息处理函数还有检测,不符合我的需求,最后找到一个开源软件,大概看了下,熬了一晚上抗不住了,他是循环降低进程优先级,枚举该进程所有线程,挂起\,间隔100-300ms恢复来实现Down Cpu
代码在下面


[看雪官方]《安卓高级研修班》线下班,网课(12月)班开始同步招生!!

最后于 2020-7-23 16:58 被qj111111编辑 ,原因:
上传的附件:
收藏
点赞0
打赏
分享
最新回复 (1)
雪    币: 409
活跃值: 活跃值 (474)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
萌克力 活跃值 2020-7-23 22:53
2
0
想起来几年前的黑屏优化一个月可以卖5k
游客
登录 | 注册 方可回帖
返回