4

我的 Direct2D 应用程序面临一个严重的性能问题。我利用 Direct2D 使用 PathGeometry 绘制图形,以获得更好的性能并在 Windows 8.1 中实现清晰的渲染。

在创建 DeviceResources 时,我使用 Factory 接口创建 PathGeometry。然后我设置图形点以在输出表面中绘制我的图形。最后呈现的 ImageSource 将用作 XAML 中我的 Image 元素的源。

我只是按照下面的示例链接来实现我的场景。

http://code.msdn.microsoft.com/windowsapps/XAML-SurfaceImageSource-58f7e4d5

上面的示例帮助我从 Direct2D 获取 ImageSource 输出并最终在 XAML/C# 应用程序中使用。

让我们来解决我的问题。我在我的 Windows Store 应用程序的单个页面中使用了超过 24 个图表。该图表允许用户在左右位置进行操作,还允许缩放到特定的缩放级别。

因此,每当用户尝试操作图形时,我只需将 Translation 和 Scaling 矩阵设置为 TransformedPathGeometry,而不是每次都创建新的。

ID2D1TransformedGeometry *m_pTransformedGeometry;

pFactory->CreateTransformedGeometry(graphgeometry, combinedMatrix, &m_pTransformedGeometry);

最后,我使用 DrawGeometry 方法绘制了 TransformedGeometry。

我使用 VisualStudio2013 中的性能分析工具检查了我的应用程序。我可以看到,在特定的 peek 级别,调用 m_d2deviceContext->EndDraw() 方法需要超过 80% 的运行时间。我附上了下面的屏幕截图,以获得更多关于这个性能输出的想法。

有什么方法可以显着提高这种性能

在此处输入图像描述

你能请任何人帮助我吗?

问候,大卫 C

4

2 回答 2

3

缓慢的性能和花费的时间是有区别的。

如果你的 draw 方法比其他部分做更多的工作,可能意味着这个方法很慢,但也可能意味着你的其他部分不需要很多 cpu。

88.2% 只告诉你,你花在画这些东西上的时间比做其他东西的时间多。

使用计时器来确定您的平局是否缓慢。

于 2013-09-02T15:15:59.873 回答
0

“我只是将平移和缩放矩阵设置为 TransformedPathGeometry,而不是每次都创建新矩阵。”

我希望你使用世界变换?否则,您会覆盖指针而不释放它,从而导致内存泄漏。您不能直接更改几何的矩阵,您必须每次都重新创建它,或者如果可以,您将变换应用于整个世界。

于 2020-05-11T20:59:28.607 回答