Direct2D 1.3 批精灵

D2D 新成员 - SpriteBatch

两个月没写代码, 回来发现D2D更新了一个新的接口ID2D1DeviceContext3, 看了看文件是在d2d1_3.h, 同ID2D1DeviceContext2属于d2d 1.3, 但是刚出来时没用它的原因是个提供的方法不够吸引人,除了一个高性能渲染几何对象的方法,不过还不如继续d2d 1.1,操作系统还支持的广一些。不过,这将画上句号,Win10 TH2的这个新接口虽然只有两个方法,但是让无HLSL的纯D2D游戏成为可能.

高性能带来的更多可能性

先看看相关方法:

  • ID2D1DeviceContext3::CreateSpriteBatch
    简单粗暴的一个方法,看似可以用工厂来创建,不过这也暗示SpriteBatch是一个设备相关的资源.
  • ID2D1DeviceContext3::DrawSpriteBatch
    渲染,需要提供相关的位图,可以看作模型绑定的纹理。其实内部实现肯定也是类似的,不过2D的都在一个平面而已。
  • ID2D1SpriteBatch::AddSprites method
    最直接的方法,添加一些精灵, 后面参数感觉有点坑。
  • 后面的就不说了
    简单的说每个精灵有4个属性,源矩形目标矩形以及颜色,还有个是转换矩阵,个人感觉不是很重要的,毕竟穿同一条裤子(bitmap)。颜色用来渲染例子效果,这将是很重要的一个属性。

DrawSpriteBatch vs DrawBitmap

不考虑粒子效果了,之前例子效果必须仔细手写HLSL, 用d2d特效又受限于种类、自生实现效率, 用d3d11交互又受限于设备切换带来的效率问题。
2D游戏中,背景、地图经常是一张一张拼起来的,称为Tilemap, 之前可以用ID2D1RenderTarget::DrawBitmap这个最基本的方法渲染这个,但是效率简直不可看, 1.6W个Tile测试结果如下:


DrawBitmap

  1. 截图:

    一共128x128个格子,1.6万+个精灵
  2. CPU占用:
    Direct2D 1.3 批精灵_第1张图片
    2核4线程CPU, 占用30%,基本一个核占满了(这里GPU占用意义不大.就不测试了)
  3. FPS显示:
    看左上角,第一个是瞬间fps, 第二个是30帧平均fps, 差不多就是50fps
  4. Drawcall次数:
    Direct2D 1.3 批精灵_第2张图片
    估计有几百次了吧!

DrawSpriteBatch

1.截图:

2. CPU占用:
Direct2D 1.3 批精灵_第3张图片
低了一个数量级,根本无法比!
3. FPS显示:
不用说,左上角流畅的60fps
4. drawcall次数:
Direct2D 1.3 批精灵_第4张图片
去除最后那次渲染文字,仅仅两次drawcall!

也就是效率瓶颈在于drawcall次数上(于是我猜测如果是CPU渲染,fps差不多, 但是实际上一个20fps, 一个40fps)。


最后测试代码在github上,方便大家在线浏览.

你可能感兴趣的:(Direct2D)