レンダリングモデル
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/02/22 13:51 UTC 版)
「Wayland」の記事における「レンダリングモデル」の解説
Waylandプロトコルは、レンダリングAPIを含んでいない:7。その代わり、Waylandはダイレクトレンダリングモデルを採用している。ダイレクトレンダリングモデルでは、クライアントはウィンドウコンテンツをコンポジタと共有できるバッファへ描画しなければならない:7。そのため、クライアントはCairoやOpenGLなどのライブラリを使って、自分自身ですべてをレンダリングすることも選択できる。あるいは、QtやGTKといった、Waylandをサポートする高位のウィジェットライブラリのレンダリングエンジンに頼ることもできる。クライアントは、特定のタスクをこなすために、オプションとしてその他の特化したライブラリを使用することもできる。たとえばフォントレンダリング(英語版)のためにFreeTypeを使用できる。 レンダリングされたウィンドウコンテンツの結果(バッファ)は、wl_bufferオブジェクトに格納される。このオブジェクトのデータ型は、実装依存である。コンテンツデータがクライアントとコンポジタとの間で共有可能でなければならないことだけが唯一要求される。もしクライアントがソフトウェア(CPU)レンダラを使用し、その結果がシステムメモリに格納されるなら、クライアントとコンポジタは、バッファ間のやり取りを余分なコピーなしに実現するため、共有メモリを使用できる。Waylandプロトコルはすでにこの種の共有メモリバッファに何も追加することなしに対応している。共有メモリバッファは、wl_shmおよびwl_shm_poolインタフェースによって実現できる:11, 20-21。この方法の欠点は、コンポジタはそれを表示するために追加の作業(通常、共有データのGPUへのコピー)を必要とする可能性があることである。これにより、グラフィックパフォーマンスは低下する。 最も一般的なケースでは、クライアントがOpenGL、OpenGL ES、Vulkanといったハードウェア(GPU)アクセレレーションのためのAPIを使って、ビデオメモリバッファへ直接レンダリングする。クライアントとコンポジタは、このGPU空間のバッファを参照するための特別なハンドラを用いて共有できる。この方法は、コンポジタに余計なデータコピーをしないようにする。結果として、グラフィックパフォーマンスは向上し、よりよい方法である。コンポジタはAPIクライアントとして、同じハードウェアアクセセレレーションAPIを使って、ディスプレイへ描画する最終的なシーンのコンポジションをかなり最適化できる。 レンダリングが共有バッファ内で完成したとき、Waylandクライアントはバッファのレンダリングされたコンテンツをディスプレイに表示するため、コンポジタを導くべきである。そのために、クライアントはレンダリングされたコンテンツを格納するバッファオブジェクトをサーフェイスオブジェクトに紐付ける。そして"commit"リクエストをサーフェイスに送り、バッファの制御をコンポジタヘ転送する。それから、クライアントは、もしまた別のフレームをレンダリングするためにバッファを再利用するなら、コンポジタがバッファを開放するのを待つ(イベントによって通知される)あるいは新しいフレームをレンダリングするため別のバッファを使用し、レンダリングが完了した時にこの新しいバッファをサーフェイスに紐付け、そのコンテンツをコミットすることもできる:7。数個の関連するバッファやその運用を含めて、レンダリングに使用される方法は、全体的にクライアントの制御下にある:7。
※この「レンダリングモデル」の解説は、「Wayland」の解説の一部です。
「レンダリングモデル」を含む「Wayland」の記事については、「Wayland」の概要を参照ください。
- レンダリングモデルのページへのリンク