游戏开发论坛

 找回密码
 立即注册
搜索
楼主: snhun

讨论:效率最高的游戏循环,怎么写?

[复制链接]

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
 楼主| 发表于 2007-5-23 19:49:00 | 显示全部楼层

Re:讨论:效率最高的游戏循环,怎么写?

恩,同意。

可是我最先问的是,我这个代码“跟 NEHE 的代码比较”,哪个效率高?

NEHE 的代码里也没写 系统消息和游戏逻辑的平衡。
而且NEHE的代码也是“等系统消息全部处理完后,再去处理游戏逻辑”。

NEHE 的 DEMO代码:
while(1)
{
    if(有消息)
    {处理消息}

    else
    {游戏逻辑}
}

你总说 NEHE 的是"有消息就处理消息,没有消息就处理游戏逻辑",而我的跟NEHE的不一样。

我觉得我的跟 NEHE 的功能完全一样啊。
你给解释解释,怎么跟 NEHE 的不一样了?

0

主题

20

帖子

20

积分

注册会员

Rank: 2

积分
20
发表于 2007-5-23 20:08:00 | 显示全部楼层

Re:讨论:效率最高的游戏循环,怎么写?

解释?funcman、iron、fy_pig都已经给你解释过了,回过头去看看前几篇帖子。认真听听别人的意见!
难道你真是死不承认??
难道你非要扣字眼呢???
难道你就不能看看你自己的标题“效率最高的游戏循环,怎么写?”????
难道就不能大大方方的承认自己错了?????

NEHE的demo那样写也有问题啊,我就做个假设,突然来了10000000个系统消息,怎么办?虽然这个数字有点夸张和不现实,但总还是有些代表性。
难道非要处理完系统消息之后才处理游戏逻辑?????

我没有说过:“有消息就处理消息,没有消息就处理游戏逻辑”,仔细回去看看,那是你自己说的。不要乱给我扣帽子。

我只是想告诉你:不要因为处理系统消息,就不管游戏逻辑了,明白了吧?简单吧?
你改的那个代码是实现了上面的目的,但是没注意控制系统消息的处理。我只是将我的经验告诉你,让你多学些东西。
demo就是demo,只是给你一个启发,不是教科书,更不是标准。

我看你才是被教育毒害了的代表,自己好好动哈脑筋想一哈!!!

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
 楼主| 发表于 2007-5-24 00:11:00 | 显示全部楼层

Re: Re:讨论:效率最高的游戏循环,怎么写?

nickzj: Re:讨论:效率最高的游戏循环,怎么写?
我没有说过:“有消息就处理消息,没有消息就处理游戏逻辑”

iron说
“采用nehe的结构,有系统消息的时候不进入游戏循环,但是按你的这个结构,不管有没有消息都要进入游戏循环”
“不好意思,纠正一下,我看错了
我把while(有没有消息)看成if了,纯属失误,失误啊。让各位见笑了。”

你说
“你没说错啊,对于MainLoop来说,本来就是‘不管有没有系统消息都要处理游戏逻辑’啊”

iron是说 MainLoop了吗??

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
 楼主| 发表于 2007-5-24 00:16:00 | 显示全部楼层

Re:讨论:效率最高的游戏循环,怎么写?

你看错了。

5楼的帖子:
“如下修改,速度是不是更快呢?”

是“更快呢?”,不是“最快呢?”
我是跟NEHE的比较的。

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2007-5-24 09:33:00 | 显示全部楼层

Re:讨论:效率最高的游戏循环,怎么写?

你们怪能打字的

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2007-5-24 09:36:00 | 显示全部楼层

Re:讨论:效率最高的游戏循环,怎么写?

同上

29

主题

224

帖子

224

积分

中级会员

Rank: 3Rank: 3

积分
224
QQ
发表于 2007-5-24 20:10:00 | 显示全部楼层

Re:讨论:效率最高的游戏循环,怎么写?

同上,同上上

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
 楼主| 发表于 2007-6-4 18:39:00 | 显示全部楼层

Re:讨论:效率最高的游戏循环,怎么写?

2007年6月4日 18:35

今天我问过我们公司的引擎制作组组长。他说:
while(1)
{
    if(有消息)
    {处理消息}

    else
    {游戏逻辑}
}

while(1)
{
    while(有消息)
    {处理消息}

    游戏逻辑
}
功能完全相同,而且 while 比 if 好。

10

主题

33

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2007-6-6 17:23:00 | 显示全部楼层

Re:讨论:效率最高的游戏循环,怎么写?

这么个问题上花这么多时间,精力够充沛的。也蛮无聊的。其实你俩说了那么多,大部分是在斗气。

2

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2007-6-7 08:19:00 | 显示全部楼层

Re:讨论:效率最高的游戏循环,怎么写?

你都别用windows,用linux!!!不用linux也用SDL吧!你在编opengl,又不是directX.

SDL 是这个,SDL_PollEvent()


  1. /* wait for events */
  2.     while ( !done )
  3.         {
  4.             /* handle the events in the queue */

  5.             while ( SDL_PollEvent( &event ) )
  6.                 {
  7.                     switch( event.type )
  8.                         {
  9.                         case SDL_ACTIVEEVENT:
  10.                             /* Something's happend with our focus
  11.                              * If we lost focus or we are iconified, we
  12.                              * shouldn't draw the screen
  13.                              */
  14.                             if ( event.active.gain == 0 )
  15.                                 isActive = FALSE;
  16.                             else
  17.                                 isActive = TRUE;
  18.                             break;                            
  19.                         case SDL_VIDEORESIZE:
  20.                             /* handle resize event */
  21.                             surface = SDL_SetVideoMode( event.resize.w,
  22.                                                         event.resize.h,
  23.                                                         16, videoFlags );
  24.                             if ( !surface )
  25.                                 {
  26.                                     fprintf( stderr, "Could not get a surface after resize: %s\n", SDL_GetError( ) );
  27.                                     Quit( 1 );
  28.                                 }
  29.                             resizeWindow( event.resize.w, event.resize.h );
  30.                             break;
  31.                         case SDL_KEYDOWN:
  32.                             /* handle key presses */
  33.                             handleKeyPress( &event.key.keysym );
  34.                             break;
  35.                         case SDL_QUIT:
  36.                             /* handle quit requests */
  37.                             done = TRUE;
  38.                             break;
  39.                         default:
  40.                             break;
  41.                         }
  42.                 }

  43.             /* draw the scene */
  44.             if ( isActive )
  45.                 drawGLScene( );
  46.         }
复制代码


我本人以为,100是  O(100) = 1。 想想,很少会有100msg...

重要是看那理慢,该那了加速!Windows MSG不是你的bottle neck!






您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-25 17:14

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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