アニメ編(その四)

ページ名:tutorial_anime_4
戻る:アニメ編(その三)


キャッシュの利用


どこで読んだのか忘れましたが、むかし評論家の山形浩生が「コンピュータ科学とは貧乏臭さの科学だ」というような主旨のことを言っていて(うろ覚え)、感心したことがあります。


コンピュータは今でこそじゅうぶんな性能の、仕事や趣味に用いて不足のないものが広く普及しましたが、つい数十年前のコンピュータは非常に貧相な処理能力と記憶容量しか持っていませんでしたから(そしてとても高価でした)、ちょっとしたことでも待たされたり、容量不足に悩まされたのです。
ですから、限られた貧相なリソースをいかに活用するかということが、長年のコンピュータ科学の重要なテーマでした。その涙ぐましい努力を指して山形は「貧乏くささ」と表現したのでしょう*1。コストパフォーマンス、という言葉の同義語と見ることも出来るでしょうか。


キャッシュとは何か


さて、キャッシュ cache というコンピュータ用語はよく耳にする言葉ですが、これはコンピュータにまつわる涙ぐましい貧乏臭さの、もっとも典型的なものといえるかも知れません。


cache の語源はフランス語の動詞 cacher で、これは「隠す」という意味です。
その名詞形の cache は「隠し場所」のこと。貴重品や盗品などの特別な品物をこっそり隠しておく場所、というニュアンスですね。cache-cache と二つ重ねると、これは「かくれんぼ」のことです。


コンピュータにおけるキャッシュは、特別なデータをしまう場所です。といっても、家族に見せられない動画や、税務署に隠しておきたいファイルを入れておく場所というわけではなく・・・


コンピュータというのはさまざまな電子/電気部品で作られていますけれども、その特性はさまざまです。
ある部品は非常に高速に動作するけれども、原価が高いのであまり大きな容量にはできない。
別の部品はそれほど速くはないけれども、安価なために大容量の製品が普及している。
また別の部品は中くらいの動作速度と中くらいの値段、そして中くらいの容量を具えている。


キャッシュというのは、そのような特性の違いを利用したものです。
本来は遅い部品(例えば HDD)に保存されるべきデータを、それよりも速い部品(例えばメモリ)に保存しておけば、通常よりも高速にデータを読み書きすることが出来ます。
この「動作を軽快にするために確保した、高速なデータ置き場」をキャッシュといいます。ウェブブラウザにおけるキャッシュも同じ意味ですね。


しかし、たとえ一時的にであっても、なんでもかんでもキャッシュに保管しておくことは出来ません。なぜなら、高速な媒体の方が値段が高く、本来置くべき場所よりもはるかに容量が小さいからです。
ですからキャッシュには、扱うデータのうちよく使うものだけを厳選して置く、ということが必要になります。そのようなデータを効率よく選び出し、効率よくキャッシュに置くことが「貧乏くさいサイエンス」の見せ場というわけです。


余談ですが、逆の発想の貧乏臭さに「スワップメモリ」というものがあります。
これはメモリ上に置いておくべきデータの内、あまり使わないものを固定ディスクに追い出すことで、少ないメモリを広く使おう、という発想ですね。
データを追い出す方向性は逆ですが、高速なデバイスにはよく使うデータ、低速なデバイスにはあまり使わないデータ、という原理には違いありません。


エフェクトブースターにおけるキャッシュ


エフェクトブースターにおけるキャッシュはよく使う画像ファイルを一時的においておく場所です。


通常、それらのファイルは HDD や SSD などの固定ディスク、場合によっては USB メモリなどに保存されていることでしょう。
これらは比較的大容量の媒体ですけれども、アクセス速度はそれほど速いとはいえません。まあ、昨今は昔に比べて格段に高速化してはいるのですが、サイズの大きな画像ファイルを頻繁に読み出すとなると、それなりに負荷は大きくなります*2


そこでエフェクトブースターでは扱う画像データを一時的にメモリに読み込んでおき、必要な時はそこからデータを読み込むことで高速化を図る仕組みです。
キャッシュを扱うパラメータは以下の二つです。


パラメータ名機能設定値
savecache画像をキャッシュに保存する管理番号(1 ~ 8)
loadcache画像をキャッシュから読み込む管理番号(1 ~ 8)

キャッシュには、最大 8 つまでのデータを保存しておくことが可能で、savecache で保存する際に 1 ~ 8 の番号を指定します。データを表示する際はその番号を指定して読み出すわけです。


では実際に savecache と loadcache を使い、結果を確認しましょう。
ここまでずっと用いている親父横移動アニメを、キャッシュを使って書き換えてみます。


  1: [init]
  2: 
  3: [Master]
  4: fileName=宿の亭主.bmp
  5: savecache=1
  6: 
  7: [Master_00]
  8: loadcache=1
  9: visible=0
 10: animation=3
 11: animeposition=0,0
 12: wait=250
 13: 
 14: [Master_01]
 15: loadcache=1
 16: visible=0
 17: animation=3
 18: animeposition=150,0
 19: wait=250
 20: 
 21: [Master_02]
 22: loadcache=1
 23: visible=0
 24: animation=3
 25: animeposition=300,0
 26: wait=250
 27: 
 28: [Master_03]
 29: loadcache=1
 30: visible=0
 31: animation=3
 32: animeposition=450,0
 33: wait=250
 34: 
 35: [Master_04]
 36: loadcache=1
 37: visible=0
 38: animation=3
 39: animeposition=600,0
 40: wait=250

3 ~ 5 行目に savecache のためのセクションを一つ追加しました。それ以降のセクションでは filename プロパティを使わず loadcache を用いて一時表示する画像を指定しています。


それでは実行してみましょう。




おっと、一時描画実行後に例の副作用が出てしまいました。
savecache パラメータを指定しても「キャッシュに保存するだけ(他は何もしない)」とはならないらしく、相変わらず visible パラメータで表示なし(=0)を指定してやらなければいけないようです。
[Master] セクションに visible=0 を追加し、再度実行してみましょう。



今度はうまくいきました。


ところで savecache が visible パラメータ(通常描画)の動作に影響を与えないのだとすると、animation パラメータに対してはどうでしょうか。
つまり、一つのセクションで savecache しながら animation パラメータで一時描画させる、ということは可能でしょうか。
それを検証するために、先の JPY ファイルを以下のように編集します。


  1: [init]
  2: 
  3: [Master_00]
  4: fileName=宿の亭主.bmp
  5: savecache=1
  6: visible=0
  7: animation=3
  8: animeposition=0,0
  9: wait=250
 10: 
 11: [Master_01]
 12: loadcache=1
 13: visible=0
 14: animation=3
 15: animeposition=150,0
 16: wait=250
 17: 
 18: [Master_02]
 19: loadcache=1
 20: visible=0
 21: animation=3
 22: animeposition=300,0
 23: wait=250
 24: 
 25: [Master_03]
 26: loadcache=1
 27: visible=0
 28: animation=3
 29: animeposition=450,0
 30: wait=250
 31: 
 32: [Master_04]
 33: loadcache=1
 34: visible=0
 35: animation=3
 36: animeposition=600,0
 37: wait=250

変更点は最初の方、savecache を行うためだけの [Master] セクションを削除し、一時描画を行う [Master_00] セクション(3 ~ 10 行目)で一緒に savecache も行ってしまおう(5 行目)、というわけです。
これで実行すると・・・



ふむ、ちゃんと動作しているようですね。
savecache パラメータは描画/一時描画と同時に機能し得ると分かりました。


ところで、キャッシュを導入したことによる描画性能への影響ですが・・・正直に言って分かりません。というか、客観的に検証する方法がないので、効果があるともないともいいようがないのです。
とりあえず、今のところはおまじない程度に考えるべきでしょうか。
検証方法についてよいアイデアをお持ちの方がおられましたら、ぜひご提案ください。


キャッシュの寿命


ヘルプファイル(editor128.chm)の loadcache ないし savecache の項目を読むと、どちらも意味ありげな一文で終わっているのが気になるところです。


キャッシュデータを読み込む
loadcache="半角数値"
 キャッシュデータから画像を読み込みます。1~8までの値を読み込み可能です。キャッシュに記憶されるのは、あくまで画像だけであり、効果音や一時描画は記憶されません。このパラメータはfilenameよりも優先して読み込まれます。また、画像が存在しない場合は、fileNameで指定したファイルをロードします。キャッシュの寿命は短いので注意してください。


キャッシュデータを読み込む
savecache="半角数値"
 画像をキャッシュデータに書き込みます。1~8までの値を読み込み可能です。キャッシュに記憶されるのは、あくまで画像だけであり、効果音や一時描画は記憶されません。画像は加工した後で書き込まれます。キャッシュの寿命は短いので注意してください。


なんでしょう、この「キャッシュの寿命は短いので注意してください」というのは。十回使ったら消えてしまうとでもいうのでしょうか。どう短いのか説明してもらわないと注意のしようもありませんが・・・と思ったら、その説明は同ヘルプの〈FAQ〉の項目にありました*3


Q5.キャッシュって何?
 JPY1ファイルでsavecacheで画像を一時的に保存し、loadcacheで画像を取り出します(取り出してもキャッシュの画像は元のままです)。メモリで保存している画像を使うので、ファイルを読み込むよりも描画速度が速くなります。このメモリの寿命は短く、パーツ内(及びそのファイルがロードするJPY1ファイル内)で消滅してしまいます。
 一目見ただけでは、何を使っているのか分からない上、JPY1メーカーで確認するのも難しいので、テンプレートファイルで使う以外は、使わないほうが良いと思います。


JPY ファイル内で有効なら常識の範囲で、特段に短すぎるということはありません。


検証1


念のため、ひとつのキャッシュを何百回も利用する例を示しておきます。今までの親父横移動をより細かくし、一回の移動距離を 1 ピクセル、ウェイトを 10 ミリ秒にしてみました。X 座標で 0 ~ 631 ですからセクション数は [init] 込みで 633、キャッシュの利用は 631 回です。
なお、これを表示するための JPY ファイルは 4000 行を超えるので割愛します*4



最後まで表示されていますので、少なくとも途中で消えたりすることはなさそうです。


検証2


更に、キャッシュが JPY ファイルの外にまでは及ばない、ということも確認しておきましょう。これはどうするかというと、一つの背景変更コンテント内にふたつの JPY ファイルを並べておき、一方で保存したキャッシュを他方では読み出せないことが確認できればじゅうぶんです。


まず最初に、キャッシュを利用した親父横移動アニメを配置します。


  1: [init]
  2: 
  3: [Master_00]
  4: fileName=宿の亭主.bmp
  5: savecache=1
  6: visible=0
  7: animation=3
  8: animeposition=0,0
  9: wait=250
 10: 
 11: [Master_01]
 12: loadcache=1
 13: visible=0
 14: animation=3
 15: animeposition=150,0
 16: wait=250
 17: 
 18: [Master_02]
 19: loadcache=1
 20: visible=0
 21: animation=3
 22: animeposition=300,0
 23: wait=250
 24: 
 25: [Master_03]
 26: loadcache=1
 27: visible=0
 28: animation=3
 29: animeposition=450,0
 30: wait=250
 31: 
 32: [Master_04]
 33: loadcache=1
 34: visible=0
 35: animation=3
 36: animeposition=600,0
 37: wait=250

これ自体は、前に出てきたものとそのまま同じです。
次の JPY ファイルは、キャッシュの保存を行わずに読み出しだけを行います。


  1: [init]
  2: 
  3: [Master_00]
  4: loadcache=1
  5: visible=0
  6: animation=3
  7: animeposition=0,0
  8: wait=250
  9: 
 10: [Master_01]
 11: loadcache=1
 12: visible=0
 13: animation=3
 14: animeposition=150,0
 15: wait=250
 16: 
 17: [Master_02]
 18: loadcache=1
 19: visible=0
 20: animation=3
 21: animeposition=300,0
 22: wait=250
 23: 
 24: [Master_03]
 25: loadcache=1
 26: visible=0
 27: animation=3
 28: animeposition=450,0
 29: wait=250
 30: 
 31: [Master_04]
 32: loadcache=1
 33: visible=0
 34: animation=3
 35: animeposition=600,0
 36: wait=250

[Master_00] セクション(3 ~ 9行目)で、キャッシュを保存していない(ファイル名も指定していない)ことに注目して下さい。この JPY ファイルには savecache がなく、loadcache だけが行われているわけです。
そして、この「キャッシュ保存なし」の JPY ファイルを、先の「キャッシュ保存あり」の JPY ファイルの直後に配置します。



これを実行しますと・・・




横移動は一回しか行われませんでしたから・・・それはもちろん「キャッシュ保存あり」の動作結果に相違ありませんから、「キャッシュ保存なし」の JPY ファイルでは一時描画が行われなかったことが分かると思います。


また、動作をよくみると「キャッシュ保存なし」の方はウェイトすら行われなかったことに気づくと思います。
当該の画像データがない場合、「表示はしないがウェイトだけはする」というような動作をするのではなく、セクション自体がキャンセルされると見てよさそうです。


まとめとおさらい


今回のポイントは以下の通りです。


  • キャッシュを利用すると描画速度が速くなる(かもしれない)
  • キャッシュは番号(1 ~ 8)で指定する
  • キャッシュの有効期間は JPY ファイル内でのみ有効である
    • ある JPY ファイルから、他の JPY ファイルで保存したキャッシュを使うことはできない

今回登場したパラメータは以下の通りです。


パラメータ名機能
savecache画像をキャッシュに保存する
loadcache画像をキャッシュから読み込む

次回は、画像を移動させるための便利なパラメータを紹介します。


戻る:アニメ編(その三)

*1 多分に「こっち側の人間」としての自嘲が含まれていたとは思いますが
*2 エフェクトブースターが登場したのは二千年代前半で、今より機器の性能が劣っていたことは言うまでもありません
*3 余談ですが FAQ とは「よくある質問(なのでまとめておくから質問する前に読んでおけ、同じ質問したらぶっ殺すからな、質問するお前にとってはただの一回でも質問される俺にとっては何百回何千回も同じことの繰り返しでウンザリしてんだよ f*** you)」という意味です(FAQ と f*** you の発音が似ているのは偶然ではありません)。書き手の文章力がないために書ききれなかった説明を Q&A 形式で補足するためのものではありませんし、なにより設定した質問の答えにさえなっていない回答まがいが多すぎることを遺憾に思います
*4 大量の処理を行う場合、テキストファイルで編集するより Excel で作成する方法が楽です。その方法については番外編で説明します

シェアボタン: このページをSNSに投稿するのに便利です。

コメント

返信元返信をやめる

※ 悪質なユーザーの書き込みは制限します。

最新を表示する

NG表示方式

NGID一覧