使用双缓冲区,背景是静态图片,是否很次都要重绘背景?

yndfcd 2003-08-21 09:26:31
我现在做一个小游戏,背景是一个静态的图片,大部分时间只需要绘制局部。

我的做法是每帧先将背景画上去,将后将每个精灵画上去。最后调用Flip来显示,有点速度有点慢,请问有什么方法可以只更新局部?用Clipper可以吗?怎么做?

请高手指点。
...全文
75 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yndfcd 2003-08-28
  • 打赏
  • 举报
回复
多谢各位,我还是自己去试吧。
yndfcd 2003-08-28
  • 打赏
  • 举报
回复
多谢各位,我还是自己去试吧。
yndfcd 2003-08-27
  • 打赏
  • 举报
回复
请问这种方法在初始化的时候是不是要把背景同时画在主表面和后台表面上?
DarthVader 2003-08-26
  • 打赏
  • 举报
回复
楼上正解啊
以前编DOS下游戏的时候 就这么做过
因为没用扩展内存 :(
kofightas 2003-08-26
  • 打赏
  • 举报
回复
就是说更新的时候只blt画面更改的那一部分就行了。这就叫局部刷新。
原来画的东西只要你不去清屏或往上画东西经过flip()是不会变的。没什么问题。
至于算法也不麻烦,只要记录当上一祯的精灵所在的rect,然后对这个rect blt背景页面。再画新的精灵就行
寻开心 2003-08-26
  • 打赏
  • 举报
回复
双缓冲的原理确实是让显示地址一直在变,但是它只是在你所定义的两个缓冲之间来回变化。
一次flip就是把当前的屏幕图像对应的显示内存地址编程了后台,把后台的显示内存地址变化到了当前的屏幕图像的地址。这个交换是显示卡内部进行的。
这种交换可以把当前屏幕图像带到后台的,它只是显示内存指针的交换而不是图像的copy所以速度非常的快。

cywater2000 2003-08-26
  • 打赏
  • 举报
回复
是吗?
我没有试过。
不过我好像记得双缓冲和普通图面是不一样的,它们的显存地址一直在变啊!

不过即使可以,我还是觉得太麻烦了。

还不如在需要的时候保存一帧。
寻开心 2003-08-26
  • 打赏
  • 举报
回复
双缓冲也一样啊。
它是不断在屏幕和后台之间翻转内容,上一帧的内容通过FLIP也会翻转到当前操作的后台上。

只要为每帧记录一个帧号,用来区别是不是前两次就可以了。
cywater2000 2003-08-26
  • 打赏
  • 举报
回复
我说呀,人家用的是双缓冲!!!是要Flip的!!!

怎么只更新部分嘛!!!!

To:楼主:

速度慢肯定是你的内部算法有问题,Copy一张位图到图面上没存在影响速度吧
难道你每次都是从硬盘上读?
你应该把背景读到内存里,用的时候再写到图面上
如果你觉得还是太慢,干脆给"背景"单独建一个“图面”不就行了!
这样Blt不就快了?

不过我觉得还是你其他算法有问题
寻开心 2003-08-25
  • 打赏
  • 举报
回复
可以的。
你需要自己记录精灵的包围盒大小以及上次的位置
在绘制的时候,屏幕上保留的是上一帧的图像,先只更新上次精灵所占据的背景部分的图像,这样就可以把背景还原成为没有任何精灵的状态,然后再重新绘制精灵的新的位置。

当然要看你的精灵的数量,已经在屏幕上的占据空间大小,精灵数量多或者占据空间大的时候这么做就不值得了。
hotness28 2003-08-25
  • 打赏
  • 举报
回复
跟踪精灵位置,局部重话,用Restore();
hesonglin111 2003-08-24
  • 打赏
  • 举报
回复
曾经尝试过,在游戏初始化的时候在primarysurface上画上图片,在游戏主过程中,只画精灵图片,结果没有任何效果。但是在参考了双缓冲程序后,把背景只画一次改成每次更新背景,就可以显示了。我没有对这个技术的确切了解,只是在编程中的感受罢了!
bopengbopeng 2003-08-22
  • 打赏
  • 举报
回复
其实没必要。现在的显卡都很好。
DarthVader 2003-08-21
  • 打赏
  • 举报
回复
用脏矩形
具体方法看这里:
http://www.gameres.com/Articles/Visual/2D/2DSend.htm
——2D游戏图像数据传输的优化技巧

hesonglin111 2003-08-21
  • 打赏
  • 举报
回复
背景是要重画的,至于局部更新好像是不行,应为如果只画一桢,是看不到背景的,所以要时时更新背景,局部更新好像是用在精灵图片的,可以用blt实现。
azheng0305 2003-08-21
  • 打赏
  • 举报
回复
如果你是用GDI做,可以的,呵呵。如果你用directx做的话,问题很大,应该不行,必须一帧一帧的重画。
yndfcd 2003-08-21
  • 打赏
  • 举报
回复
那个说得太粗了,能不能说得具体一点?

8,304

社区成员

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

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