Heliodorさんをフォローして、最新情報をチェックしよう!

マイページへ

Ci-enはクリエイターに対して、金銭的な支援を送ることができるサービスです。

投稿記事

続・ゲームデータの自動ビルドについて

前回の続きです。

生ファイルからゲームファイルを作るとき、生ファイルのタイムスタンプを調べて、異なっている場合だけ再ビルドする、という話でした。
しかし、その方法で再ビルドしてもうまくいかない場合があります。

それはファイルが「変更」ではなく「削除」されてしまった場合です。


例えば、ある生ファイルが不要になって削除された場合、そこから生成されたゲームファイルも削除しておかないといけないという事です。逆に、なんらかの手違いでゲームファイルの方を削除してしまった場合、ファイルが削除された場合、たとえ生ファイルに何の変更も無かった場合でも再ビルドしてゲームファイルをら作り直さないといけません。

結局、処理しないといけないのは次の場合についてです


A. 新しい生ファイルが追加されている(前回のビルド情報が存在しない)→ビルド
B. 生ファイルが変更されている(前回ビルド時とタイムスタンプが異なる)→再ビルド
C. 生ファイルが削除されている(前回ビルド時には存在したのに、今は無い)→対応するゲームファイルを削除
D. ゲームファイルが消えてしまった(前回のビルド時には存在したのに、今は無い)→対応する生ファイルを再ビルド


ここで気をつけないといけないのはDのパターンです。1つの生ファイルから1つのゲームファイルが出来る場合は話が簡単なのですが、1つの生ファイルから複数のゲームファイルができる場合(例: psdからレイヤごとに分解したpngを生成)、あるいは複数の生ファイルから1つのゲームファイルができる場合(例: 複数のpngを結合して一枚の大きなpngを生成)は少々ややこしいことになります。

例えば生ファイルAからゲームファイルaが、生ファイルBからゲームファイルbができる場合は、ゲームファイルaが消えているなら生ファイルAを再ビルド、ゲームファイルbが消えているなら生ファイルBを再ビルドすればいいだけです。

しかし、2つの生ファイルAとBから1つのゲームファイルcができる場合、ゲームファイルcが消えていたら生ファイルAとBの両方を再ビルドしないといけません。

逆に、1つの生ファイルAから2つのゲームファイルbとcができる場合、ゲームファイルbとcのどちらか一方でも消えていたら生ファイルAを再ビルドしないといけません。



このようなややこしい状態を解決するためには、生成関係を保存しておくようにします。例えば生ファイルAからゲームファイルaが生成される場合は、
A→a
と記録し、生ファイルBからゲームファイルbが生成されるなら
B→b
と記録します。

もし1つの生ファイルCから2つのゲームファイルdとeが生成されるなら
C→d
C→e
と記録し、逆に2つの生ファイルFとGから1つのゲームファイルhが生成されるなら
F→h
G→h
と記録します。

このようにして、生ファイルとゲームファイルの生成関係ペアを全て記録しておきます。これは生成関係の記録であると同時に、どんなゲームファイルを出力したかのリストにもなりす。このリストにあるゲームファイルが実際に存在するか確認し、消えていたら生成関係を調べ、関係する生ファイルを再ビルドすればゲームファイルを再生成できます。

例えば出力ファイルaが消えていた場合、aを含むペアを検索すると
A→a

が見つかるので、生ファイルAを再ビルドすればゲームファイルaが得られる事が分かります。同様に、出力ファイルhが消えていたならhを含むペアを検索すれば
F→h
G→h

の2つが見つかりますから、生ファイルFとGを再ビルドすれば良い事がわかります。

ちなみに、ビルド方法が複雑になって中間ファイルが必要になった場合でも同じ方法で対処できます。例えば生ファイルAとBから中間ファイルcが、中間ファイルcからゲームファイルdとeができる場合、
A→c
B→c
c→d
c→e

となるので、もしゲームファイルdが消えていたなら、dに必要なのは中間ファイルcだと分かり、中間ファイルcを生成するためには生ファイルAとBが必要だと分かります。

長くなりましたが、これでやっとビルドツールがまともに動作するようになり、データの変換という煩わしい作業を自動化する事ができました。


ちなみに、こういった「〇〇を作るためには△△が必要」みたいな情報を管理する方法は、スキルツリーやアイテム生成などの管理にも使えます。たとえば薬を得るためには薬草とお湯が必要で、お湯を得るためには水と炎か必要だとか、そういったものです。

これに関してもっとちゃんとした説明が欲しい方は、グラフ理論、有向グラフ、依存関係グラフなどで検索すると、それっぽい話がいっぱい出てきますので参考にしてみてください。


フォロワ以上ー限定特典はサンプルプログラムです。

フォロワー以上限定無料

フォロワーが増えるとヘリオドールの製作速度が精神的に向上します。

無料
\いいねで応援!/

ゲームデータの自動ビルドについて

全然需要ないかな?と思ったら意外と見ている人がいるみたいなので、またプログラムの話でも(長文です)。
今回は、ゲーム用の画像とか各種ファイルの扱いが意外と面倒だよね、みたいな話をします。

ゲームで使う画像には主にpngを使用しているのですが、pngは思いのほか展開に時間がかかるため、何十枚もあるpngをそのまま素直に使うと、ロードに結構な時間がかかってしまいます。

ところで意外と知らない方も多いのですが、png画像は圧縮レベルを0から9までの間で指定することができます。レベル0は無圧縮、レベル1が最低圧、レベル9が最高圧縮になります。レベルが高いほど高圧縮でサイズが小さくなりますが、展開には時間がかかります。逆にレベルが低いほど低圧縮でサイズは大きくなりますが、そのぶん高速に処理できます。(ちなみに圧縮レベルが指定できないツールを使った場合、レベル5で処理される事が多いみたいです)。ということは、全てのpng画像を圧縮レベル1(低圧縮、高速)で保存してあればロードも早くなるという事ですが、保存時にpngの圧縮レベルを指定できるものは意外と少ないですし、そもそも画像を保存するたびに圧縮レベルを指定する(デフォルト設定だとレベル5になっている場合が多い)のも面倒な話です。

このように、編集時とは別に、ゲームに最適な形になるようファイルを加工して使いたいというのは、なにも画像に限った事ではありません。

例えば音楽や効果音は、編集時はwavで扱う事が多いのですが、ゲームではサウンドファイルをogg形式で扱っているため、全てのwavファイルをoggに変換しておく必要がありますし、セリフなどのテキストデータを暗号化したり、プレーンテキストで書いてあるスクリプトを事前コンパイルしてバイナリ形式に変換しておいたりなど、ゲーム専用のファイルに変換しておきたいものはたくさんあります。

しかし、これらの作業をその都度手動で行うのはかなり面倒ですので、編集用ファイル(生ファイル)からゲームアプリにとって都合の良いファイル(ゲームファイル)に自動的に作成するためのツール「ゲームデータビルダー」を作りました。

このツールは、生ファイルの入っているフォルダを指定すると、フォルダ内のさまざまなファイルに対して必要な変換を施し、それらをゲームファイルとして出力フォルダに書き出すというものです。生ファイルを編集したときは、このツールを起動すれば勝手にファイルをビルドしてゲームファイルを作ってくれるというわけです。

ところが、ただツールを起動するだけのビルド作業、意外と忘れる事があるんですね。画像ファイルを修正したあとにビルドし忘れたままゲームを起動し、変更箇所がゲームに全く反映されず混乱するという事故が多発しました。

そこでヴィータ大脱出を開発するとき、ゲームアプリ本体にデータのビルドツールを組み込んでしまい、ゲーム起動時に自動的にデータビルドも実行してしまうことにしました(もちろん製品版として世に出すときは、このビルド機能を削除しておきます)。

とは言え、さすがにゲームを起動するたびに全ファイルに対してビルド処理が入ったのでは起動に時間がかかってイライラします。そこで、ビルド時間を短くするために、無駄なビルドをしないように工夫することにしました。

ビルドが必要なのは生ファイルが変更された時だけです。無変更なファイルはわざわざビルドしなおす必要がありません。前回のビルド結果をそのまま使えば良いからです。そのためにはビルド時にファイル情報を記録しておき、次回起動時にその記録と実際のファイルを比較し、ファイルに変化があれば再ビルドし、変化がなければスキップすれば良いことになります。

さて、肝心なのは「ファイルが変化したかどうか」をどうやって調べるかです。それならハッシュを記録しておいて前回と今回のハッシュを比較すれば楽勝です、と言いたいところですが、それはちょっと問題ありです。ハッシュを比較するためにはファイルの最新のハッシュを知る必要がありますが、ハッシュを計算するにはファイルのバイナリを最初から最後までスキャンしないといけません。どのファイルが変化したかを予め知ることはできない(というかそれを知るのが目的)なので、結局のところ全ての生ファイルのハッシュを再計算しないといけません。生ファイルが数百MBあったりするとハッシュ取得だけで時間がかかってしまいます。

そこで、単純にファイルのタイムスタンプだけを比較するようにします。ビルドした時にファイル名と最終更新日時のタイムスタンプを記録しておき、それと実際のタイムスタンプを比較して「異なっていたら」変更ありとみなします。ちなみに、前回と比べてタイムスタンプが「新しく」なっていたら変更ありとみなすのはダメです。なぜかというと、バックアップなどからファイルを取り出して復元した場合にはタイムスタンプが古くなってしまう場合があるからです。なので、1秒でも異なっていたらファイルが変更されたと判断します。

まとめるとこういう事です。

まずゲーム起動時に前回のビルド情報をロードします。ビルド情報がなければ初回ビルドだという事なので、無条件に全ファイルをビルドします。ビルド情報があれば、全ての生ファイルについて前回ビルド時のタイムスタンプと、現在のタイムスタンプを比較し、完全に一致するものはスキップし、そうでなければその生ファイルを再ビルドしてゲームファイルを作り直します。

これでカンペキですね!
...と言いたいことろですが、これだとうまくいかない場合があるのです。


(長くなったので今回はここまで、後編に続きます)

\いいねで応援!/

ご報告

液晶タブレット買いました。

最近微妙に値下げしていたので、思い切って貯金と頂いた支援と合わせて買ってしまいました。

ご支援本当にありがとうございます。



今の主流からすると小さめな13.3インチですが、以前に店頭で実物を見たら想像よりもだいぶ大きかったので、私にはこれが丁度いい大きさみたいです。

さっそく練習で、ゲーム製作とは全く関係の無い22/7(※アイドルグループ名)の推しメン+体操着という欲望全開の絵を描いてみたんですが、楽し過ぎて止まらなくなり睡眠時間を削って一気に描いてしまいました。

それにしても液晶ほんと綺麗ですねえ。こうして見ると印刷物みたい。
考えてみれば13インチでフルHDなんて代物は初めてかも。



しかし板タブとは勝手が違い過ぎて、拡大して見ると線がへろへろです。塗りもかなり大雑把ですが……ま、まぁこれは趣味絵ですから……。

ゲームなんかで使うサイズまで縮小すると意外と分からないので、このレベルで量産するのはアリなのかも?
(地味子シリーズがいきなり雰囲気変わったりして……)


自分で描いておいてアレですが、現役な方のこういう絵(エロでこそ無いですが……)はどうかと思うので一応支援者限定でw

フォロワー以上限定無料

フォロワーが増えるとヘリオドールの製作速度が精神的に向上します。

無料
【 白銀ベリル 】プラン以上限定 月額:500円

先月以前に投稿された記事のため、この限定特典を閲覧するには[ バックナンバー購入 ]する必要があります。

月額:500円
購入する
\いいねで応援!/

記事を検索