Qt 5.9 でのシェーダーバイナリのキャッシュによるパフォーマンスの改善

この記事は The Qt BlogBoosting performance with shader binary caching in Qt 5.9 を翻訳したものです。
執筆: Laszlo Agocs, 2017年3月23日

Qt 5.9 のリリースが近づいてきました。というわけで、Qt Quick (および OpenGL を利用した QPainter の描画)のベースとなっている OpenGL の重要な部分に関して行った、わずかですが非常に便利な改善について紹介したいと思います。

Qt 5.9 のドキュメントのスナップショットを見た方の中には 由緒正しい QOpenGLShaderProgram に追加されたいくつかの機能 に気づいた方もいるかもしれません。これは Qt の内部で利用していた API がこの新しい API になりました。これは実際どういうものでしょうか?

ここで説明しているように、これらのシェーダープログラムのバイナリが GL_ARB_get_program_binary もしくは OpenGL ES 3.0 の同様の標準機能を用いてディスクに保存されるようになります。ドライバがこの機能を提供していない場合には、キャッシュがない場合と同様の動作になります。キャッシュファイルは書き込み可能な キャッシュ用の場所 に、グローバルもしくはプロセスごとに生成されます。これにより、2回目以降に同じシェーダーのプログラムが使われる場合のパフォーマンスが大幅に改善されます。

実際にどの程度の改善になるでしょう?これは一概にはなんとも言えません。ここ数年、このようなキャッシュを行うようになったドライバもありますし、パイプラインに似たような機能が実装されているドライバも世の中には存在しますが、現時点で市場に出回っているデバイスでは非常に大きな効果がありました。

image2016-11-21-152420

ここで実際の数値は気にしないでください。重要なポイントは Qt 5.8 と Qt 5.9 の間の差です。また、シンプルな Qt Quick のアプリケーションや OpenGL ベースの QPainter を使ったアプリケーションでは10個ものシェーダープログラムは使われないでしょうが、Qt Graphical EffectsShaderEffect を利用し複雑さが増せば増すほどこのような改善の恩恵は大きくなります。

実際のところ、すでにシェーダーのキャッシュの恩恵を受けているプラットフォームでもこの効果があることが分かりました。つまり、すべてのアプリケーションの起動と描画の切り替えが、この Qt 5.9 の恩恵に(しかもコードを書き換える事無く)あずかれるはずです。

QOpenGLShaderProgram を自分で使っているアプリケーションは、 単に呼んでいるメソッドを cacheable 版の方に変える事が可能になります。これらの変更はプログラムのバイナリの利用に関する意味の変更を伴うことになりますが、これは意図的に行いました。特に QOpenGLShaderaddShader()removeShader() については個々のシェーダーのコンパイルに関するもののため、今回のプログラムレベルでのキャッシュとは互換性がありません。

今回は以上でおしまいです。今後も Qt 5.9 や 5.10 の新機能の記事を書く予定ですのでお楽しみに。


Blog Topics:

Comments