迎风向前,是唯一的方向
移动平台开发:iPhone,Brew等。多媒体方面开发,涉及DirectShow,Direct3D,ffmpeg等

导航

 
Direct3D制作二维界面总结

 

因为工作关系,最近用Direct3D中的二维部分制作了一个软件的界面部分,在这里将其中的感受写下来,与大家分享,也欢迎大家讨论!

GDI与Direct3D简单对比
GDI: CPU占用少,但易产生画面闪烁现象,在现成的函数中,可达到画面效果比起Direct3D少的多。可以用现成的控件,处理消息方便,但受一定的系统限制!对硬件要求低。
Direct3D:由于程序结构的关系,CPU占用高,须采用脏矩形技术(但增加程序复杂性),才可有效降低CPU占用率,不会产生画面闪烁,可较之容易地渲染出华丽的画面!界面与用户的交互,完全靠自己来渲染不同的画面,控制比GDI 复杂,但可以精确地进行处理,达到自己想要的任何效果!对硬件有一定的要求,还需要装相应的运行时库,虽然使用脏矩形,可有效提高响应速度,但不同配置的机器,还是有明显的差别!还需考虑设备丢失问题。

    Direct3D制作的界面,实际为二维图形交互程序。我在刚开始写时,没有经验,便想到一点点来,但现在回想起来,程序结构是非常重要的,因为它不像GDI,有确定的处理方式,它没有现成的框架可用,我们的界面是什么样子的,完全由自己来控制。因此设计部分时一定要考虑周全,我觉得最基本的要求就是:程序易于理解、扩展并且效率高!对某个事件,一定要理解清楚,如鼠标点击某个图形,你可以在鼠标按下时进行处理相应的事件,也可以在鼠标按下再弹起时再处理,这就要分清其区别,这也是看出,比起GDI可进行更好的控制。
    在我的程序中,二维渲染,用的最多的是ID3DXSprite接口IDirect3DDevice9::UpdateSurface()方法(将后备缓冲作为参数) ,到后面基本上都用前一种了。为测试其性能,我仿照ID3DXSprite做过一个自己的精灵类,即创建顶点缓冲进行纹理渲染,在每次调用时,将顶点位置拷入,再进行渲染,发现两者差不多,只是在渲染比较小的纹理且每一帧渲染很多张纹理时,自己做的精灵类要快一些,所以就没有改它。不知大家是否认同?它可容易地渲染出透明的图形,再配合好美工,做出漂亮的界面是不难的!

posted on 2006-11-04 23:46  cyrys  阅读(574)  评论(0编辑  收藏  举报