翻譯 | Qt 6技術概覽

本文翻譯自:Technical Vision for Qt 6

原文作者:Lars Knoll,Qt公司開源項目維護官兼CTO

校審:Richard Lin

 

自從七年前Qt 5發佈以來,我們的世界發生了很多變化,現在是時候展望和規劃下一個主版本了。這篇博文總結了幾個將要在Qt 6中亮相的關鍵點。

Qt 6將是我們Qt 5系列的延續,因此不會對用戶造成干擾。但是這個新的版本將擁有更高的靈活性來實現新的特性和功能,和目前的Qt 5系列相比,它能更好地支持當下和未來的需求。正如下面即將描述的一樣,Qt 6將致力於實現與Qt 5很大程度上的兼容。Qt 5的新版本還正在開發中,我們的目標是將Qt 6中將要實現的一些新特性在Qt 5.14和Qt 5.15 LTS中發佈其略微初級的版本。隨着Qt 5.14特性的固定,更多的研發重點將轉向Qt 6,我們的目標是在2020年年底前發佈Qt 6的第一個版本。在我們深入瞭解Qt6的新內容之前,讓我們回顧一下Qt對用戶而言的核心價值,首先明確我們不能更改的內容。

 


Qt對用戶的價值體現在哪裏?

Qt已經成功應用於衆多行業,並且不斷進行橫向發展,Qt對用戶的核心價值體現如下:

跨平臺特性,用戶可使用一種技術,把一套代碼部署到各種的桌面、移動和嵌入式平臺
可擴展性,覆蓋了從低端單用途設備到高端複雜的桌面應用程序和互聯繫統
世界一流的API、工具和文檔,簡化了應用程序和設備的開發流程
可維護性、穩定性和兼容性,輕鬆維護大型代碼庫
> 擁有超過100萬用戶的大型開發者生態

我們需要進一步調整Qt新版本以適應新的市場需求,同時也要把上述5個價值觀作爲我們工作的核心內容。

桌面應用是Qt得以成長和強大的市場基礎,它是我們大多數用戶第一次接觸Qt的地方,也是組成Qt工具鏈的基礎。保持桌面應用的健康和成長是在其他市場也保持增長的先決條件。

嵌入式和互聯設備是我們增長最快的領域。觸屏設備的數量正在以指數級增長,但這些設備的硬件價格卻承受着巨大壓力。低端芯片組、單片機、結合中小型觸摸屏的設備將無處不在。這些設備中的大多數功能相對簡單,但都需要精緻流暢的用戶界面。因此我們必須確保自身產品能夠瞄準這個市場,從而實現我們的可擴展承諾。

與此同時,高端設備的用戶界面複雜性將繼續增加,它們往往包括了數千個不同的屏幕和衆多應用程序。將2D和3D元素合併到一個用戶界面也很常見,增強和虛擬現實的使用也是如此。

人工智能的元素將更廣泛地應用於應用程序和設備中,我們需要用簡單方法集成這些元素。

數量強勁增長的互聯設備和要求更高的用戶體驗使得我們更有必要專注於開發全球領先的工具,以簡化應用程序和設備的創建流程。將UX設計人員集成到開發工作流中是我們的目標之一,但是我們還需要在許多其他領域去嘗試進一步簡化用戶的工作。

Qt 6將是Qt的一個新的重大版本,這個版本的主要目標是爲2020年以後的需求做好準備,整理代碼庫使其更容易維護。因此,我們的重點將放在Qt中那些需要調整軟件架構的部分,但是如果不破壞與Qt 5.x兼容性,那這部分就無法完成。

爲適應未來幾年的需求,我們將對Qt進行以下關鍵性修改。

 

 

 

新一代QML

QML和Qt Quick是過去幾年推動Qt增長的主要技術。使用這些技術直觀創建用戶界面是我們產品的一個獨特賣點。

QML是爲Qt 5創建的,但是它有一些問題和限制。這也意味着它將被大幅改進,我們計劃在Qt 6中實現以下改進:

引入強類型。弱類型使得用戶很難對他們的代碼庫進行大的更改。一個強大的類型系統允許IDE和其他工具幫助用戶完成這項任務,並極大地簡化了維護成本。此外,它還有助於我們生成性能更好的代碼和減少相關開銷。

JavaScript成爲QML的一個可選特性。使用QML時擁有完整的JavaScript引擎會提升複雜性,而且會引起性能上的開銷,尤其是在單片機等低端硬件上,性能開銷更加明顯。然而,這個特性在許多其他應用場景中非常有用。

去掉了QML的版本控制。通過簡化QML中的某些查找規則並更改上下文屬性的工作方式,我們可以消除QML中的版本控制。反過來,這將大大的簡化QML引擎,極大地簡化我們維護Qt Quick的工作負擔,併爲用戶簡化QML和Qt Quick的使用流程。

刪除QObject和QML之間重複的數據結構
目前我們的元對象系統和QML之間有相當多重複的數據結構,這些重複的數據結構會降低啓動性能,增加內存使用量。通過統一這些數據結構,我們能夠減少許多開銷。

避免運行時生成數據結構。這與上面的一點有關,其中許多重複的數據結構目前都是在運行時生成的。其中大多數完全有可能在編譯時生成。

支持把QML編譯成高效原生的C++代碼。通過強大的類型和更簡單地查找規則,我們可以將QML轉換爲高效原生的C++代碼,從而顯著提高運行時性能。

支持隱藏實現細節。爲了能夠在QML組件中隱藏數據和功能,對方法和屬性進行“私有化”一直是項長期的需求。

更好的工具集成。我們當前的QML代碼模型時常不完整,這使得重構和在編譯時檢測錯誤變得困難甚至不可能。通過上述更改,應該能夠提供與C++相媲美的編譯時診斷以及大幅改進的重構支持。

 


下一代圖形

自從Qt 5.0以來,圖形領域發生了很多變化,這導致我們不得不對圖形棧進行重大更改,以保持其競爭力。

在Qt 5中,我們統一使用OpenGL作爲3D圖形的API。從那時起,產生了許多新的API。在Linux上Vulkan是OpenGL的指定接班人,蘋果正在推動Metal的發展,而微軟有Direct 3D。這意味着Qt將來必須與所有這些API無縫地銜接。爲了實現這一點,必須定義一個新的圖形抽象層的API(類似於平臺集成層的QPA),稱爲渲染硬件接口(RHI)。我們需要將所有的渲染基礎設施(QPainter、Qt Quick Scene Graph和我們的3D支持)建立在該層的基礎之上。

不同圖形API的合成也導致我們必須支持不同的着色語言。Qt着色器工具模塊將幫助我們在編譯和運行時交叉編譯着色器。

3D正在扮演越來越重要的角色,而我們目前的產品還沒有統一的解決方案來創建同時包含2D和3D元素的UI。目前,將QML與Qt 3D或3D Studio中的內容集成很麻煩,並會導致一些性能開銷。此外,在2D和3D內容之間進行逐幀的動畫同步和轉換還沒有辦法做到。

3D內容與Qt Quick新的集成方式就是爲了解決這個問題。在這種情況下,一個全新的渲染器將允許同時渲染2D和3D內容,並支持兩者之間的任意嵌套。這將把QML轉換爲3D UI的UI定義語言,並且不再需要UIP格式。我們將提供一個新技術預覽版本的Qt Quick與3D支持的版本,它已經包含在了Qt 5.14中,更多的信息將會在一個單獨的博文中進行說明。

最後,新的圖形棧需要強大圖形素材處理的支持,它能在編譯時根據目標硬件預處理這些素材,並在需要時使用。比如將PNG文件轉換爲壓縮紋理格式,將許多文件編譯爲紋理圖集,將着色器和網格轉換爲優化的二進制格式等等。

我們還打算爲Qt 6引入統一的主題樣式引擎,這將允許我們在桌面和移動平臺上獲得Qt Widgets和Qt Quick的原生外觀。

 


統一併一致的工具庫

我們創建用戶界面的圖形工具已經被一分爲二,包括Qt 3D Studio和Qt Design Studio。此外,Qt 3D Studio與Qt的其餘部分有些脫節,導致了相當多的重複工作。

我們通過將Qt 3D Studio所需的功能合併回Design Studio來統一這些功能。Design Studio與Qt Creator共享了大量代碼和應用/插件框架,提供了很好的設計體驗,併爲我們提供了在設計師和開發者之間搭建橋樑的工具。

設計工具還需良好地集成Photoshop、Sketch、Illustrator、Maya、3D Max等內容創建工具。

開發者工具需要大量的投入,這樣我們才能爲C++、QML和Python等提供最佳支持。提供統一工具還意味着開發者可以很容易地使用Qt Creator中的設計功能,而UX設計師可以從開發者工具的特性(如編譯項目或在設備上測試)中獲益。

QMake作爲Qt 5中使用的構建系統有很多缺陷和限制。對於Qt 6,我們的目標是使用CMake作爲標準的第三方構建系統來構建Qt本身。CMake是迄今C++世界中使用最廣泛的構建系統,我們迫切需要與它更好地集成。我們將繼續在QMake上支持用戶,但不會進一步開發它或使用它來構建Qt框架本身。

 


增強已有的C++ API

C++在過去的幾年中發生了很大的變化。雖然Qt 5.0必須以C++ 98爲基礎,但現在Qt 6可以依賴C++ 17。這意味着C++提供了更多開箱即用的功能,這在我們使用Qt 5時是沒有的。我們使用Qt 6的目標是更好地集成這些能力,同時也保持向下的兼容性。

Qt 6中,我們希望把QML和Qt Quick的一些功能引入到C++中。我們致力於爲QObject及其相關類引入新的屬性系統,將QML中的綁定引擎集成到Qt的核心中,並使其在C++中可用。新屬性系統和綁定引擎將顯著降低綁定的運行時開銷和內存消耗,並使它們可用於Qt的所有部分,而不僅僅是Qt Quick。

 


語言支持

在Qt 5.12中,我們引入了對Python的支持,並通過Qt for WebAssembly添加了瀏覽器作爲新平臺。在發佈6.0之後,保持並進一步擴展跨平臺特性將是Qt 6系列的一個重要部分。

 


兼容Qt 5和增量改進

與舊版本的兼容性是非常重要的,也是我們開發Qt 6時的主要需求。用戶已經使用我們的框架編寫了數十億行代碼,因此,我們所做的任何不兼容更改都會給用戶帶來額外的成本。此外,對Qt 6的更改要求用戶做的工作越多,用戶升級的速度就會越慢,這將導致維護Qt 5最後一個版本的成本更高。

因此,在用戶代碼中我們應該避免觸發編譯時或運行時錯誤進而使得Qt運行崩潰。如果我們必須破壞兼容性,編譯時錯誤比運行時的靜默破壞更可取(因爲後者更難檢測)。

當我們確實需要刪除Qt的某些廢棄部分,我們必須要確保我們的用戶擁有他們需要的功能,大部分用戶都在使用的關鍵功能,比如Qt Widgets和其他部分,毫無疑問必須保留。

我們正在計劃對核心類和功能進行許多在Qt 5中無法實施的增量改進。我們的目標是保持完整的源代碼兼容性,但是由於我們可以打破Qt 6的二進制兼容性,我們可以做很多在Qt 5中無法完成的清理和改進。

除了這些,我們還將對Qt 6進行其它的清理。我們將刪除Qt 5中已經廢棄的大部分功能(函數、類或模塊)。從長遠來看,這種清理將有助於節省開發人員的時間,並允許我們把更多的精力放在維護和編碼上。

然而,對棄用部分的移植需要儘可能的簡單,我們的用戶可以完美地使用Qt 5.15 LTS增量地完成這一工作。我們的目標應該是Qt 6與Qt 5.15 LTS足夠兼容,這樣就可以輕鬆地維護一個可以同時針對兩個版本編譯的大型代碼庫。

 


市場和技術產品結構

除了改進Qt框架和工具,我們的目標是爲組件和開發工具創建一個新的市場。這個方向將面向開發、設計應用程序和嵌入式設備的直接使用者,而不是面向最終用戶。因此,它將成爲Qt生態系統的一個凝聚中心。它將爲第三方廠商提供一個發佈Qt擴展組件的場所,擴展可以是免費或商業的。

Qt在過去的幾年裏增長良多,當前最重要的任務就是發佈一個新版本。在Qt 6中,我們有機會重組我們的產品,並將必要的框架和工具打包爲一個更小的核心。我們將利用應用市場來交付我們的附加框架和工具,而不是作爲與核心Qt產品緊密耦合的捆綁包。這將使我們在何時交付以及如何交付方面具有額外的靈活性,並允許我們爲某些附加組件解耦發佈計劃。

 


歡迎您的參與和反饋

在Qt 6第一個版本發佈前,技術概覽將逐步完善。雖然我相信本文爲Qt的下一個版本奠定了基礎,但它肯定還有很多需要完善的地方。如果您有任何新的想法,請參與到Qt 6的開發中,並遵循Qt的開放性管理規則(https://www.qt.io/contribute-to-qt)進行討論。

 

原文鏈接:

https://mp.weixin.qq.com/s/0iwaqTGEiBvArXE9xItTBQ

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章