美文网首页Noesis Gui
教程20:优化NoesisGUI性能

教程20:优化NoesisGUI性能

作者: YottaYuan | 来源:发表于2020-03-14 05:33 被阅读0次

    优化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设置元素的FillStroke时,最好设置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中引用资源字典时,都会加载该字典并重新创建其所有资源。因此,如样式指南中所述,建议将这些词典(如果它们在整个应用程序中一起使用)包含在全局词典中,因此它们仅被加载一次并且始终可以访问。

    相关文章

      网友评论

        本文标题:教程20:优化NoesisGUI性能

        本文链接:https://www.haomeiwen.com/subject/qsdkshtx.html