RGSSとDXRubyの画像の扱いの違い

RGSSをいじっていて思うのは、DXRubyとの画像データの持ち方の違いである。
どっちもファイルを読んでオブジェクトとして保持する機能があり、画像に対して何かしらの編集をする機能もある。
名前はDXRubyのほうはImageクラス、RGSSはBitmapクラスだ。
DXRubyは線を引いたり円を描いたりするのに対し、RGSSは色相を変換したりぼかしを入れたり、という感じか。
ゲームを作るならそういう機能もあったほうがいいんだろうなーなどと思いつつ、今回はそれとは少し違った内部の話。


RGSSのBitmapクラスは画像を1枚保持し、rectやwidth、heightでサイズを返すことができる。
一部分を使いたい場合はSpriteクラスのほうでsrc_rectプロパティを指定する。
これは非常にシンプルな仕様で、わかりやすい。
対してDXRubyのImageクラスは画像への参照を持っていて、そのうちのどの部分をそのImageオブジェクトとして扱うかのx/y/width/heightを持っている。
画像データは更に内部にテクスチャとして持っていて、複数のImageオブジェクトが同じテクスチャを参照することができる。


DXRubyの思想は画像データを分割して保持し、負荷の高いテクスチャ切り替えを少なくするために、元の画像はそのままとしておく。
アニメーションさせる場合は、原則として同じ画像からデータを切り出して、複数のImageオブジェクトを切り替えて描画させる。
RGSSで複数の画像を1枚にまとめてアニメーションさせる場合は、Sprite側でsrc_rectを変更してやる。
Spriteが画像の分割方式(サイズや順番)を知っている必要がある。
どの処理をどこに置くかの違いであって、どっちが優れているというわけではないが、とりあえずDXRubyのほうが、内部で参照カウンタを持ってテクスチャを管理しているぶん仕組みは複雑だ。
複数の画像で同じテクスチャを参照すると編集したときにほかのオブジェクトに影響が〜、というのは、ツクールのRPGのコードでCacheモジュールを提供しているから、状況は似たようなものかもしれない。


RGSSのこの設計は、基本クラスとして描画用のSpriteが存在するからこそ可能なことだろう。
Spriteは画像ではなく、画像への参照を持ち、自分自身をどこにどのように描画するかの情報を持つ描画のための基本型、いわゆる描画プリミティブである。
DXRubyにはそのようなものは設計思想上無く、もう一段原始的になっている。
しかし、もともとDirect3Dを使って厄介な細工をしながら高速化するのが目的なのだから、最適化のことを考えれば描画プリミティブクラスを用意してもよかったのかもしれない。
そういうのを作ってそっちに処理を振り分けることで、Direct3D的に効率のよい構造をとりやすくなるはずだ。