教程20:优化NoesisGUI性能
优化NoesisGUI性能
本部分旨在作为参考指南,介绍提高NoesisGUI性能的方法。
渲染效果
注意
Optimizing1.png为了优化图形性能,XamlPlayer具有一个“统计”面板,可以使用CTRL + F进行切换。此信息也可以在IView界面中以编程方式获得。
抗锯齿
NoesisGUI实现了一种非常快速的抗锯齿算法,可以用来代替GPU全屏抗锯齿。要使用它,您必须在视图中激活PPAA(按原始算法)算法。PPAA通过拉伸使三角形平滑的三角形轮廓来实现抗锯齿。路径虽然略有改变。
尽管取决于硬件,但是PPAA通常比GPU MSAA快很多。我们建议尽可能使用它。我们的应用程序框架默认启用PPAA。
不透明度组
只要有可能,就必须避免元素的不透明度属性,因为它可能导致使用屏幕外的表面。统计面板中的SetRT计数器指示使用的屏幕外表面的数量。
例如,在以下XAML中:
<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Aqua" Width="500" Height="500">
<Rectangle Fill="#FFFF0000" Width="100" Height="100" Opacity="0.50"/>
<Rectangle Fill="#80FF0000" Width="100" Height="100"/>
</StackPanel>
尽管两个矩形的外观相同,但第一个矩形将呈现为屏幕外的纹理,然后将其复制到主表面。当只有一个节点时(例如在此示例中),不要使用这种不透明度非常重要。在这些情况下,最好将alpha传递到笔刷,如第二个示例所示。我们将来可以检测和优化此情况,但最好不要依赖它。
当您使用Brush设置元素的Fill或Stroke时,最好设置Brush.Opacity值,而不是设置元素的Opacity属性。
小费
在XamlPlayer中,Overdraw调试模式(CTRL + O)以红色显示不透明。
批处理
通常,必须使用最少数量的路径。如果您可以折叠同一条路径中的多条路径,这将提高渲染性能,因为发送到GPU的绘制调用(批处理)的数量已降至最低。只要您的内容允许,就执行此操作。即使您不这样做,NoesisGUI也可以通过遵循以下规则来优化批处理数量:
- 单色画笔始终会一起批处理。实心刷子是最快的刷子。尽可能使用它。
- 线性画笔也一起批处理。对应的着色器比纯色着色器复杂一些。如果可能,将线性渐变切换为纯色。
- 仅当使用相同的参数(半径和焦点)时,径向渐变才会成批出现。尽可能减少径向渐变的数量。
- 图像电刷批处理图像时位于相同的纹理(图谱)。
统计面板显示每种画笔的三角形百分比。您还可以在XamlPlayer中激活Batching Debug Mode(批处理调试模式)(CTRL + B),以使用不同的颜色显示每个批处理。
共享资源
尽可能使用字典共享资源。这是减少内存使用量的关键,但提高渲染性能也很重要,因为它使我们可以改进批处理。在Blend中使用资源非常容易,您只需单击资源的白点并选择“转换为新资源...”。
<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid.Resources>
<GradientStopCollection x:Key="grad">
<GradientStop Offset="0" Color="Red"/>
<GradientStop Offset="1" Color="Yellow"/>
</GradientStopCollection>
</Grid.Resources>
<StackPanel>
<Rectangle Width="200" Height="100" Margin="10">
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1"
GradientStops="{StaticResource grad}"/>
</Rectangle.Fill>
</Rectangle>
<Rectangle Width="200" Height="100" Margin="10">
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,0"
GradientStops="{StaticResource grad}"/>
</Rectangle.Fill>
</Rectangle>
</StackPanel>
</Grid>
加载时间
使用多个资源词典来组织样式和资源是一个好习惯。但是请记住,每次在XAML中引用资源字典时,都会加载该字典并重新创建其所有资源。因此,如样式指南中所述,建议将这些词典(如果它们在整个应用程序中一起使用)包含在全局词典中,因此它们仅被加载一次并且始终可以访问。