gpt4 book ai didi

WPF 渲染速度太慢

转载 作者:行者123 更新时间:2023-12-04 18:05:50 25 4
gpt4 key购买 nike

我在尝试使用 WPF 渲染多条多段线时遇到了一个奇怪的问题(在 2300x1024 Canvas 上,每条多段线有 64 条约 400-500 个顶点)。折线每 50 毫秒更新一次。

出于某种原因,我的应用程序 UI 变得非常缓慢,几乎对用户输入没有响应。

我正在使用后续类(class)以避免在显示时更新点集合:

class DoubleBufferPlot
{
/// <summary>
/// Double-buffered point collection
/// </summary>
private readonly PointCollection[] mLineBuffer =
{
new PointCollection(),
new PointCollection()
};

private int mWorkingBuffer; //index of the workign buffer (buffer being modified)

#region Properties

//Polyline displayed
public Polyline Display { get; private set; }

/// <summary>
/// index operator to access points
/// </summary>
/// <param name="aIndex">index</param>
/// <returns>Point at aIndex</returns>
public Point this[int aIndex]
{
get { return mLineBuffer[mWorkingBuffer][aIndex]; }
set { mLineBuffer[mWorkingBuffer][aIndex] = value; }
}

/// <summary>
/// Number of points in the working buffer
/// </summary>
public int WorkingPointCount
{
get { return mLineBuffer[mWorkingBuffer].Count; }

set
{
SetCollectionSize(mLineBuffer[mWorkingBuffer], value);
}
}
#endregion

public DoubleBufferPlot(int numPoints = 0)
{
Display = new Polyline {Points = mLineBuffer[1]};

if (numPoints > 0)
{
SetCollectionSize(mLineBuffer[0], numPoints);
SetCollectionSize(mLineBuffer[1], numPoints);
}
}

/// <summary>
/// Swap working and display buffer
/// </summary>
public void Swap()
{
Display.Points = mLineBuffer[mWorkingBuffer]; //display workign buffer

mWorkingBuffer = (mWorkingBuffer + 1) & 1; //swap

//adjust buffer size if needed
if (Display.Points.Count != mLineBuffer[mWorkingBuffer].Count)
{
SetCollectionSize(mLineBuffer[mWorkingBuffer], Display.Points.Count);
}
}

private static void SetCollectionSize(IList<Point> collection, int newSize)
{
while (collection.Count > newSize)
{
collection.RemoveAt(collection.Count - 1);
}

while (collection.Count < newSize)
{
collection.Add(new Point());
}
}
}

我在屏幕外更新工作缓冲区,然后调用 Swap() 以显示它。所有 64 条折线 (DoubleBufferPlot.Display) 都作为子项添加到 Canvas。

我使用 Visual Studio Concurrency Analyzer 工具查看发生了什么,发现每次更新后主线程花费 46 毫秒执行一些与 WPF 相关的任务:System.Widnows.ContextLayoutManager.UpdateLayout() 和 System.Windows.Media.MediaContex 。使成为()。

我还发现还有一个线程几乎在不停地运行渲染wpfgfx_v0400.dll!CPartitionThread::ThreadMain...wpfgfx_v0400.dll!CDrawingContext::Render...等等

我阅读了很多关于 WPF 的文章,包括:Can WPF render a line path with 300,000 points on it in a performance-sensitive environment?还有这篇文章 http://msdn.microsoft.com/en-us/magazine/dd483292.aspx .

我(或者我的公司)试图避免使用 DrawingVisual,因为项目的其余部分使用 WPF 形状 API。

知道为什么这么慢吗?我什至尝试禁用抗锯齿 (RenderOptions.SetEdgeMode(mCanvas, EdgeMode.Aliased)),但它并没有太大帮助。

为什么布局更新需要这么长时间。谁是 WPF 内部专家?

非常感谢。

最佳答案

在尝试了包括 DrawingVisual 在内的不同方法后,似乎绘制具有这么多顶点的多段线效率太低。

我最终采用了仅当每个像素有 1 个或更少顶点时才绘制多段线的方法。否则,我手动渲染到 WriteableBitmap 对象。这出人意料地更有效率。

关于WPF 渲染速度太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26896207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com