この記事は The Qt Blog の Qt 5.9 released を翻訳したものです。
執筆: Lars Knoll, 2017年5月31日
Qt 5.9.0 を本日リリースいたしました。Qt 5.9 は Qt 史上、最高のバージョンになるよう、これまで開発を続けてまいりました。
Qt 5.9 では特に パフォーマンスと安定性の向上に力を入れてきました。バグの修正は Qt の隅々に渡って行われ、継続的な自動テストのインフラの改善も行いました。これにより、Qt 5.9 以降の Qt のリリースサイクルを(パッチレベルでもマイナーリリースでも)速く回すことができるようになりました。
また、テストのインフラにパフォーマンスの自動テストも追加し、パフォーマンスの向上を継続的に可視化できるようにしました。詳細は こちらのブログ記事 をご覧ください。
Qt Lite 向けに開発した新しい Qt のコンフィグレーションシステムにも様々なバグフィックスがなされました。詳細は こちらのブログ記事 をご覧ください。
Qt 5.9 を「長期サポート(LTS)」としたのは大きな決断の一つでした。前回の LTS である Qt 5.6 は時代遅れになり始めたところで、もっと新しいバージョンを長期的なプロジェクトのベースとして採用したいという要望が数多く寄せられていました。
Qt 5.6 以降、2000 以上のバグフィックスが Qt 全体に渡って行われてきました。Qt 5.7 以降は C++11 に準拠したコンパイラを常用していて、これにより Qt 自体のコードもより洗練されたものに書き換えられています。Qt 5.8 では Qt Lite の導入や、描画エンジンの改善も行わました。今回 Qt 5.9 で新しく対応した様々な機能について、以下のセクションで紹介したいと思います。
LTS リリース。Qt 5.9 は今後3年に渡ってサポートが継続されます
今回 CI システムとリリースのインフラを改善したことにより、Qt 5.6 ではできなかった、より速いサイクルでの改善やパッチレベルのリリースを行えるようになりました。LTS として、まず最初の1年間は積極的に更新を続ける予定です。2年目以降は Qt 5.9 ブランチに対する変更の審査基準を徐々に厳しくし、パッチレベルのリリースサイクルも穏やかになるでしょう。
Qt 5.6 のサポートも約束どおり継続しますが、今後プロジェクトを新規ではじめられる方は、より品質のよい Qt 5.9 をお使いいただくことを推奨します。
今回は特にパフォーマンスや安定性の向上にフォーカスをしていましたが、この記事に書ききれないほどの新機能も追加されています。Wiki の「新機能」のページにすべての新機能の一覧がありますのでご確認ください。
ここでは主な新機能について紹介したいと思います。
Core と Network には数多くの新機能が追加されました。まず Qt Core には2つの新しいクラスが追加されています。1つ目は 16 ビットの浮動小数点を抽象化する qfloat16 で、これは GPU との相互連携のための API で最近利用が増えています。2つ目は QOperatingSystemVersion クラスで、アプリケーションが動作しているシステムやバージョンを簡単に調べられるように追加されました。
Qt Network では、HSTS(HTTP Strict Transport Security) のサポートが追加され、QNetworkAccessManager 経由での HTTPS のセキュリティが改善されました。
Qt NFS では Android 向けの素晴らしい改善がなされ、Qt WebSockets では外部の TCP ソケットの利用が可能になりました。WinRT の クラシック Bluetooth 対応と、Android での Bluetooth 周辺機器のサポートも追加されています。
Qt Gui にはシェーダーキャッシュ機能が追加され、OpenGL のシェーダープログラムをコンパイルしたバイナリがキャッシュされるようになりました。Compute シェーダーにも対応しました。描画エンジンの OpenGL バックエンドでは、Core Profile の対応がなされました。
Qt 3D にも様々な作業が行われてきています。Qt 5.8 での開発を 5.9 でも継続し、すばらしい 3D エンジンを Qt として提供できるようになりました。詳細はパートナー企業の KDAB によるブログの記事 をご覧ください。
Qt 5.9 では QML と JS エンジンに対して様々な改善がなされました。ゼロから書き直したガベッジコレクターによりパフォーマンスの改善や JavaScript のヒープ領域のメモリのフラグメンテーションの改善を行いました。このガベッジコレクターをベースに、今後も様々な改善を継続していく予定です。
Qt 5.9 では QML のキャッシュも改善し、商用ライセンスのみで提供されている Qt Quick Compiler と同様の効果をより透過的な方法で実現し、みなさんが利用できるようにしました。実際の処理は2つのモードがあり、デフォルトでは QML のバイナリキャッシュをプログラムの初回起動時に生成します。キャッシュをビルド時に生成するモードを利用すると、Qt Quick Compiler と同様に起動時間の短縮も可能になります。キャッシュの仕組みは、アプリケーションと様々な Qt のバージョンの組み合わせに対応可能になっているため、異なるバージョンの Qt に応じたキャッシュが必要に応じて自動で生成される仕組みになっています。
QML のエンジンに対しても様々なパフォーマンスの向上とメモリ消費の低減の作業が行われたため、以前の Qt 5.6 LTS と比較してかなり素晴らしい出来になっています。
Qt Quick では Qt Gui に対して追加された OpenGL シェーダーキャッシュ機能を最大限活用し、アプリケーションの起動時間を大幅に短縮することができるようになりました。画像のデータをプロセス間で共有するための ImageProvider を追加し、さらに新たに対応した OpenVG のバックエンドにより、2D のアクセラレーションのみを提供しているハードウェアでも高速な動作が可能になりました。
Qt Quick Controls 2 はここでは書ききれないほどの新機能が追加されています。詳細は こちらのブログの記事 をご覧ください。
今回のリリースでは、Qt Location に対しても多くの新機能が追加されました。地図に関してはタイリングやタッチのジェスチャーで操作可能な回転の対応がなされました。地図の重ね合わせも改善され、オーバーレイが簡単に実装できるようになりました。また、地図データの著作権表示の改善も行われました。
Mapbox 向けの新たなプラグイン も追加され、OpenGL を活用した描画に対応しました。
高解像度のタイル画像のダウンロード中に低解像度の画像を表示するなど、見た目に関する改善もいくつかなされています。
iOS では、Qt Positioning の改善がなされ、アプリケーションがバックグランドで実行中にもデータの取得が可能になりました。
これ以外のモジュールに対しても様々なアップデートがあります。Qt WebEngine は Chromium 56 ベースになりました。Qt VirtualKeyboard では外部のキーボードレイアウトをサポートし、それ以外にもいくつかのクールな機能が追加されています。
Qt 5.9 では Qt Gamepad がそれまでのテクノロジープレビューから正式サポートに昇格しています。Qt Remote Objects というモジュールもテクノロジープレビューとして追加しました。
Qt Wayland に対して行われた様々な改善については こちらのブログ記事 をご覧ください。
もちろん、Qt 5.9 のリリースに合わせて、様々な新機能が満載の新しいバージョンの Qt Creator もリリースいたしました。Qt Quick Designer の中でコードエディタも使えるようになり、cmake 対応のコードはゼロから書き直されました。様々な新機能については こちらのブログ記事 を参照してください。
Qt 5.9 では2つの新しいプラットフォームの対応が追加されました。QNX の最新版である 7.0 と、INTEGRITY です。INTEGRITY 対応に関する詳細は、こちらのブログ記事 をご覧ください。
最後となりましたが、Qt のサイズ最適化 (GCC では -Os) の対応も追加し、これにより Qt ライブラリとアプリケーションのバイナリサイズが 5% ~ 20 % 程度小さくできるようになっています。
本当に最後となりましたが、この度のリリースに対して貢献していただいたすべてのみなさまに感謝をしたいと思います。git リポジトリに対するコードの貢献をしていただいたみなさんはもちろんのこと、その裏で CI システムやリリース作業のインフラの改善や今回のリリース向けのウェブページの対応をしてくれたみなさんにも心から感謝をしたいと思います。
このリリースがみなさんの幸せにつながることを心より願っています。最新の Qt はいつも通り、Qt Account もしくは ダウンロードページ より入手可能となってます。このリリースに対するフィードバックも大歓迎です。バグを見つけた方は是非バグの登録にご協力ください。今後の Qt 5.9 の継続的な改善に活かしたいと思います。