该文转自:
http://hi.baidu.com/coolzdp/blog/item/0b4fcc1b08fda8fdae5133f7.html
(1)为什么需要overlay:
为什么需要overlay? overlay产生的原因是:1,避免在vertical blank时flip/blt surface造成的画面"撕 裂"现象; 2,使硬件可以窗口模式下使用flip而不是blt,从而提高效率. 3D游戏里面它没有什么用的上的地方, 因为一般硬件不支持 render to overlay surface, 2D游戏一般也不用它, 因为象素格式问题, 从RGB的surface blt到YUV的 surface时需要硬件花时间去转换, 除非游戏里所有的其他surface也用YUV.
注: 一般硬件overlay surface只支持YUV和其他一些FOURCC的格式, RGB的一般不支持. "倘若要将一种YUV格式的图象覆盖显示到一个自定义的窗口", 做到这个很容易的, 只需要创建一个和自定义窗口大小和位置都相同的overlay surface即可, 窗口的大小位置改变时, 此overlay也跟着改变. 一般视频播放软件就是这么做的. 但overlay是比较宝贵的资源, 如果仅仅是为了画一个如"动画按钮"之类的东西就用它也太浪费了点, 一般的硬件只能同时显示一个overlay surface, 多了也没必要.
(2)DirectDraw里面PrimarySurface的Blt方法和Flip方法有什么区别呢?
blt 可以用于大小不相同的表面,可以使用 color key 等等。blt 是将一个表面的内容复制到另一个表面,相当与 memcpy,当然显卡可能有硬件加速。
flip 只是交换了了指针,将当前显示表面的指针指向flip链中的下一个表面。对于更新主显示表面来说,flip应该比 blt要快 Blt适合全屏和窗口, Flip只能用全屏。 bltfast是在不需要做图象翻转,放大,缩小时用的,据说,比blt快10%。 flip 就是换页。 blt和bltfast适合窗口和全屏。 flip 必须在全屏下使用。 如果,你做的是全屏游戏推荐用flip。 是基于窗口的游戏推荐bltfast。 其实这非常简单。创建两个表面,一个是主表面,一个是离屏表面(后台)。在表面上进行Blt。完了之后,用Flip翻转到前台。然后继续在后台表面画图。接着再翻转。如此一直进行下去就OK了。 不过Flip只在全屏下有效,而如果你采用Clipper来剪切屏幕的话,就无法进行BltFast操作。所以建议自己编程进行剪切. |