Qml开发中的性能Tips(翻译文)
1.关于图像性能Tips
1.1 位图格式对比矢量图格式
Qt支持任何标准图像格式,包括PNG和JPEG等位图格式,以及SVG等矢量图形格式。与位图图像相比,渲染SVG图像很慢。
1.2 异步加载大图像
如果同步加载图像,则会阻塞UI界面。在许多情况下,图像不需要立即可见,因此它们可以是延迟加载的。
- 如果不需要立即显示图像,则应在单独的线程中异步加载图像。这可以通过将QML的Image异步(asynchronous)设置为true来完成。这样,用户界面就可以保持响应。
- 请注意,此属性仅对从本地文件系统读取的图像有效。通过网络资源(例如HTTP)加载的图像始终是异步加载的。
1.3 避免调整和缩放
- 调整大小/缩放是QML中非常繁重的操作。使用原始大小的图像,而不是调整大小图像的大小/缩放大小。
1.4 大图像使用sourceSize属性
图像通常是QML用户界面中使用占用最大的内存。
- sourceSize 应与大图像一起使用,因为属性设置为加载的图像则存储着实际像素数。
- 如果你有一个很大的图像3264 2448,但你设置了sourceSize为204 153,那么它会缩小并将被存储为204*153的内存。
- 如果图像的实际大小大于 sourceSize ,则缩小图像。 这样,大图像不会占用超过必要的内存;
- 这对于从外部源加载或由用户提供的内容尤为重要。
- 请 注意 ,动态更改此属性会导致重新加载图像源,甚至可能来自网络,如果它不在内存缓存中。
- 图像在内部进行缓存和共享,因此如果多个图像元素使用相同的源,则只加载图像的一个内存。
1.5 仅在必要时启用Image的smooth属性
启用 smooth 属性对性能不利。使用自然大小的图像或禁用动画中的平滑(smooth)处理。
- Image的smooth属性可在缩放或转换时平滑处理图像。
- 平滑处理 提供更好的视觉质量,但速度 较慢 。
- 如果图像以其自然大小显示,则Image的smooth没有视觉效果或性能影响。
- 如果您确实需要启用Image的smooth属性,请在动画开始时禁用平滑处理,并在动画结束时重新启用它(仅当图像在屏幕上静止时,缩放瑕疵才可见)。
1.6 避免由多个元素组成图像
由单个图像组成的图像比由多个元素组成图像效率更高。
- 例如,可以使用放置在提供阴影的图像上的矩形来创建具有阴影的图像。
- 提供包括框架和阴影的图像效率更高。
2.关于列表性能Tips
2.1 确保您的数据模型尽可能快
在许多情况下,慢速模型(slow model)实际上是列表 滚动性能 的 瓶颈 。请确保数据模型尽可能快。
- 视图被轻弹(拖动)时,必须快速创建代理;
- 例如,在单击委托时仅需要的任何其他功能应由 Loader 在 需要时创建 ;
- 在委托中将QML的数量保持在最低水平。委托中的 元素越少 ,视图的滚动速度就 越快 ;
- 在列表委托中,仅将QML用于用户界面,并 使用C++实现 其余部分(例如:数据生成,数据处理)。不要使用JavaScript。
2.2 在ListView/GridView中使用CacheBuffer
在某些情况下, cacheBuffer 在改善ListView/GridView性能方面很有用。默认的 cacheBuffer 为零。
- cacheBuffer 属性确定是否在视图的可见区域之外实例化委托( delegate )。
- 请注意, cacheBuffer 以像素为单位定义,例如: 如果委托高20像素,则 cacheBuffer 设置为40(最多2个委托实例),可见区域下方的2个委托实例可以保留在内存中。
- 设置此值可以 提高 滚动行为的 流畅性 ,但要牺牲额外的内存使用量。数据本身不缓存,但缓存的是实例化委托。
- 对于较短的列表,那么其中每个项都可以缓存。
- 对于较长的列表, cacheBuffer 没有带来好处,因为创建条目的速度与快速滚动时没有缓存的速度相同。 cacheBuffer 只是推迟了问题的发生,也就是说,它只是将委托创建的位置推到列表/网格可见部分的上方/下方。
- 更多关于 cacheBuffer 信息请查看:
http://doc.qt.io/qt-5/qml-qtquick-listview.html#cacheBuffer-prop
2.3 避免无用的绘画
你应该 防止 在同一个区域 重复绘画 。例如,如果您提供了应用程序的背景,则可以防止QDeclarativeView绘制其窗口背景:
QDeclarativeView window;
window.setAttribute(Qt::WA_OpaquePaintEvent);
window.setAttribute(Qt::WA_NoSystemBackground);