自定义Direct2D在托管代码和非托管代码之间呈现批处理编组

时间:2013-12-24 09:57:54

标签: c# c++ marshalling direct2d sharpdx

我最近开始使用SharpDX包装器来从C#应用程序获得高性能图形输出。根据其创建者的说法,与使用SharpDX相关的性能损失(他们自己的数字表明通过SharpDX进行比使用本机代码与DirectX接口慢约2倍)主要主要来自于来自绘制调用的绘制调用托管代码到底层API。

因此,我想知道用轻量级“描述语言”创建某些批量调用以将每个屏幕更新的编组调用次数减少为1是一个好主意。我正在考虑一种方法,我将调用转换为字节数组表,可以一次性发送到C ++方法,然后将其解码为适当的本地D2D调用。

例如:

C#中的我的(自定义)布局系统将收集应该为列表中的下一个屏幕更新呈现的所有内容,这样(准描述):

 1. define brush1(color(FF, 00, 00))
 2. define brush2(color(00, FF, 00))
 3. draw ellipse(brush1, origin(0, 0), radius(15, 15))
 4. draw ellipse(brush2, origin(127, 127), radius(255, 255))
 5. draw ellipse(brush2, origin(127, 0), radius(255, 255))
 6. ...

然后可以将此列表编码为字节数组(为简单起见,在此粗略示例中,坐标以字节形式给出):

1. 01 01 FF 00 00
2. 01 02 00 FF 00
3. 10 01 00 00 0F 0F
4. 10 02 7F 7F FF FF
5. 10 02 7F 00 FF FF
6. ...

然后在Render(),这个序列一次性被发送到一个自定义C ++方法(即只有一个编组调用,而不是数百个,可能是数千个),它解析它并对Direct2D进行相应的实际调用API原生。

这种方法是否可行?

1 个答案:

答案 0 :(得分:0)

我写了an application,它使用Direct2D(以及Direct3D)快速绘制函数图。我决定采用不同的方法,并将所有绘图及其背后的控件逻辑编组到本机代码中。这样我就不必传递关于要绘制什么的信息,因为本机代码已经知道了。唯一的性能损失是将数据从托管代码传递到非托管代码,但它们是O(1)s,所以我不担心它们。