对于动态内容非常小的静态场景,WPF性能不佳

时间:2010-08-24 22:39:15

标签: c# wpf performance 3d

我有一个包含64个ModelUIElement3D元素的简单场景,每个element3d Model都是一个具有8个简单几何的模型组,每个几何包含3个材质,漫反射,镜面反射和发射。

所有材料都使用Solid Brushes,因为它是最快的。

几何形状,镜面材料和漫反射材料都是冻结的,以提高性能。

唯一不冻结的是发光材料,我将定期用固体刷更新刷子。

当我运行应用程序并从屏幕中的1536材料(64 * 8 * 3)仅更换一个发光材料时,性能下降非常糟糕,FPS从60FF下降到15FPS。 / p>

即使我在字典中有固体画笔,因此它们被缓存并创建一次。

画笔中的这种变化是使画面中的材料“闪烁”(实际上是快速淡入/淡出)。发光材料中的刷子变化是每20ms。

我看到更换一种材料的刷子或500种材料不会对性能产生任何影响。

我评论更新画笔的行,我获得了一致的60FPS,当我取消注释FPS下降到+/- 15FPS时,尝试了3种不同的机器,4个核心/ 2个核心,非常好的图形卡或中等,几乎没有什么区别,总是在15-25 FPS之间。

我正在使用“Windows Presentation Foundation的性能分析工具”来衡量性能,并且每帧的HW IRT在任何时候都不会超过1。我看到当我选中“脏区更新”复选框时,整个场景每20ms渲染一次,只需更换一个小材料的画笔。

我读到WPF viewport3d不支持脏区域,所以我假设整个场景渲染为最小变化。

如果是这样的话,我可以采取哪些措施来改善这种情况吗?因为我需要创建一个包含数千个UIElements和10万个材质的静态场景,但是这些变化将是如此之小,所以我期待一个良好的性能。

如果每次渲染整个场景而没有机会做任何事情,那么在WPF上创建动态内容是没有用的,我必须采用另一种更复杂的方法作为DirectX。

请注意如何使这项工作受到赞赏,因为我无法相信它不可能与WPF一起使用,并且是我的一些错误。

基本上我需要一个变化很小的大场景,这些变化经常以5到20ms的顺序发生,并且仍然可以获得60FPS,因为很少有三角形材料真正发生变化。

谢谢,

古斯塔沃。

1 个答案:

答案 0 :(得分:0)

我不能直接解决你的问题。但这里有一些线索:

对于面向简单商业图表的WPF 3D来说,1536材料看起来太多了。如果您使用像Direct3D这样的低级API,甚至需要仔细优化,因为在图形驱动程序架构中,它会打到批量瓶颈,特别是对于DirectX 9级驱动程序界面。

为了获得最佳性能,唯一的解决方案是使用低级图形API逐个优化,具有图形硬件怪癖的知识。但对于高级通用3D API,针对每种情况进行优化都是不现实的。它做了一些假设,例如,常见用法应该是导航静态场景。这样它就可以优化和缓存优化的命令队列以获得最佳性能。但是如果场景发生变化,缓存将无效,因此需要重新构建和重新优化。因此,不是导致FPS下降的视口大小,而是优化。

通常,有一种提示机制,通过它可以告诉它哪个子场景图更改而哪些是静态的,以便帮助进行底层优化。但这只是一个暗示。有许多案例使得遵守这一提示变得不可行。并且很难说明原因,因为内部是封装的。