游戏开发论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: guoqiang

关于游戏循环的一个问题

[复制链接]

10

主题

62

帖子

68

积分

注册会员

Rank: 2

积分
68
发表于 2006-4-17 16:50:00 | 显示全部楼层

Re:关于游戏循环的一个问题

Sleep(0)与Sleep(1)没有本质上的区别

先明确一个概念——CPU占用率是什么
用于计算CPU占用率的是System Idle进程
它的优先级为0
只有其他线程处于暂停态才执行System Idle进程
然后Windows系统统计1s内System Idle进程的执行时间就能算出CPU占用率

Sleep(0)后
发生线程上下文切换,将CPU时间片交给其他线程
由于参数是0,该线程是立即放入线程就绪队列的
所以用永远不会执行System Idle进程,这样算得的CPU占用率肯定是100%

而Sleep(1)呢
由于需要等待,所以会处于暂停态一段时间,然后再放入线程就绪队列的
而那时System Idle进程肯定已经运行一段时间了


有人认为Sleep(0)的100%CPU占用率会影响其他程序响应
会有影响的,但并不严重
因为我们主动调用Sleep执行了线程切换,而不是Windows发现该线程用完时间片后的强制切换

10

主题

62

帖子

68

积分

注册会员

Rank: 2

积分
68
发表于 2006-4-17 16:57:00 | 显示全部楼层

Re: 关于游戏循环的一个问题

哈哈
Sleep(0)果然不会带来太大的影响
Sleep(1)的结果很精确
sf_2006417165631.gif

63

主题

871

帖子

891

积分

高级会员

Rank: 4

积分
891
QQ
发表于 2006-4-17 22:14:00 | 显示全部楼层

Re:关于游戏循环的一个问题

Sleep(1)在不同的机子上延迟的时间会不一样的

12

主题

38

帖子

38

积分

注册会员

Rank: 2

积分
38
发表于 2006-4-27 11:00:00 | 显示全部楼层

Re:关于游戏循环的一个问题

bool g_bActive = true;
WinMain中:
while (TRUE)
{
        if ( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) )  
        {
                if ( msg.message == WM_QUIT )
                        break;

                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }
        else if ( g_bActive )
        {
                MainLoop();
        }
        else
        {
                WaitMessage();
        }
}

WinProc中:
case WM_ACTIVATEAPP:
        g_bActive = wParam;
        break;
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 08:35

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表