关于游戏主循环的写法

kofightas 2004-05-08 12:34:00
我现在知道几种写法,但是如果限制游戏帧数,cpu占用率就达到100%。
不限制的话反倒能有较低的占用率。
请给出一种两全的主循环写法,谢谢
...全文
670 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
kofightas 2004-06-23
  • 打赏
  • 举报
回复
这个帖子其实以前结过贴了,后来那次服务器坏掉结贴失效...
这个问题我现在基本明朗了,最后跟关注这个帖子的人交待一下。
sleep肯定是不用的,帧数差是一方面,另外在不同机器上速度差距过大
游戏里面限制帧数最常用方法还是用peekmassage加上每次主循环取系统运行时间,未到约定时间间隔则等待。
当然如楼上说的,3d游戏里一般并不限制帧数,而一般限制世界的更新次数。而在等待时间里绘制游戏画面。这样做的原因是3D游戏中绘制画面的复杂度差距很大,在更新游戏世界的剩余时间绘制能保证游戏不出现时快时慢的情况。而在配置低的机器上,游戏丢帧但不影响进行速度.
用peekmessage并不会使cpu使用率到100%,但限制帧数或游戏世界更新次数就必然令cpu达到100%.
cpu 100%会影响子线程或子进程的执行效率的想法不完全正确,除非把绘图之类的巨大工作放到子进程中,否则影响微乎其微。游戏中子进程的工作一般是ai或网络数据传输。
这帖子就此结贴,如果大家对我现在总结的事有什么不同意见,欢迎开新贴讨论。
davidlxm 2004-06-16
  • 打赏
  • 举报
回复
Sleep函数任何时候都不要用(不包括SleepEx),还不如带TimeOut的WaitEvent更实用一些。
Sleep的坏处主要在于阻塞了系统消息。影响了程序该有的响应时间。

主循环主要看你程序如何控制时钟。游戏一般采用动态FPS的技术,现代3D游戏的FPS越高越好。游戏计算本身运算需要相当多的CPU,主循环这几行test,jmp指令浪费的时间几乎为0。使用了PeekMessage(&msg,NULL,0,0,PM_REMOVE),系统会为你管理闲置的CPU使用。不想使用CPU,别去做复杂的计算就行了。如果想限制FPS来节约CPU,就做个Timer。
mme 2004-06-15
  • 打赏
  • 举报
回复
老实说100%不是坏事,因为消息还是能够得到处理的,而且用于游戏的cpu时间更多,这样是合理的。因为游戏的计算,渲染需要大量的cpu时间,如果你使用sleep等延时,那么,cpu的时间就被浪费掉了。
bopengbopeng 2004-06-11
  • 打赏
  • 举报
回复
100%就100%吧。。。
stephen85 2004-06-10
  • 打赏
  • 举报
回复
up
snwcwt 2004-06-10
  • 打赏
  • 举报
回复
Sleep可以保证在一秒钟之内FPS的值差一般不会超过2个FPS
无论机器快还是慢
(机器太慢,以至于不SLEEP都在一秒钟达不到那个FPS值除外)
huwei001982 2004-06-09
  • 打赏
  • 举报
回复
Sleep少用, 应该自已写个
allsword 2004-06-09
  • 打赏
  • 举报
回复
RE sleep,帧数差那么一点点又何防呢?

sleep俺发誓在游戏中尽量少用,
由于各人机器速度相差很大,会出现很大的差别的,

顺便问一下兄弟们各损失多少分:<
snwcwt 2004-06-07
  • 打赏
  • 举报
回复
sleep,帧数差那么一点点又何防呢?
林仪明 2004-06-06
  • 打赏
  • 举报
回复
嗯嗯,估计都是peekmessage的
huwei001982 2004-05-13
  • 打赏
  • 举报
回复
好像绝大部分游戏的占用率都是100%
传奇, CS,..等等
EnigmaXJ 2004-05-12
  • 打赏
  • 举报
回复
while(!done)
{

start_time=GetTickCount();
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message==WM_QUIT)
{
done=TRUE;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{

if (active)
{
KeyProc();

if (keys[VK_ESCAPE]) // Was ESC Pressed?
{
done=TRUE; // ESC Signalled A Quit
}
else // Not Time To Quit, Update Screen
{
if(gameStart)
{
if(gameOver)gameCount++;
if(gameCount<100)
{
Refresh();
DrawSence(); // Draw The Scene
}
else
{
done=TRUE;
}
}
else
{
DrawTitle();
}
}
}

while((GetTickCount()-start_time)<30){sleep(0);};

fps=(float)1000.0/((GetTickCount()-start_time)+1);
}

}
在while循环下sleep一下呢?应该要一点,但是好象定得不精确了。
kofightas 2004-05-10
  • 打赏
  • 举报
回复
我的程序要用到多线程。
主线程cpu占用率过高会影响子线程的执行效率
whalefish2001 2004-05-10
  • 打赏
  • 举报
回复
其实,我感觉
当游戏在前台的时候,CPU达到100%没有什么。(如果外部有消息进来,OS 还是会处理其他消息的)
不过,要控制在后台运行的时候,或是最小化的时候不要到100%就行。
相信这个容易实现一些吧?
whalefish2001 2004-05-10
  • 打赏
  • 举报
回复
我有个建议,不知道可不可以。
首先,测试机器的CPU频率和显卡性能(如果好的话,可以做好点的纹理,渲染等)。
如果发现过高的话,就做一些处理。
(比如像 allsword(剑七) 所说的 GetTickCount()+移动慢长(不能增加太大)来控制 )

过低的话,也相应的做做处理。

kofightas 2004-05-09
  • 打赏
  • 举报
回复
PeekMessage和GetMessage的区别
GetMessage在没有消息的时候等待消息,cpu当然低
PeekMessage没有消息的时候立刻返回,所以cpu占用率高。
因为游戏不能靠windows消息驱动,所以要用PeekMessage();

to :Vcar(阿猫) 如果用GetMessage的话,应该怎么写?
pengin 2004-05-09
  • 打赏
  • 举报
回复
up
allsword 2004-05-09
  • 打赏
  • 举报
回复
大家不如一起来谈谈太阁的的一些原理是如何实现的,
我一直是以太阁游戏为目标,
也许有点老土,别人都去D3D,我还这个^_^,
太阁从2-4、5, 它好像在窗口下执行的不错,
按钮做的很好,4的窗口全屏转换很完美,
好像没用sleep().
黑羽飘舞 2004-05-08
  • 打赏
  • 举报
回复
主循环尽量用多的语句和尽量少的计算实现
vcar 2004-05-08
  • 打赏
  • 举报
回复
peek的100%,get的就特别低。
加载更多回复(4)

8,325

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧