高效的渲染引擎——Direct2D入门

Direct2D是微软在win7中的新技术,内部采取了3D渲染模式,底层是DXGI,比原来的GDI和GDI+效率大大提高,通过显卡的渲染,图像质量也有大幅度的提升。


目前我正在学习游戏引擎的编程,对于传统2D渲染效率低感觉极为不满意,用3D技术渲染两个三角形+纹理贴图 又略感费事,Direct2D无疑是一个好选择。


支持快速渲染高质量图片,优秀的图元绘制,加上方便的2D矩阵变换,蒙版等特效的应用,为2D图像处理提供了极为便利的操作。


经过一天多的测试,终于了解了Direct2D的基本工作模式,当然以下只是我自己的理解,如有疏漏错误,还请网友指正。


首先说几个Direct2D中的概念

设备无关资源

ID2D1DrawingStateBlock  

ID2D1Factory    //核心工厂,用来创建其他各对象

ID2D1Geometry及继承自它的接口 //常用图元

ID2D1GeometrySink和ID2D1SimplifiedGeometrySink

ID2D1StrokeStyle //常用画线模式

设备无关资源只要创建后,就保存在系统堆内存中,整个程序运行期间都存在,不用时按照COM组件的模式释放即可


设备相关资源

ID2D1Brush及继承自它的接口 //画刷

ID2D1Layer//图层

ID2D1RenderTarget及继承自它的接口

设备相关资源是保存在内存或显存中,如果设备丢失,则必须重建


下面重点介绍RenderTarget

RenderTarget是一个抽象的渲染屏面,和设备的关系最紧密,和DC有点类似

用CreateHwndRenderTarget创建时,要求创建与hwnd所指示窗口,客户区域大小相同的绘图区域,如果大小不符,则整个绘图区域会被自动拉伸或压缩

当窗口大小被改变时,应该调用其resize方法来修改绘图区域大小,以满足用户等比例绘制需要


我看很多网上的程序是将创建设备相关资源放到OnRender一开始,起初我误以为是每次都要创建相关资源,即每次窗口改变都会丢失设备,其实不然,类比Direct3D丢失设备一般发生在以下几种情况:

  • 程序在全屏状态下失去键盘焦点(全屏时按下Alt+Tab或Win+D键或Win+L键)
  • 其他程序进入全屏状态
  • 电源管理事件,比如屏保等
很多大型游戏如果中途用Alt+Tab切换,再换回来会很慢,大多是在创建设备相关资源。

所以我们平时一般不用太担心发生设备丢失,但一个好的程序必须能应对各种问题,下面就说如何解决设备丢失。

从微软的Demo看,我们是在最后渲染结束后,检测HRESURT返回值是否为 D2DERR_RECREATE_TARGET宏

如果是的话,清除当前资源,当下次OnRender时,创建设备相关资源时进行检测,没有资源便创建。



你可能感兴趣的:(Direct2D)