×
Namespaces

Variants
Actions

深度解析QML的实现原理

From Nokia Developer Wiki
Jump to: navigation, search

Delete instructional text in italic

This article explains how to ... Replace the abstract text with a short paragraph (or sentence) describing what the topic covers.

Enter article metadata as described below. Note that this template can be placed anywhere in the article. Do not remove parameters that you do not use

Article Metadata
Article
Created: ()
Last edited: renlin (29 Feb 2012)

Contents

Introduction

本文研究QML的实现原理,探讨QML和Qt的Graphics System ,以及OpenGL的关系。关于QML和C++的交互机制参考QML与Qt C++ 交互机制探讨与总结.

内容

以以下简单代码为例:

Rectangle{
Image{
source:“test.png”
width:parent.width
height:parent.height
}
Text{
text:"Hello Qt"
}
}

在上述代码中用到了QML的Rectangle、Image、Text 这些Element,当我们运行这段qml代码时,QDeclarativeEngine开始根据解析方法(parser)解析这些元素,经过解析发现这些元素对应的C++类分别是QDeclarativeRectangle,QDeclarativeImage,QDeclarativeText,而这几个C++类的父类都是QDeclarativeItem,QDeclarativeItem的继承了QGraphicObject,QGraphicObject继承自QObject和QGraphicsItem, 走到这里的时候我们就看到了熟悉的QGraphicItem,我们知道它由是QGraphicsScene来管理,QGraphicsView来呈现的,而追本溯源,QGrapphicsView是QWidget的子类,QPainter来画出屏幕上每个像素的内容。
那么QPainter在画出每个像素内容的方式就会取决于我们的硬件,可能是Raster、OpenGL,OpenVG等等,当我们实现OpenGL时,会有GPU进行图形加速处理,这里所有要显示的数据都将从Frame Buffer读取。所以当我们在应用中使用大量的大容量的图片时,应用的响应速度会变慢。但这并不能说明QML语言是不可取的,相反,我们推荐用QML实现UI。

优化QML

根据QML的实现原理,我们就能找到优化运行速度的方法。
1,使用Loader动态加载
2,避免使用大量的大容量图片
3,用Opacity或者visible属性
当我们的应用充满了许多的模块时,大部分模块并不是程序加载时就需要显示出来的,如果我们一次加载就会将所有数据都读入Frame Buffer中,这使得运行速度变慢,而用Loader动态加载,在需要时再将模块读入Buffer。同时,我们在应用程序设计之初就尽量避免使用大量的大容量图片。而使用Opacity=0会使不显示的内容不被加载到buffer中。而在开发中是使用Loader或是OPacity等属性更有效,取决于应用的实际情况。

相关链接

Add categories below. Remove Category:Draft when the page is complete or near complete

This page was last modified on 29 February 2012, at 09:11.
82 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×