EndDraw()在Direct2D中占用80%的工作时间

时间:2013-09-02 14:53:26

标签: c# c++ windows-store-apps direct2d

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

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

我只是按照以下示例链接来实现我的方案。

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

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

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

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

ID2D1TransformedGeometry *m_pTransformedGeometry;

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

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

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

有没有办法显着提高此效果

enter image description here

你能帮助我吗?

此致 大卫C

2 个答案:

答案 0 :(得分:2)

这是慢性能和时间花费之间的差异。

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

88.2%的人告诉你,你只花了更多的时间来绘制这些东西,而不是做其他事情。

使用计时器确定您的抽奖是否缓慢。

答案 1 :(得分:0)

“我只是将转换和缩放矩阵设置为 TransformedPathGeometry而不是为每个 每次。”

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