游戏开发论坛

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

关于"终极优化你的游戏 —— 使用脏矩形技术&q

[复制链接]

5

主题

41

帖子

41

积分

注册会员

Rank: 2

积分
41
发表于 2005-11-3 19:48:00 | 显示全部楼层 |阅读模式
首先对作者的研究精神表示敬意和佩服,不过我也发表一下我个人的看法:
据我所知加入让我优化一个程序的话,我首先考虑的是怎样避免出现在比较极端情况下游戏卡(帧数低)的问题,比如屏幕上有较多的精灵动画或者移动的时候一般都是最卡的,但是使用脏矩形技术的话最终的效果还是全部重绘,可是同时增加了脏矩形算法的额外开销,这样在这种情况下会造成更加卡的问题,甚至根本就无法玩的情况。当然这主要还是看游戏里的具体情况,假如我们的游戏不存在这种极端情况,那样的话使用脏矩形技术是不错的选择,好像小游戏比较多!

32

主题

56

帖子

61

积分

注册会员

Rank: 2

积分
61
发表于 2005-11-4 20:39:00 | 显示全部楼层

Re: 关于"终极优化你的游戏 —— 使用脏矩形技术"

赫赫,整个计算耗费的时间不会有想象中那么长的啦~
毕竟这个计算比memcpy,memset之类的内存操作要节省不少时间了~
而且不管有多少个物体,这个算法所画出来的就是最优化的部分,所以效率问题是绝对没有问题的:)
这样说吧,有1000个精灵在屏幕上,精灵的动作帧假设为每一秒钟5个动作(已经足够快了吧??)那帧的延迟就是200毫秒,而假如屏幕刷新为30fps的话,也就是延迟33毫秒,算下来也就是200/33~=7屏幕刷新7次才更新一次这个精灵的数据,节约下来的时间是非常多的:)有遮挡的情况下也一样推理,只有更新以后才会重新绘制~
就算精灵一直在移动也没有问题的,星际这个即时战略游戏有很多移动的精灵了吧?使用了这种技术不会把程序变慢的拉~恰恰相反,一定会取得比较好的效果:)

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2005-11-4 20:50:00 | 显示全部楼层

Re:关于"终极优化你的游戏 —— 使用脏矩形技术"

效果不错。。。尤其针对现实慢的移动设备

5

主题

41

帖子

41

积分

注册会员

Rank: 2

积分
41
 楼主| 发表于 2005-11-4 22:25:00 | 显示全部楼层

Re:关于"终极优化你的游戏 —— 使用脏矩形技术"

你说的也有一定的道理,但是还需要考虑不是每个精灵都是在你的200ms间隔的时间一起动一下,可能是异步的。
最近刚好在做一个游戏,准备考虑使用你这种方法做一个尝试,这对地图上的图素的组织是一个比较大的考验,呵呵。。

感谢kylinx!!!

32

主题

56

帖子

61

积分

注册会员

Rank: 2

积分
61
发表于 2005-11-5 10:34:00 | 显示全部楼层

Re: 关于"终极优化你的游戏 —— 使用脏矩形技术"

赫赫,异步的也没有关系的,随便举一个简单例子,比如:
class CSprite
{
virtual void OnRender( )
{
      DrawSprite();
      
}
virtual void OnResetDirtyRectFlag( )//不一定需要这个函数,由你实现的RenderManager而定
{
     m_bIsDirty = false;
}
virtual void OnUpdate( timeStamp )
{
      TotalUpdateTime+= timeStamp;
       if(  TotalUpdateTime > FrameDelay )
      {
                CurrentFrame++;
               m_bIsDirty = true;
              TotalUpdateTime  = 0;
     }
   
}

int           TotalFrames;
int           FrameDelay, TotalUpdateTime;
int          CurrentFrame;
bool       m_bIsDirty;
};

Update之后,如果精灵需要更新的话,设置脏矩形标志,也就是说这个精灵需要重新绘制,在绘制之后清除脏矩形标志~(比如用来清除脏矩形标志的OnResetDirtyRectFlag函数,未写入文章里面,调用的位置看你实现的RenderManager而定拉)

32

主题

56

帖子

61

积分

注册会员

Rank: 2

积分
61
发表于 2005-11-5 10:41:00 | 显示全部楼层

Re:关于"终极优化你的游戏 —— 使用脏矩形技术"

这样当然要用心设计渲染物体的组织拉
因为下面这种方式就不能用这种技术了:
while( 1 )
{
   DrawLowLayerMap();
  DrawSprite();
  DrawMapMask();
  DrawOthers();
  DrawFPS();
  ....
}

5

主题

41

帖子

41

积分

注册会员

Rank: 2

积分
41
 楼主| 发表于 2005-11-5 13:20:00 | 显示全部楼层

Re:关于"终极优化你的游戏 —— 使用脏矩形技术&am

我现在准备做的游戏有以下几层:
1.地下物,比如水,空中城市中的云彩等。
2.地表砖块。
3.精灵,地表上的建筑。
4.魔法特效。
5.说话的文字等。
6.界面等顶层物件。

这么多层,再加上玩家的移动造成地图卷动从而使所有矩形的偏移,还有某个精灵的消失和出现,前后帧之间的比较就会变的很复杂,我也观察了一些比较大的角色扮演类游戏,假如使用了这种方法的话在主角静止的时候占用CPU应该是接近0,但是实际上它和主角在移动等时候没有多大的差别,我相信不是他们没有想到这种脏矩形方法,而是这种方法实现后可能会的不偿失或者某些功能受限制--(我个人的猜测)

不知道其他各位大虾们对这个有何看法?

36

主题

382

帖子

498

积分

中级会员

Rank: 3Rank: 3

积分
498
发表于 2005-11-5 14:24:00 | 显示全部楼层

Re:关于"终极优化你的游戏 —— 使用脏矩形技术"

目前,大多数online ,rpg , 游戏。一动就是全屏的。
如果屏幕都不动,那比较像打麻将之类的。
至于很久以前那种rpg比较少见了。
而那种打麻将的游戏,怎么样做,1000帧,和20帧的结果我看也没什么区别。

脏矩形技术是在以前机器性能不够用的时候搞出来的,
随着计算机能力提升,已经渐渐的不用了。
现在又搞出来,感觉怪怪的。


32

主题

56

帖子

61

积分

注册会员

Rank: 2

积分
61
发表于 2005-11-5 19:18:00 | 显示全部楼层

Re:关于"终极优化你的游戏 —— 使用脏矩形技术"

赫赫,并非大型游戏就使用了这个,的确,现在机器配置越来越高了,
所以现在关注优化的人也就少了~
不过写这篇文章只是本人个人爱好而已啦,再说不管机器配置如何,追求优化这一点我还是不会改变的~:)

至于zjdyhyb说的内容,看来你还是没有很好的理解这个技术~,并非所有大型游戏的技术都是先进的。。。。。。。

17

主题

165

帖子

167

积分

注册会员

Rank: 2

积分
167
发表于 2005-11-9 10:26:00 | 显示全部楼层

Re:关于"终极优化你的游戏 —— 使用脏矩形技术"

问问kylinx兄,
我在一个窗口程序中使用您的方法,出现几个问题,请求解决.
就是获取DirtyRect,在窗口程序中这个窗口被另一个窗口程序占据了一部分,那一部分就脏了.
而这个脏了的RECT不属于任何一个对象.
我如何获取这个RECT呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-22 15:10

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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