小编Ant*_*ony的帖子

C#如何提高Direct2D绘图的效率

早上好,

我已经在C#中教自己一些Direct2D编程,利用可用的本机包装程序(当前使用d2dSharp,但也尝试过SharpDX)。但是,我遇到了效率问题,在这种情况下,基本绘图Direct2D绘图方法大约需要250毫秒才能绘制45,000个基本多边形。我所看到的性能与Windows GDI +相当,甚至更低。我希望有人可以看看我所做的事情,并提出一种可以极大地缩短绘画时间的方法。

这样做的背景是我有一个个人项目,正在开发一个基本但功能强大的CAD界面,该界面能够执行各种任务,包括2D有限元分析。为了使它完全有用,该界面需要能够显示数以万计的基本元素(多边形,圆形,矩形,点,弧形等)。

最初,我是使用Windows GDI +(System.Drawing)编写绘图方法的,直到在任何给定时间在屏幕上达到大约3,000个元素之前,性能都相当不错。用户每次平移,缩放,绘制新元素,删除元素,移动,旋转等时,都必须更新屏幕。现在,为了提高效率,我利用四叉树数据结构来存储我的元素,而我只绘制实际在控制窗口范围内的元素。这在放大时有很大帮助,但是很明显,在完全缩小并显示所有元素时,没有什么区别。我还使用计时器和刻度事件以刷新率(60 Hz)更新屏幕,因此我没有尝试每秒或每次鼠标事件更新数千次。

这是我第一次使用DirectX和Direct2D进行编程,因此我肯定在这里学习。话虽如此,我已经花了几天的时间回顾教程,示例和论坛,但发现没有什么帮助。我尝试了十二种不同的绘制,预处理,多线程等方法。我的代码如下

代码遍历和绘制元素

List<IDrawingElement> elementsInBounds = GetElementsInDraftingWindow();

_d2dContainer.Target.BeginDraw();
_d2dContainer.Target.Clear(ColorD2D.FromKnown(Colors.White, 1));

if (elementsInBounds.Count > 0)
{
    Stopwatch watch = new Stopwatch();
    watch.Start();

    #region Using Drawing Element DrawDX Method

    foreach (IDrawingElement elem in elementsInBounds)
    {
        elem.DrawDX(ref _d2dContainer.Target, ref _d2dContainer.Factory, ZeroPoint, DrawingScale, _selectedElementBrush, _selectedElementPointBrush);
    }

    #endregion

    watch.Stop();
    double drawingTime = watch.ElapsedMilliseconds;
    Console.WriteLine("DirectX drawing time = " + drawingTime);
    watch.Reset();
    watch.Start();

    Matrix3x2 scale = Matrix3x2.Scale(new SizeFD2D((float)DrawingScale, (float)DrawingScale), new PointFD2D(0, 0));
    Matrix3x2 translate = Matrix3x2.Translation((float)ZeroPoint.X, (float)ZeroPoint.Y);

    _d2dContainer.Target.Transform …
Run Code Online (Sandbox Code Playgroud)

c# direct2d

6
推荐指数
1
解决办法
672
查看次数

标签 统计

c# ×1

direct2d ×1