ゲーム用ライブラリ2というか続き

去年9月に書いたエントリーの続きになりますかね。

DXライブラリの3D対応と、Selene作者の2Dゲームライブラリ Artemisを触ってみました。
といっても、実際に触って試したのは2月頃のことだったりします。
書こうと思ったのが今ってだけです。


まずDXライブラリから。

なんとMMDのモデルデータとモーションデータ(pmd , vmd ) が読めます。関数1つだけで。

なので、MMDでモーションを付けて、プログラムで再生とかできます。
公式のサンプルソースみると分かりますが、ホント簡単です。

もちろんMMDだけじゃなく、xファイルも、メタセコイアのmqoも読めます。すげぇ。


次にArtemisですが、DXライブラリを意識してるためなのか、Seleneに比べてC言語寄りというか、オブジェクト志向っぽさが減りました。
でもその分(?)Seleneより難易度が下がった気がします。

ArtemisSDKが提供する関数自体、Seleneに比べて随分少ないので、覚えることも少なくて済みます。
ですが、ゲームを作る上で必要な機能は大体揃ってる感じ。

今のところ、画像や音声ファイルを読み込むのがファイル名指定しか手段が無いのが難点です。
SeleneのLiatrisで作ったパックファイルが読めるようになってくれたり、せめてメモリからロードできるようになってくれるとありがたいのですが。
というか、いずれそうなるはず。必須だもの。

今のところトライアル版ってことなので、足らない機能は期待して待つことにしましょう。


さて。
結局ゲーム作るときに、どれを選択すればいいのよって話になるんですが、その前に性能を軽く比較してみました。

DXライブラリ vs Seleneで3D対決と、DXライブラリ vs Artemisで2D対決です。
対決ってほどのこともないんだけど。

其々のライブラリを使って同じものを作って比較ってことをしました。
完成品は公開しないですけどね。

ベンチマークのような客観的な比較材料はとってません。
作りやすさとか、動作の見た目とかの主観です。

まず3D対決ですが、作ったのは単純に、適当な3Dモデル(ネットで配布されてるメタセコイアのデータ)を回転させるだけのものです。

作りやすさはやはりDXライブラリのほうが上ですね。
上記でも書きましたが、3Dモデルの扱いが非常に簡単です。

その分複雑なことは出来ないので、高度なエフェクト(ポストエフェクトとか視差遮断マッピングみたいなライティングとか)を使ってリアルでカッコいい表現がしたい場合はSeleneを使うことになりますね。やっぱり。

DXライブラリとSeleneで同じものを作って動作を見てみましたが、大した違いはありませんでした。
まぁ、DXライブラリに可能な3D表現を、より高度なことができるSeleneでやるだけなので、あまり意味のある比較じゃないですね。

CPU使用率もほぼ変わらず。簡単なモデルデータ1つだけだったから、もっと大量のモデルデータ使ったら差がでたかもしれませんが。

あ、1点。
Seleneは3Dデータの初回呼び出し時、一瞬プログラム自体が固まります。
小さなモデルデータなら気になりませんが、ちょっと大きなモデルデータになると気になるんですよね。
PreShaderSetupDrawObject使うと大分改善されますが、それでも初めて画面に表示する際にどうしても一瞬固まります。

DXライブラリの場合、固まらない代わりに描画が遅れます。

私の作り方がまずいのかなぁ・・・


次に2D対決ですが、作ったのはArtemisSDKのポストエフェクトのサンプルソースにある、大量のボールを画面上で跳ね返らせてるやつです。
DXライブラリにはポストエフェクト機能はないので、そのへんは省略して作りました。
もう一つ、一枚の画像をゆっくり回転させるだけのものも作りました。

まず作りやすいさですが、Artemisのほうが若干使い易いような気がします。
ですがコレは、好き嫌いの問題なので、人によってはDXライブラリのほうが使い易いでしょう。

Artemisの画像描画関数は、一枚のテクスチャに対し、そのテクスチャの任意の矩形を指定して、画面上の任意の位置に、任意の大きさで、(任意の角度で)描画する、という指定の仕方をします。
引数は多くなりますが、コレで大抵のやりたい事はできます。

・Draw_QuadWithTexture (矩形を指定してそのまま表示)
・Draw_QuadRotateWithTexture (矩形の中心を基準に回転させて表示)
・Draw_QuadRotateOffsetWithTexture (回転の中心を指定して表示)

この3つしかありませんが、使う関数はQuadRotateOffsetWithTexture一つですべて事足ります。
回転させないのであればQuadWithTextureだけでいいです。

大してDXライブラリは、基本的にテクスチャ1枚をそのまま(矩形を指定せずに)、任意の位置に(任意の大きさ、角度で)描画する、という指定をします。

・DrawGraph  メモリに読みこんだグラフィックの描画
・DrawTurnGraph  メモリに読みこんだグラフィックのLR反転描画
・DrawExtendGraph  メモリに読みこんだグラフィックの拡大縮小描画
・DrawRotaGraph  メモリに読みこんだグラフィックの回転描画
・DrawRotaGraph2  メモリに読みこんだグラフィックの回転描画(回転中心指定あり)
・DrawModiGraph  メモリに読みこんだグラフィックの自由変形描画
・DrawRectGraph  グラフィックの指定矩形部分のみを描画

の7つがあり、QuadRotateOffsetWithTextureに相当するのはDrawRotaGraph2なんだけど、一枚のテクスチャから任意の矩形を指定して描画するのはDrawRectGraphのみで、DrawRectGraphは拡大、回転ができません。
任意の矩形を指定して拡大回転するには、DerivationGraphで切り取った別の画像ハンドルを使ってDrawRotaGraph2を呼ぶ必要があり、余分に画像ハンドルを管理する必要があります。
DXライブラリはアニメパターン毎にファイルを作るイメージです。

DXライブラリでアニメパターン使う場合は、LoadDivGraphっていう画像ファイルを指定サイズで分割して、ハンドルを配列で返す関数を使う手もあるけど・・・
フレームワーク作る際に配列と非配列両対応するのってメンドい気がするし。

これは好き嫌いの話になるんだけど、私は関連する画像(キャラのアニメパターンとか)は、一枚の画像にした方が管理が楽だと思っているので、Artemisのように矩形指定できたほうが嬉しいのです。
Artemisでも1枚1ハンドルで使ってもいいしね。

あと、表示位置の指定が、Artemisは画像の左上の座標を指定するのに対し、DXライブラリは画像の中心を指定します。

これは、キャラの座標=画像の中心座標という考え方をした場合、DXライブラリのほうが判りやすくていいなぁ、と思います。

拡大の指定方法も、Artemisは拡大後の画像サイズを矩形で指定するのに対し、DXライブラリは倍率を指定します。
これもDXライブラリのほうが分かりやすい指定方法だなと思います。

まぁ、Artemisの方法でも表示位置指定を幅半分ずらすだけでいいので変わらないのですけども。
逆に左上を基準に表示したいときもあるし、ホントに好き嫌いの差です。

DXライブラリは引数が少ないので、その分簡単に使える、とも言えます。

で、実際に動かしてみた結果ですが、大した違いは有りません。
フレームレートの計算が悪いのか、若干DXライブラリのほうが動きが遅い(Artemisのが早い?)感じです。
動きが遅いというか、微妙にカクカクします。
Artemis版と同時に実行すると分かりやすいのですが、Artemis版のほうが滑らかに動きます。

Artemisはフレームレートを安定させる関数があるのでそれを使いましたが、DXライブラリには無いので自作する必要があります。
DXライブラリ公式にフレームレートを固定するサンプルがありますが、あのサンプルはちょっと実用的ではありません。
こっちのサンプルで、変数Timeをintではなくdoubleにして、待つ時間も17ミリ秒じゃなく16.6666..秒にしたほうがまだマシです。

それでも何故かArtemisとずれるんだよね・・・なんでだろ。
Artemisのほうが滑らかに動く感じがします。

訂正
私の書き方が悪かっただけでした。
SetDrawScreen( DX_SCREEN_BACK ) ;
これ1行書くの忘れてただけでした。恥ずかしい。


描画周りはこんな感じです。

3D対決では、大きめの3Dモデル読み込み時の引っ掛かりは置いておくとして(私の問題かもしれないし)、簡単さを取るか表現の豊かさを取るかのトレードオフって感じです。

私の場合、3Dのプログラムはまだまだ初心者なので、3Dゲーム作るとしたらDXライブラリなんだろうなぁと思います。凝ったこと出来ないので。
でもいずれSeleneに移行する前提で。

2D対決では使いやすさにあまり差は感じられなかったので、ポストエフェクトが使える分Artemisに軍配を上げます。
ただ、冒頭に前述したようにファイルのメモリロードやパックファイルが使えない現状では、完成品は作れないなぁ・・・といった感じです。

あと、描画ではないのですが、音声の再生で、DXライブラリはパン(左右の音量の比率)の設定ができるけど、Artemisは現状できないっぽいのが残念。
2Dのゲームにパンは不要って判断なのかなぁ・・・。結構使うと思うけど。
Seleneではパン実装されてるのだし、ソース流用すれば手間あまり掛からないんじゃ?とか。

Artemisは今だトライアル版なので、正式公開した時に上記に上げた不満点が解消されてれば、2Dゲームを作るならArtemis一択になりそうです。

Artemisについての要望って今出してもいいんだろうか・・・。Seleneしか受け付けてないんだろうなぁ。

追記
そうそう。
気にしない人も多いかもしれないけど、リリースモードでのプログラムサイズは、

Selene(1.22l) 3.16Mb
Artemis(Trial) 794kb
DXライブラリ(3.02e) たぶん800kbくらい?

で、SeleneとArtemisはDLLとして配布。DXライブラリは静的Libなのでexeにくっつきます。
Seleneについてはさらに、音声出すためのコーデックが別途必要で、標準で
OggVorbis.dll 1.223kb
wave.dll 47kb
が同梱されてます。
BGMをOggで、効果音をwaveで鳴らそうと思ったら、この2つが必要ってことですね。

Selene.dllと合わせて4.5Mbか。
Seleneでかいなぁ。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

認証のために問題を解いて下さい * Time limit is exhausted. Please reload CAPTCHA.