You are on page 1of 2

間違った認識で議論しても適切な議論にならないので、かなり長文になりますが、

X の仕組みと一般なアプリケーションやライブラリの実装について解説します。

X には、同じ画像データでも Window や Pixmap など X サーバ(XFree86 等)側に確保される

リソースと、XImage のようにクライアント(xterm や emacs)側に確保されるリソースが

あります。

アイコンや jpeg ファイルのデータ等基本的に変更されないデータに対しては Pixmap と

して処理し、ゲーム等プログラム側でデータを変更する場合には扱いやすい XImage を

使用します。

例えば、jpeg ファイルを表示するプログラムがあったとすると、まず、表示するための

Window を作り、jpeg ファイルを展開した Pixmap を作り、Pixmap から Windows に転送する

ように X サーバに指示します。

そのあと、Window が隠れまた前面に出された場合、再度表示され部分の情報が X サーバ

から通知されるので(Expose)、それにしたがって、アプリケーションは Pixmap から

Windows に隠れていた部分を転送するように X サーバに指示します。

この動作で帯域を喰うのは、最初の jpeg ファイルから Pixmap を作成する部分だけです。

あとは、アプリケーションが X サーバに必要な処理をするよう命令するだけで、X サーバ

内部で動作が完結するようになっています。

さらに、X サーバはハードウェアのアクセラレーション機能(BitBlt)を利用して高速に

描画するようになっています。

VNC や RDP(Windows のリモートデスクトップ)ではある程度キャッシュすることはできても

ここまで最適化することはできません。

gtk+や qt 等を使えば X クライアントは自動的にこういう動作をします。

したがって、

> VNC は画面更新された部分だけを転送します。

> ですから、X11 よりも描画が速くなることもあります。

これは誤りです。

X も更新された部分だけ処理するし、多くの場合 X サーバ側にデータを置いているので、
更新部分のデータを転送せずに済み、より効率的になっています。

ただ、実際のライブラリでは、基本的に、更新された部分単位で細かく処理せず、露出

される Widget 単位で描画処理をする場合が多いので、VNC の方が速くなる場合がないわけ

ではありません。

また、XImage に関しても、ローカルでは画像データを X サーバと X クライアントの共有

メモリに置き、サーバとクライアント間でデータの転送を行わなくて済む XShm 拡張と

いうのがあります(Pixmap にも同じ拡張があるが、あまり使われていないはず)。

この拡張を利用し、リモートでは XImage、ローカルでは XShm 拡張を使うよう動作する

ライブラリがあり、この代表が SDL です。

したがって、SDL への言及は意味不明です。SDL はただのライブラリであり、それ以上

のものではありません。

さらに、root 特権が必要なので実際に使っているアプリケーションは少ないですが、

VRAM 等ビデオカードに直接アクセスできる DGA 拡張というのもあります。