脏矩形演示 demo
上个世纪,我在个人主页上发布了风魂。2000 年的时候,我给它加上了脏矩形的支持。之后,就再也没有发布新的版本。
实际上,我经历了好几个游戏项目后,那么久远的代码已经被抛弃不用,但是由于工作原因,新的代码没能公开。现在回首那些老代码,居然发现如此的丑陋不堪。
不过,一些思路还是可以保留下来使用的,其中之一就是脏矩形技术。
早就想用文字写写,后来在写《游戏之旅--我的编程感悟》的时候,总算如愿。遗憾的是,当初我计划为第八章专门配一个 demo 代码,时间和精力的原因没有完成。
这个周末,出于一些考虑,我花了整整一个晚上的时间终于完成了这个 demo 。我想不能太苛求 5,6 个小时内到底能写出多少东西。不过我尽力把它写的好一点,清晰一点。而且在 C 和 C++ 之间,我选择了 C 。这是受最近两年思想的一些变化所影响,向 C 回归是我个人的一些变化。
demo 之所有叫 demo ,是因为它离实用还很远。只是为了说明方法。但是我相信,还是可以在此基础上做的更加完善的。
我把它们贴在了个人空间 里,脏矩形演示 demo 。如果你需要使用这些代码,请留意 wiki 上的版本更新记录,最新的版本一般会有一些 bugfix 。看代码之前,有一些临时组织的 FAQ 可以阅读。这个 demo 并没有追求任何视觉的效果,表象非常的简单。可能,有些代码值得一读是唯一的价值吧。
Comments
终于读懂了云风大哥的代码,谢谢分享。
Posted by: 我是人类 | (24) November 8, 2010 11:26 PM
我觉得那本书不错,你是否能结合您目前的感悟和技术的发展,出个第二版呢?
Posted by: 林俊杰 | (23) June 14, 2009 11:31 PM
struct canvas *c=(struct canvas *)malloc(
sizeof(struct canvas)-sizeof(struct canvas_block)+
sizeof(struct canvas_block)*(nw*nh)
);
===========
这段代码这么malloc的目的就是为了让canvas和canvas_block位于一块连续的内存上,是这样吗???
在这里贴代码讨论,是不是不是很受欢迎啊?
Posted by: Jim | (22) July 4, 2008 03:56 PM
终于读懂你的代码了!!
谢谢分享!!!!!!!!!
Posted by: Jim | (21) July 3, 2008 09:39 AM
前段时间看QT,发现他的Canvas类和你的很像
Posted by: Anonymous | (20) January 17, 2008 01:15 PM
一样的,但是遮挡的优化,还有对滚屏的优化没有做。
Posted by: Cloud
| (19)
December 28, 2007 08:18 PM
请问这个demo和风魂++中脏矩形的思想是一样的么?
Posted by: nothanks | (18) December 28, 2007 07:43 PM
支持云风的做法!
一直以为云风没有发布关于脏矩形的最新代码(除开风魂++那个难吃的代码:)),然而今天上google搜索“脏矩形”,竟然有!简介的实现,优美的风格,虽然代码不多,足够我这个新手学习了。
云风,你是我的偶像!
Posted by: xiaoxiao | (17) November 9, 2007 03:30 PM
我想问一下为什么显存内部之间的数据移动很快 而内存到显存就很慢呢?
是cpu和显存之间有锁存寄存器造成的吗?
还有就是blit()有多快呢?
如果自己重写它会不会有好的收获呢?
不好意思,一次问了这么多
呵呵
Posted by: yjlh1234 | (16) June 26, 2006 06:29 PM
如果硬要说 GDI 比较低效的话,那么应该弄清楚到底机器在 GDI 上或者 DirectDraw 上操作做了些什么,是什么导致了速度差别。单从 Direct 这个单词来谈效率是不成立的。
ps. 这些代码经过改进后,现在用于我们的 3d engine 中。我认为以这为基础可以得到一套很好的 UI 解决方案。
Posted by: Cloud
| (15)
May 25, 2006 01:14 PM
谢谢.
以前写2D最后一步用的是 DDraw .
现在已经改写3D 程序, 没有低档机器测试GDI 实现滚屏的效率了.
有时候也会怀念一下2D 的算法
Posted by: Mike | (14) May 25, 2006 09:44 AM
几乎没有区别,因为这个是简单任务,即使 GDI 要慢一些,自然有它慢的理由。设计者不可能估计设计的低效,况且 GDI 和 DirectDraw 都是存在于 Windows 平台上。
至于 DirectX , 它可以提供直接的显存控制。当我们实现滚屏的时候会有些用处。
Posted by: Cloud
| (13)
May 24, 2006 12:44 PM
请教一下. 2D引擎中, 最后一步的上图用 directDraw 和 GDI, 哪个更好一些?
Posted by: Mike | (12) May 24, 2006 11:29 AM
最近喜欢用 C 道理很简单 :) 其实任何项目经过合理的架构都可以清晰漂亮的用 C 写出来。C++ 本质上是提供了许多语法糖而已。在理解了 C++ 后,如果经常用 C 去写东西,C++ 的功力涨的更快。那些语法糖将用的更好。
Posted by: Cloud
| (11)
May 22, 2006 10:43 PM
有兴趣研究的同学可以把 WM_PAINT 里的 canvas_redraw 调用去掉,然后最小化一下窗口。就可以方便的看到,每帧刷新并没有刷新整个屏幕了。
整个代码有很多优化的余地,但是那样就会使篇幅拉的很长了。
Posted by: Cloud
| (10)
May 22, 2006 10:41 PM
云风大哥,能否请你就这些年来在C和C++之间摇摆写一篇BLOG,给大家介绍一下你的一些想法?我对这个比较感兴趣,很想知道你说的“受最近两年个人思想的一些变化所影响,向 C 回归是我个人的一些变化”倒底是为什么,谢谢!
Posted by: freelancer | (9) May 22, 2006 10:12 PM
代码确实很短,但是我却无法理解。。。。汗!
Posted by: tony | (8) May 22, 2006 09:38 PM
看了文章,真的有些感动。为了这种负负责的态度,我就要说一声好
Posted by: nothanks | (7) May 22, 2006 11:40 AM
同意2楼观点
Posted by: 不空 | (6) May 22, 2006 08:52 AM
新东西其实一直在贴啊,只是没有贴出代码来而已。估计今年做的代码,日后想贴出来至少等三年吧。
Posted by: Cloud
| (5)
May 21, 2006 10:19 PM
多谢云风大哥
太感谢啦,要好好研究研究
Posted by: Anonymous | (4) May 21, 2006 09:53 PM
发现云风总是在用C和C++之间左右摇摆,每一次对C/C++的理解都更深刻了。不过怎么写来写去还是5、6年前的技术啊,贴点新鲜的吧。
Posted by: analyst | (3) May 21, 2006 09:28 PM
楼上的,中国都想你这样的话,完蛋了!看看有多少中国出来的垃圾,都是发现一点东西当宝贝的!
支持云风的做法,没有公开就没有进步!
Posted by: Anonymous | (2) May 21, 2006 05:28 PM
云风大哥技术的东西还是别暴露太多啊,我希望网易的游戏领先
网易的FANS留!
Posted by: 冰河 | (1) May 21, 2006 04:44 PM