游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5000|回复: 10

资源占有率太高了

[复制链接]

5

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2005-9-29 11:25:00 | 显示全部楼层 |阅读模式
我正在学习DIRECTDRAW编程,用DIREXTX编了一个小程序,
只是显示一行文字,可是CPU占有率几乎是100%,
这是怎么回事啊,是不是用DIRECTX编出的程序都是这样占CPU的呢?
请各位大虾指教啊!!!

50

主题

244

帖子

319

积分

中级会员

Rank: 3Rank: 3

积分
319
QQ
发表于 2005-9-29 12:31:00 | 显示全部楼层

Re:资源占有率太高了

在主循环中加个Sleep(1)就可以了,当程序处理内容较多时,一般不会出现这种情况。

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2005-9-29 13:33:00 | 显示全部楼层

Re:资源占有率太高了

不要用sleep。。。

2

主题

22

帖子

22

积分

注册会员

Rank: 2

积分
22
发表于 2005-9-29 17:14:00 | 显示全部楼层

Re:资源占有率太高了

不要用DelphiX带的Timer,用Delphi标准Timer就可以把CPU降下来了

2

主题

22

帖子

22

积分

注册会员

Rank: 2

积分
22
发表于 2005-9-29 17:18:00 | 显示全部楼层

Re:资源占有率太高了

如果你用其他语言也是一样的,DXTimer和普通的Timer是有区别的.

5

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
 楼主| 发表于 2005-9-29 17:37:00 | 显示全部楼层

Re:资源占有率太高了

谢谢大家的帮助,我以后得经常来才行啊,呵呵...

33

主题

544

帖子

554

积分

高级会员

Rank: 4

积分
554
发表于 2005-9-29 18:27:00 | 显示全部楼层

Re:资源占有率太高了

没控制FPS

38

主题

96

帖子

148

积分

注册会员

Rank: 2

积分
148
发表于 2005-9-29 19:35:00 | 显示全部楼层

Re:资源占有率太高了

嗯,这个问题我也寻找了很久,终于把这个现象搞懂,懂了之后才知道自己对Windows程序的陌生,对程序的陌生。举个例子
int k=0;
while(1) {
    k++;
}

上面的程序CPU占用率就会是100%
while(1) {
    k++;
    Sleep(1);
}

CPU占用率0%
while(1) {
   DWORD oldTime = timeGetTime();
   while(timeGetTime()-oldTime < 1 )
   { k++; }
   Sleep(1);
}

理论上CPU占用50%,上面的代码是为了说明问题,我并没有调试。
主要说明一个问题,上面Sleep(1) 以上的代码是100%占用了1ms。
而Sleep(1)表示释放CPU控制权,所以总体CPU占用是50%

对于一般的编程,一般是不会去体会这个问题的,但对于要求精度要求
极高的时候,会出现很不正常的现象和BUG,一些依赖时间准确的程序根本
不能正确执行,所以在某些情况下,对这段程序最低执行时间有个了解,这
主要包括,最少需要执行多少次,每一次占用多长时间。

上面说的是思想上应当由准备的东西,而接下提到的是Windows系统对程序的
影响.Windows系统是一个模拟多线程的系统,所谓抢先式多任务系统,简单
说就是,在一个或多个CPU上同时执行多个程序,而一般只有一个CPU,即使
有几个,也不能保证完全分配给某个线程,所以每一线程都不能在准确的时间
执行,而且我们写的代码也不能在要求的时间内执行完,如果你这个线程没有
执行完,就很有可能影响到下一个线程的执行,这样导致互相争抢线程造成CPU
占用过高。

上一段说了一个情况,如果在这种环境下你还要求顺畅运行程序,那么就只有
一个思想上的理想做法:学习一本书《windows核心编程》,把Windows核心操
作了解清楚,运用硬件计时器来为你的每一个任务进行定时操作,使系统不会
互相抢占CPU,其实理论上如果把所做事情的时机都控制好,也就是说CPU占用
多少可以自己控制,其他时间都释放给系统,实际上这个释放CPU不是一定是个
好事情,如果你释放了,别人写了一个不太好的CPU调度程序也在运行会影响
到你的程序,所以游戏程序尽量不释放任何CPU,只有自己占有。另一个角度
看,如果你控制好了每一段程序的执行时机,即时占用CPU100%也不会影响到
其他程序和自己的运行流畅。

如果想简单的降低CPU占用率那在主循环中调用一个Sleep(5)好像是可以解决
问题,但实际上不是这样的,假设你写了某个
while(i<10000000000000000){ dosomething(); }
你一样是个占CPU的高手;

你的程序一般是因为 这种循环次数感觉是无数次,但是你是在让CPU永不停息
的去重复做了你那个简单的功能,所以它就会占CPU过多,或说是完全占有了。

5

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
 楼主| 发表于 2005-9-30 12:52:00 | 显示全部楼层

Re:资源占有率太高了

这位大哥好人啊,敬礼!!

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2005-9-30 13:12:00 | 显示全部楼层

Re:资源占有率太高了

楼上的楼上正解。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-23 22:41

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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