浅谈 DirectX 封装


  云风接触 DirectX 的时间不算太短, 但使用也不多. 用 DirectX 不顺手的原因之一在于没有好点的机器跑 VC, 之二在于没有很好的封装 DirectX. 就我自己对 DirectX 的看法, 就把它当成一个硬件的驱动程序, 实际提供给我们写游戏程序的实质功能其实不多, 不过这正和我心意, 比如我就不喜欢用 M$ 的 MFC, 有了基本功能足以, 写 DirectX 程序才算找回 在 DOS 下编程的一点乐趣.

  话说回来, DirectX 里连处理图形, 声音文件的东西都没有, 实在不方便, 还是做个封装来的一劳永逸. 记得做的比较好的有 CDX, WinAllegro 等. 不过自己做也许更有趣, 况且现成的封装程序, 往往注重全面, 没有自己有针对性的做来的东东精悍. 比如我们不用 256 色模式, 便可不做那个部分; 不需要支持更多的图形格式, 就写一 BMP 的支持足以... 本文简单谈下我对 DirectDraw 做的封装, 云风这个人很固执, 一些观点难以纠正过来, 如果不赞同文中观点, 请不必与我理论 ;-) 不看就是了.

  本人不喜 C++, 虽然据说比 C 慢不了多少, 编译出来的东东比 C 的大不了多少, 可我就是不喜欢, 但瞧它编译速度这点, 就不用它, 至少在底层的封装上不用, 至于 C++ 有利于合作开发程序, 所以写商业游戏时 还是推荐用这个的, 不过就这个原因, 足够让我不使用 CDX 了; 另外我讨厌 M$ 的东东, 连带的 DirectDraw 里的那个 Surface 的概念也讨厌. 上面两点前因, 所以我的 DirectDraw 封装里, 不想过多的使用 Surface. 使用 Surface, 最大的好处可能在于能使用 硬件加速, 而硬件加速最基本的是使用显存保存位图, 其他的我暂时都不敢使用, 万一有的显卡不支持, 恐怕会弄巧成拙. 而显存间的快速传输, 能给我们带来多大好处? 显存的大小有限, 目前还有很大一部分人使用着 1M 显存的显卡, 这时, 在显存里创建两个 640x480x16bit 的 Surface 都不够, 将一些常用的精灵图片保留在显存里更是天方夜谈, 区区几M 显存无论如何也不够分的, 何况, 我们的许多精灵图片将采用 RLE 压缩, 恐怕再想使用硬件加速就难了; 如果再想加入 Alpha 通道, 在硬件不支持的情况下读写显存的操作只会比 内存更慢; 加上我们对 Surface 本身的操作可能会很多, 每次 LOCK UNLOCK 的操作叫我异常难受; 最后, 任务切换时造成的 Surface Lost 真是麻烦事. 种种因素, 我看还是放弃使用 Surface 算了.

  我的观点是, 建立一个简单的 Win32 程序, 创建窗口和主表面, 然后不再使用 Win 的东东(比如消息循环什么的). 不使用 flip 操作, 而改用 DOS 下传统的 Double Buffer. 我们不使用 DirectDraw 里的 Surface 相关 API, 全部使用自己的位图格式, 唯一需要和其打交道的 仅是将 Buffer 内的数据 Blit 到主表面而已. 这样可能省去不少麻烦, 比如可以自由的操作位图, 而不用先 Lock; 表面丢失近可能发生在主表面, 而恢复表面仅仅将屏后缓冲的内容重新传输一遍就可以了. 可惜不能再用现成的 API 输出文字, 不过这个不算困难, 本来我们就需要自己动手的 ^_^ 经过这样封装后, DirectX 的初始化, 结束, 和任务切换后的恢复表面的工作 都可以封装起来, 我们的游戏的编写又有了 DOS 下那种独占系统的快感, 不必再理会 Windows 下的种种麻烦 ;-)

  云风这几天正是在从事这个工作, 请大家等待我的成果了