0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Text元素、Image元素、模型视图和视觉效果优化规则和推荐实践

倩倩 来源:嵌入式小生 作者:嵌入式小生 2022-09-05 11:12 次阅读


开篇

性能优化在行业里永远是一个常谈的话题,该话题里的内容无法用准则来描述啦,而更多的是建议和规则。本文多数内容、观点和建议参考于Qt官方资料并结合自己的实际QML使用习惯总结而成。优化规则并不是“黄金规则”,更不是“金标准”。对于QML应用开发来说,将这些规则根据具体应用场景能合理运用即可啦。

本文内容主要涉及到:Text元素、Image元素、模型视图和视觉效果四个方面的一些优化规则和推荐实践。

性能优化 | Text元素

计算文本的布局会是一个缓慢的操作。所以,在实际开发中尽可能优先考虑使用明文格式,而不是StyledText,这可以减少布局引擎的工作量。如果不能使用明文(例如:需要嵌入图像,或使用标记来指定具有特定格式(粗体、斜体等)的字符范围),那么才考虑使用StyledText

应该只在文本可能是StyledText的情况下使用AutoText,因为这种模式会导致很高的解析成本。除此之外,还不应该使用RichText模式,因为StyledText几乎提供了其所有的特性。

性能优化 | Image元素

在任何软件的用户界面中,图片都是重要组成部分。但是一般加载图片所需的时间、消耗的内存数量和使用方式,都会影响应用程序的性能,在本小结中,描述在实际qml应用开发中,在使用图片时关于性能的几条优化点。

异步加载图片

图片通常非常大,所以最佳的做法是确保加载图片不会阻塞UI线程。将Image元素的asynchronous属性设置为true,用于允许从本地文件系统异步加载图片(注:远程图片总是异步加载的)。

注:当asynchronous属性设置为true时,图片元素将在低优先级的工作线程中加载。

显式设置图片源的属性

如果在应用程序中加载了一个大尺寸的图片,但是却在一个小尺寸的元素中显示它,因此我们应该设置图片的sourceSize属性为被呈现的元素的大小,以确保在内存中保存的是小尺寸的图片,而不是大尺寸的图片。

注:更改sourceSize会导致图像重新加载。

避免运行时拼接

通过在应用程序中提供预合成的图片资源(例如,提供带有阴影效果的元素),可以避免在运行时进行图片合成。

避免平滑图片

对于Image类型,image.smotth用于设置图片的平滑参数,我们在需要时才进行平滑操作。因为在一些硬件上进行图片平滑速度较慢,而且如果图像以原图大小显示,则没有视觉效果,因此也没有意义且影响性能。

避免多次绘制

避免在一个区域多次绘制。在设计qml文件时,使用Item作为根元素,而不要使用Rectangle,以避免多次绘制背景。

性能优化 | 使用Anchor定位元素

使用锚定位比使用绑定更有效率。例如下列代码,

Rectangle{
id:rect1
x:20
width:200;height:200
}
Rectangle{
id:rect2
x:rect1.x
y:rect1.y+rect1.height
width:rect1.width-20
height:200
}

在上述代码中,是使用使用绑定来定位rect2相对于rect1的位置。从性能角度来看,更高效的做法是:

Rectangle{
id:rect1
x:20
width:200;height:200
}
Rectangle{
id:rect2
height:200
anchors.left:rect1.left
anchors.top:rect1.bottom
anchors.right:rect1.right
anchors.rightMargin:20
}

使用绑定定位(通过将绑定表达式赋值给可视对象的x、y、widht和height属性)相对较慢,但是这种方式具有灵活性的优点。

如果布局不是动态的,指定布局最有效的方法是静态初始化x, y, width和height属性。Item坐标总是相对于它们的父节点,所以如果想要与父节点的(0,0)坐标保持固定的偏移,就不能使用anchor。如下面的例子,子矩形对象位于相同的位置,但锚代码显示的效率不如通过静态初始化使用固定定位的代码:

Rectangle{
width:60
height:60
Rectangle{
id:fixedPositioning
x:20
y:20
width:20
height:20
}
Rectangle{
id:anchorPositioning
anchors.fill:parent
anchors.margins:20
}
}

性能优化 | 模型和视图

绝大多数的应用程序至少包含一个向视图提供数据的模型。但是如果数据量较大,将会影响性能,所以我们需要知道在实际开发中如何优化性能,本小节提供几条方法:

自定义C++模型

用C++编写我们的自定义模型,以便在QML中与视图一起使用。此类模型的最佳实现将在很大程度上取决于实际的应用场景,以下是几点准则:

(1)尽可能保持异步。

(2)保证所有的处理都在一个(低优先级)的工作线程中进行。

(3)尽可能在后台批处理操作,以减少I/O和IPC。

注意:建议使用低优先级的工作线程,以将GUI线程被饥饿的风险降到最低(因为这可能会极大程度上影响GUI体验效果)。除此之外,同步和锁机制可能是导致性能变慢的一个重要原因,因此应避免不必要的锁定。

ListModel QML类型

在QML中,优先使用ListModel类型,用于向ListView视图提供数据。该类型足以满足大多数的使用场景了,只要使用正确,ListMode性能也相对较好。在使用中,应注意以下两点:

(1)在工作线程中填充

JavaScript中,ListModel元素可以被填充到一个(低优先级)的工作线程中。我们必须在WorkerScript中显式调用ListModel上的sync(),以便将更改同步到主线程。

注,使用WorkerScript元素将导致创建一个单独的JavaScript引擎(因为JavaScript引擎是属于单个线程),这一点将增加内存使用量。然而,多个WorkerScript元素将使用同一个工作线程,因此一旦应用程序已经使用了一个WorkerScript元素,那么使用第二个或第三个WorkerScript元素对内存的影响就可以忽略不计了。

(2)不要使用动态元素

Qt Quick 2 ListModel中的性能优化主要来自:假定了对给定模型中单个元素中的类型不会更改,因此缓存性能将显著提高。如果类型可以从一个元素到另一个元素的动态变化,则不满足Qt Quick 2对ListModel的优化,而且模型的性能将会差一个数量级。

因此,在默认情况下动态类型是禁用的。必须专门设置模型的dynamicRoles属性,才能启用动态类型(并承受随之而来的性能下降)。因此,如果可以重新设计应用程序来避免使用动态类型,则推荐不要使用动态类型而是去重新设计程序。

视图(View)

视图代理应尽可能简单。在代理中只放置需要QML来显示的必要信息,不是立即需要的附加信息和操作(例如:如果在单击时显示更多信息)应该在需要的时候才创建(即:延迟创建

在设计视图代理时需要注意以下几点:

(1)代理中的元素越少,在视图中创建的速度就越快,因此视图滚动的速度就越快,效果越好。

(2)减少代理中绑定的数量。推荐在代理中使用Anchor而不是绑定来进行相对定位。

(3)避免在代理中使用ShaderEffect元素。

(4)不要在代理中启动Clipping。

可以设置一个视图的cacheBuffer属性来允许异步创建和在可见区域外缓存代理。对于不简单且不太可能在单帧内创建的视图代理,推荐使用cacheBuffer

注:cacheBuffer是在内存中保留额外的代理。因此,利用cacheBuffer获得的值必须与内存使用相平衡。应使用基准测试来找到用例的最佳值,因为使用cacheBuffer会增加内存压力,在极端情况下,会导致视图滚动帧率降低,出现卡顿现象!

性能优化 | 视觉效果

Qt Quick 2允许开发人员和设计人员创建高端的用户界面。因此流动性、动态转换和视觉效果等特性可以在应用程序中发挥巨大作用,但在QML中使用这些特性时必须谨慎,因为可能会影响性能。

动画

通常,动画化一个Item的属性会导致引用该属性的所有绑定都被重新计算。在属性动画过程中的属性绑定被重新计算在实际开发中是必须的;但在一些情况下,可以考虑最好在执行动画之前禁用绑定,然后在动画完成后重新分配绑定。

避免在动画期间运行JavaScript。例如:避免为x属性的动画运行复杂的JavaScript表达式。

在使用脚本动画时应注意,因为这些动画是在主线程中运行的(因此如果它们需要很长时间才能完成,就可能会导致一些动画帧缺失)。

粒子效果

在Qt Quick Particles模块中允许粒子效果无缝集成到用户界面中。每个平台都有不同的图形硬件功能,Particles模块无法将参数限制为硬件能够很好支持的情况。

如果渲染的粒子越多(它们越大),图形硬件就需要越快,才能以60帧/秒的速度渲染,更快的CPU速度才能渲染更多的粒子效果。

因此,在目标平台上测试所有的粒子效果就变得很重要了,用于评估在60fps下渲染的粒子数量和大小。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 图像
    +关注

    关注

    2

    文章

    1082

    浏览量

    40394
  • 模型
    +关注

    关注

    1

    文章

    3140

    浏览量

    48673
  • 线程
    +关注

    关注

    0

    文章

    504

    浏览量

    19638

原文标题:QML性能优化 | 常见界面元素优化

文章出处:【微信号:嵌入式小生,微信公众号:嵌入式小生】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    《DNK210使用指南 -CanMV版 V1.0》第三十三章 image元素绘制实验

    第三十三章 image元素绘制实验 在前面的章节中已经陆续提到了image模块的一些基本使用,从本章开始将通过几个章节详细地介绍image模块的使用,本章将讲解
    发表于 11-04 14:22

    基于LIBS的马铃薯中铬元素定量分析方法研究

    样品,并调整实验参数采集马铃薯光谱数据;然后针对光谱数据中的噪声和基线漂移的问题对光谱数据进行前期处理;最后采用绝对强度法定量分析Cr元素,同时,计算模型评价指标以评估定量性能。通过实验和数据分析,验证LIBS技术的可行性。 二、
    的头像 发表于 10-30 18:11 161次阅读
    基于LIBS的马铃薯中铬<b class='flag-5'>元素</b>定量分析方法研究

    基于LIBS的土壤中铜元素和铅元素定量分析

    利用激光诱导击穿光谱技术对掺杂Cu、Pb元素的土壤样品进行定量分析,寻找最优实验条件。实验使用直接定标法和内标法对元素特征谱线进行拟合,根据计算相关系数及检出限选择合适的数据处理方法。
    的头像 发表于 08-27 14:54 244次阅读
    基于LIBS的土壤中铜<b class='flag-5'>元素</b>和铅<b class='flag-5'>元素</b>定量分析

    TINA-TI导入spice模型失败,提示语法元素错误是哪里出了问题?

    在使用TINA-TI 导入器件的Spice模型时,提示错误语法元素错误,不能导入器件,其spice内容如下:烦请知道,非常感谢! * DRB501VM-40 D model * PKG: UMD2
    发表于 08-09 07:51

    LED机械矩阵屏:打造独特视觉效果视觉盛宴

    一、引言 随着科技的不断发展,LED显示技术也在不断更新和升级。其中,LED机械矩阵屏凭借其独特的视觉效果和灵活的应用场景,成为了新一代的显示设备。本文将为您介绍LED机械矩阵屏的相关知识,帮助
    的头像 发表于 07-29 09:30 357次阅读

    日产2025款逍客中期改款车型上市,内外全面升级

    首先,全新前脸设计引人注目,尺寸巨大的进气格栅采用亮黑色“逗号形元素”,灵感源自“古代日本盔甲的鳞片”,搭配全新下保险杠,视觉效果更佳。
    的头像 发表于 04-17 15:44 1059次阅读

    揭秘第96届奥斯卡最佳视觉效果奖提名影片背后的“魔法”

    第 96 届奥斯卡最佳视觉效果奖提名影片证明了技术的惊人进步正在不断打破电影发展的桎梏。
    的头像 发表于 04-10 10:16 356次阅读

    随机抽取SV数组中的一个元素方法实现

    如果想从一个关联数组中随机选取一个元素,需要逐个访问它之前的元素,原因是没办法能够直接访问到第N个元素。上面的程序示范了如何从一个以整数值作为索引**的关联数组中随机选取一个元素
    的头像 发表于 03-21 10:11 847次阅读
    随机抽取SV数组中的一个<b class='flag-5'>元素</b>方法实现

    请问AD软件中怎么添加不同元素之间的间距规则呢?

    AD软件提供了某一个元素针对其他元素之间的间距规则的设置。
    的头像 发表于 03-21 09:09 1276次阅读
    请问AD软件中怎么添加不同<b class='flag-5'>元素</b>之间的间距<b class='flag-5'>规则</b>呢?

    ​红外材料元素级ZnS高温性能研究

    作为一种重要的中长波红外窗口材料,元素级ZnS具有良好的光学性能和力学性能。目前,高超声速飞行器的发展迫切需要开展元素级ZnS红外窗口的高温性能研究。
    的头像 发表于 01-12 10:02 763次阅读
    ​红外材料<b class='flag-5'>元素</b>级ZnS高温性能研究

    labview怎么查数组中相同元素的个数

    要查找LabVIEW中数组中相同元素的个数,可以使用以下步骤: 创建一个包含要查找的数值的数组。这可以通过手动输入数组元素或从文件/其他数据源导入数组实现。 使用“For Loop”结构来遍历数组中
    的头像 发表于 12-28 16:42 3163次阅读

    图形渲染的技术和原理:探索视觉效果的奇妙世界

    图形渲染是计算机图形学领域的核心技术之一,它通过将三维模型转化为二维图像,实现了各种视觉效果的呈现。无论是电影特效、视频游戏还是虚拟现实,都离不开图形渲染的应用。在图形渲染中,光栅化、光线投射和光线
    的头像 发表于 12-13 08:28 836次阅读
    图形渲染的技术和原理:探索<b class='flag-5'>视觉效果</b>的奇妙世界

    mybatis映射文件的主要元素及作用

    了一些主要的元素,通过这些元素可以定义SQL语句、参数映射、结果集映射等,从而实现灵活而可维护的数据库访问。 namespace namespace元素用于定义映射文件的命名空间,它的作用是为映射文件中的SQL语句创建一个唯一的
    的头像 发表于 12-03 14:56 2768次阅读

    c语言在数组中查找指定元素

    C语言是一种通用的编程语言,广泛应用于各种领域,包括嵌入式系统、操作系统、游戏开发等。在C语言中,数组是一种非常重要的数据结构,用于存储一系列相同类型的元素。查找指定元素在数组中是否存在是一种常见
    的头像 发表于 11-24 10:07 3709次阅读

    python输出list的每一个元素

    使用for循环来遍历列表,并输出其中的每一个元素。接下来,我将详尽、详实、细致地介绍一下Python输出列表的每一个元素的方法,希望能对你有所帮助。 首先,我们需要明确一下什么是列表。列表是一种有序的可变序列,其中可以包含任意类型的元素
    的头像 发表于 11-21 16:16 1469次阅读