QML引擎的演進,第一部分

原文連接:Lars Knoll – Evolution of the QML engine, part 1後端

QML做爲一項技術對於Qt的成功變得愈來愈重要。它容許建立流暢的動畫界面,與現今的市場預期相符。有三個主要的特性使得它更適合建立用戶界面。首先是聲明式語法,使得它很是容易建立用戶界面,而且開發者和UI設計者工做在相同的代碼基礎上。其次,這項技術使原生代碼集成變得相對容易,它承擔了更多的程序邏輯以及C++所負的重任。最後,選擇JavaScript做爲QML語言不可分割的一部分,這樣使得建立原型更加容易,而且爲更普遍的用戶提供了新技術。瀏覽器

今天的引擎是至關棒的基石而且知足了大多數用戶的需求。固然也有一些咱們須要在將來解決的短處和問題。這個系列的博客將歸納咱們的研究而且呈現咱們計劃要實現的解決方案。目標是在未來獲得一個更好、更靈活、更易維護的QML引擎。緩存

讓我從當前引擎所面對的一些問題開始。閉包

  • 多個對象模型函數

    當前的QML引擎使用V8 JavaScript引擎來執行屬性綁定。每一個QML項內部有幾個不一樣的表示。一個面向V8(使用公開的V8 API),一個面向QML引擎,還有一個做爲QObject暴露給原生Qt。這裏的問題是須要QML引擎來同步這些不一樣的表示,致使了大量的中間代碼和至關高的內存消耗來維持這些不一樣的表示。性能

  • 經過JS閉包(closures)完成綁定優化

    使用V8每一個綁定須要一個JS函數閉包。這須要把這個表達式重寫成閉包,而後讓V8再次解析這個重寫的表達式。在V8中評估綁定須要調用JS函數,它使用大量的額外開銷來模擬執行綁定的上下文環境。所以在咱們開發小型的用於QML引擎中的表達式解析器(叫作V4)的時候,它能夠計算簡單的表達式,這個解釋器比經過V8計算快不少倍。動畫

  • 數據類型轉換ui

    使用V8計算表達式很慢的一個緣由是從Qt到V8或者從V8到Qt數據類型轉換帶來的額外開銷。讀寫一個Qt屬性,例如建立一個QVariant,將被轉換爲V8::Value。若是這個QVariant是字符串,將會調用字符串數據的複製。爲了減弱這些開銷引進了各類緩存機制,可是隨之而來的是內存使用以及代碼複雜性的增長。spa

  • QML域規則

    QML語法上是項目樹。內部項能夠隱式查看外部項的屬性,造成了一個良好定義的做用域鏈。不幸的是這個做用域鏈和傳統的JavaScript不一樣,不能用現有的JavaScript引擎直接實現。直接實現的惟一方法是嵌入慢的不被同意(deprecated)的with()語句。目前的解決方案包含了一個暴力(intrusive)補丁在V8中,而且仍然須要經過名字來查找全部的QML屬性。

  • QML類型信息的丟棄

    QML做爲一種語言擁有類型信息。可是JavaScript是徹底無類型的。致使了這樣一個事實,全部的類型信息在QML編譯時被丟棄。保留這些類型信息將使咱們更好的優化QML表達式。

  • iOS和WinRT支持

    iOS不容許內存可執行和可寫,而這正是現有JS引擎所需的。WinRT根本不容許使內存可執行。這樣的狀況下,若是不寫一個完整的V8解釋器後端,就不能在這些平臺上使用V8。

  • 和V8上游一塊兒工做

    如上所述,咱們當前被迫維護一個至關大而且暴力的補丁集在V8之上。根本沒有機會把這些標補丁合併到上游,由於V8專一於瀏覽器應用。

這些不一樣的問題致使了一個研究項目,大約一年前由Nokia的Roberto Raggi和Aaron Kennedy發起。他們考察了根據QML的需求裁剪JS引擎的的可能性。這個項目代號爲v4vm,以後被轉移到Digia,Simon、Erik和我重拾這個項目而且繼續研究。它做爲一個playground項目存在於qt-project.org,已經有好幾個月了。

今天咱們把這個研究項目集成到了Qt Declarative的一個開發分支,從如今開始咱們將在這個分支繼續工做。

新的引擎包含了一個徹底遵循ECMAScript 5.1的實現,它能夠運行於全部Qt支持的平臺。它包含了一個JIT,目前能夠工做在Linux、Mac和iOS。 目前已經完成了到當前QML引擎的集成,是經過一個兼容的V8 API層實現的,咱們計劃在將來幾周移除它。這個引擎能夠運行全部的Qt Quick演示程序(有一些小問題)。

值得注意的一件事是,這個引擎專一於QML使用。這意味着咱們指望QML的性能變得比今天的更好。從另外一方面講,純JS性能並不必定像V8那樣好。

然而咱們當前的基準數據(benchmark numbers)和純JS代碼同樣是很是有但願的,V8基準大約慢於Qt 4.8和Qt Quick 1中JS引擎3倍。咱們看到了很大潛力,能夠在未來優化。

新引擎的細節和咱們將來的計劃將在接下來的幾篇文章中介紹。您能夠在qtdeclarative的wip/v4分支找到代碼。隨意嘗試吧。

相關文章
相關標籤/搜索