【问题标题】:Custom Direct2D render batch marshaling between managed and unmanaged code托管和非托管代码之间的自定义 Direct2D 渲染批量封送处理
【发布时间】:2013-12-24 09:57:53
【问题描述】:

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

因此,我想知道以轻量级“描述语言”创建某种类型的这些调用的批处理,以将每次屏幕更新的编组调用数量减少到一个是否是个好主意。我正在考虑一种方法,将调用转换为字节数组式表,该表可以一次性发送到 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 进行相应的实际调用.

这种方法可行吗?

【问题讨论】:

  • 在本机代码中解码绘制指令及其参数时会降低性能。
  • 显然。问题是这种惩罚是否小于托管代码中许多单独的绘图调用的编组。

标签: c# c++ marshalling direct2d sharpdx


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2014-07-09
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多