原作者:林斌
邮箱:richard.lin@qt.io
Qt Quick性能优化
- 使用事件驱动
- 避免定时轮询
- 使用信号与槽
- 使用多线程开发
- C++多线程,QThread,或者C++11线程
- Qml WorkerScript 元件
- 使用 QtQuickCompiler
- 在项目管理文件.pro文件中添加一行
- CONFIG+=qtquickcompiler
- 注意:qtquickcompiler的作用是第一次启动程序时,将qml文件编译成二进制的qmlc格式。在qt5.10版本默认打开。
- 注意:Qt5.12会有新的qml代码生成器,性能比QuickCompiler更好。
- 避免使用CPU渲染的元件
- Canvas
- Qt Charts
- 使用异步加载
- 图片异步加载
- qml的Image元件有异步加载属性asynchronous,默认为false,设置为true就是异步加载。
- 使用C++ 处理大数据加载。
JavaScript Code 关于 JavaScript的优化使用
-
属性绑定
-
QML 优化了引擎,简单的表达式不会启动JavaScript,比如x: 10 + 2 * 5 这种可以即时计算的表达式,QML引擎会直接计算出结果x:20.
-
避免声明JavaScript中间变量
-
避免在即时求值范围外访问属性(immeediate evaluation scope: 绑定表达式所在对象的属性,组件中的id,组件中的根元素id)
-
需要用到属性进行运算时避免直接写操作。
-
-
属性解析
- 避免频繁访问属性(在QML Profiler看到的调用频率比较高的部分,要尤其注意不要进行属性访问)
Qt Quick图片和布局优化
-
降低图片加载时间和内存开销
- 异步加载
- 设置图片尺寸
-
锚定布局
- 在元素布局时,使用anchors锚布局比属性绑定效率更高。
- 坐标>锚定>绑定>JavaScript函数。
元素生命周期设计
- 使用Loader动态加载和卸载组件
- 使用active属性,可以延迟实例化
- 使用source属性,提供初始属性值
- asynchronous异步属性设置为true,在组件实例化时可以提高流畅性。
渲染注意事项
- 避免使用Clip属性(默认禁用),剪切损失性能
- 被覆盖不可见的元素设置visible属性为false,通知引擎不绘制
- 透明与不透明,不透明效率更高,全透明时设置为不可见。
使用Animation而不是Timer
- Qt优化了动画的实现,性能高于定时器触发属性的改变Timer触发动画的方式性能低下,更耗电