通过分析 WPF 的渲染脏区优化渲染性能

栏目: ASP.NET · 发布时间: 5年前

内容简介:在此处编辑 blog.walterlv.com 的博客摘要在计算机图形渲染中,可以每一帧绘制全部的画面,但这样对计算机的性能要求非常高。脏区(Dirty Region)的引入便是为了降低渲染对计算机性能的要求。每一帧绘制的时候,仅仅绘制改变的部分,在软件中可以节省大量的渲染资源。而每一帧渲染时,改变了需要重绘的部分就是脏区。

在此处编辑 blog.walterlv.com 的博客摘要

脏区 Dirty Region

在计算机图形渲染中,可以每一帧绘制全部的画面,但这样对计算机的性能要求非常高。

脏区(Dirty Region)的引入便是为了降低渲染对计算机性能的要求。每一帧绘制的时候,仅仅绘制改变的部分,在软件中可以节省大量的渲染资源。而每一帧渲染时,改变了需要重绘的部分就是脏区。

以下是我的一款 WPF 程序 Walterlv.CloudKeyboard 随着交互的进行不断需要重绘的脏区。

通过分析 WPF 的渲染脏区优化渲染性能

可以看到,脏区几乎涉及到整个界面,而且刷新非常频繁。这显然对渲染性能而言是不利的。

当然这个程序很小,就算一直全部重新渲染性能也是可以接受的。 不过当程序中存在比较复杂的部分,如大量的 Geometry 以及 3D 图形的时候,重新渲染这一部分将带来严重的性能问题。

WPF 性能套件

先下载 WPF 性能套件:

脏区监视

启动 WPF Performance Suite,选择工具 Perforator,然后在 Action 菜单中启动一个待分析的 WPF 进程。虽然 工具 很久没有更新,但依然可以支持基于 .NET Core 3 版本的 WPF 程序。

通过分析 WPF 的渲染脏区优化渲染性能

当程序运行起来后,可以看到 WPF 程序的各种性能数据图表。

通过分析 WPF 的渲染脏区优化渲染性能

现在将 Show dirty-region update overlay 选项打勾即可看到本文一开始的脏区叠加层的显示。

与脏区有关的选项有三个:

  • Show dirty-region update overlay
    • 显示脏区叠加层,每一次脏区出现需要重新渲染时会叠加一层新的半透明颜色。
  • Disable dirty region support
    • 禁用脏区支持。这时,每次渲染都将重绘整个窗口。
  • Clear back-buffer before rendering
    • 每次重绘之前都将清除之前所有的绘制,使用此选项,你可以迅速找到界面中频繁刷新的部分,而重绘频率不高的部分多数时候都是纯黑。

优化脏区重绘

一开始的程序中,因为我使用了模拟 UWP 的高光效果,导致大量的控件在重绘高光部分,这是导致每一帧都在重新渲染的罪魁祸首。

于是我将高光渲染关闭,脏区的重新渲染将仅仅几种在控件样式改变的时候(例如焦点改变):

通过分析 WPF 的渲染脏区优化渲染性能

光照效果可以参见我的另一篇博客:

参考资料


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

用户故事地图

用户故事地图

Jeff Patton / 李涛、向振东 / 清华大学出版社 / 2016-4-1 / 59.00元

用户故事地图作为一种有效的需求工具,越来越广泛地应用于开发实践中。本书以用户故事地图为主题,强调以合作沟通的方式来全面理解用户需求,涉及的主题包括怎么以故事地图的方式来讲用户需求,如何分解和优化需求,如果通过团队协同工作的方式来积极吸取经验教训,从中洞察用户的需求,开发真正有价值的、小而美的产品和服务。本书适合产品经理、用户体验设计师、产品负责人、业务分析师、IT项目经理、敏捷教练和精益教练阅读和......一起来看看 《用户故事地图》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

html转js在线工具
html转js在线工具

html转js在线工具