🙆‍♀️

swap chainについて

2021/07/11に公開

目次

  • swap chainとは
  • swap chainはなんのためにあるのか?
  • メモリに対して領域を確保するとは?
  • なぜ、木構造で読み取ったほうがいいのか?
  • 参考資料

swap chainとは

swap chainは文字、画像などの何らかのオブジェクトの領域をメモリ、GPUに確保をしてくれる機能です。


ハンコ画風のパワポ

例えば、眼の前にチャンバスがあったとします。そこにあなたは絵や文字のハンコを貼って一つの作品を作ろうとします。しかし、そのキャンバスは融通が効かずきっちり隙間なくどこにシールを貼るかを指定しなければなりません。そこで貼る人は各シールをどこに貼って、キャンバスにどれだけ大きいハンコを押すかを決めておかなければなりません。

swap chainは文字や画像などのハンコの領域を確保してくれる機能となっています。

swap chainはなんのためにあるのか?

では、なぜswap chainの役割は文字、画像の領域を確保してくれます。そのような機能を持つ理由は、メモリに対してどのように情報を書き込むかを命令しなければなりません。

普段使っているブラウザも、文字や画像を写すにはメモリに書き込んでおいてそれを写すように命令を出さなければなりません。例えば以下のようなHTMLがあったとします。

<p>test</p>

このHTMLは単純に1行をtestと書き込んでください、というコードです。これをフロー図にすると以下のとおりになります。


HTMLの描画フロー

これは、上記のHTMLを非常に簡略化したフローになります。上記のフローではまずHTMLを読み込みます。それからHTMLを構文解析をします。構文解析は文を分解をして機械が分かりやすい木構造に分けてしまうことを指します。構文解析をして木構造に落とし込むと、木構造を読み取ってGPUやメモリに書き込みます。すると、機械側がメモリの情報を読み取って画像や文字を画面に出してくれます。

通常は意識しない部分ではあります。通常のweb開発で「ここでメモリに領域を確保されているからバグっている」と言った話はまずありません。むしろ、それを知っていたらGoogleやMozillaに報告をしたほうがいいです。

swap chainは<p>test</p>の領域をメモリ、またはGPUに確保をします。確保をすると、それが画面に表示をされていきます。

画面に映る一連の動きはこのようになります。

メモリ領域の確保するとは?

メモリ領域の確保とは、メモリに何らかのデータを格納することです。先程もtestという文字の領域を確保すると言いましたが、これはtestという文字データ、フォントデータをメモリに書き込んで確保をしている状態を指します。

キャンバスにハンコを押して絵を書く、とたとえ話で言いましたがどこにどのハンコをどの程度領域を確保するかがメモリの確保に当たります。これが確保されていないと、機械の方はどのハンコをどこに確保をするかが分かりません。機械はとても素直で人間のようにいいように解釈をすることができません。

機械が画面に出力させるためには、どこにどれだけの範囲でハンコを貼るかを命令しなければなりません。メモリ上に存在をしていて、そこに読み込んで画面に出力をしてくださいと命令をすれば動くようになります。

このように私達が普段は意識していない部分では、高速に動いていて、メモリ上で目まぐるしく動いています。

なぜ、木構造で読み取ったほうがいいのか?

最後に、木構造について説明をします。以下の画像のような構造のことを言います。

家族図

こちらは簡単な家族図になります。このような構造が機械にとっては読みやすい構造になっています。ネットワーク図やオブジェクトの関係性を表した図などITで使う図は多岐に渡りますが、機械にとってこの方が読みやすいです。

なぜなら、データを展開するのが容易だからです。木構造の場合は、ほしいデータを木構造で渡すことで機械の方では「データがこのようにつながっているからAのデータを展開させて、それからBのデータに対して〜の命令をさせて」というように考えることができます。先程も機械は融通が効かないと言いましたが、1からすべてを命令しなければ動きません。その中で必ず重複するデータ構造や命令が存在しています。

HTMLのdivタグの中にimgとpタグがあるとします。すると、ここではimgとpタグをメモリ上に展開しなければなりません。メモリ上にタグの部分を展開をするならば、木構造の方が展開がしやすいのです。ネットワーク図でも展開はできますが、メモリでどことどこがつながっている、というデータ構造は工夫をしなければ動きません。ですので、木構造が一番適しているのです。

また、ネットワーク図だと、さまざまな制約があります。まず、循環させないという制約があります。これは、線が巡り巡って自分に戻ってくることを指します。循環をしてしまうと、ネットワークを通してどこかで循環していしまう命令を出したがために無限ループに落ちいてしまいます。

このように、データ構造も適材適所で運用をしていけば最大限のパフォーマンスにすることができます。

参考資料

Vulkano: https://github.com/vulkano-rs/vulkano
vulkanのswap chainについての説明:https://vulkan-tutorial.com/Drawing_a_triangle/Presentation/Swap_chain

Discussion