投稿記事

無料プランの記事 (168)

Heliodor 2021/03/17 17:15

少しだけ詳しく水たまりプログラム説明 その1

なんとなく買い溜めていたレトルトカレーの賞味期限やべぇ!と毎食ひたすらカレーを食べていたら、最後の一つで賞味期限が2021年ではなく2022年ということに気が付きました。

……カレー美味しいですよね。ヘリオドールです(挨拶)


今回はカレーとは関係無くプログラムのお話です。
先月の白い液体の水溜まりのプログラム、もう少し詳しく説明していこうと思います。
なんかパッと作ったみたいに見えますが、実際はかなり紆余曲折苦労があったんですよ。


さて、地面にたまった巨大な水たまり(白濁液)の中をバシャバシャ進んでいくというシチュエーションを用意するにあたって、まず真っ先に思いついたのが以前作ったプールの水面プログラムを流用することです。


プール用に作ったコレ

これを元にして水たまりを作るわけですが、水底や側面は水たまりに必要ないので、プールの上面だけを表示するようにします。

本当にただ不要なものが消えただけですね。
この水面を地面の高さまで下げて配置してみれば、とりあえず水たまりにはなりそうです。

今回は白濁液の水たまりですから、水面の模様を削除して白色にし、波もあまり派手に立てないように抑えておきます。


すると次のようなものができました。
分かりやすいようにポリゴンメッシュも一緒に表示してあります

ところでこれ、当たり前なんですが完全な長方形の水たまりなんですよ。
水面計算の時に作る格子メッシュ自体が矩形前提ですからね。
でも水たまりであるからには、もっと不定形で、せめて楕円をいくつか組み合わせた程度の形にしたいですよね。

そこで思いついたのがステンシルを使って水面メッシュを適当な形に切り抜くという方法です。


【補足】ポリゴンを描画するとき、普通はテクスチャ付きのポリゴンを画面に対して描画するわけですが、代わりにステンシルバッファという特別な画面に対して描画して、その結果できた画像をマスクとして使うことができます(お絵描きツールでいうところのクリッピングマスクのようなものです)。
このステンシル(≒クリッピングマスク)を使うことで、特定の部分だけ描画することができるようになります。


まずステンシルバッファを用意して、そこに楕円の形をしたポリゴンを書き込みます。
楕円はこんな感じで配置しておきます。

この状態で、ステンシルをマスクとして設定して水面を描画すると、水面のうち楕円に重なる部分だけが描画されるというわけです。

一応楕円を組み合わせた形の水面ができたわけですが……う、うーん、あんまり水たまりっぽくはないですね?

ステンシルで切り抜くと、切り抜きの境界線がハッキリクッキリしちゃんうんですよね。いかにもで切り抜きましたって感じで。まあ切り抜いたんですけど。


これはさすがにちょっとなあ……。
というわけで、次回は境界線の部分をどうにかしようという話に進みます。

つづく





フォロワー以上特典、Ci-enカードのお話。

フォロワー以上限定無料

まずは無料プランで様子見を。 お気軽にフォローしてみて下さい。

無料

【 500円 】プラン以上限定 支援額:500円

このバックナンバーを購入すると、このプランの2021/03に投稿された限定特典を閲覧できます。 バックナンバーとは?

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Heliodor 2021/03/04 19:34

雑談

またゲーム制作とは関係無いどうでもいい話です。

プリンターを買い換えました。それだけです。



元々使っていたプリンター、ずっと微妙に調子悪かったんですが(紙2枚引き込んで詰まったり、逆にしっかり引き込めずにエラーが出たり)、ある日突然OS側から認識しなくなりました。確定申告で忙しい時期に。

ちゃんと電源は入って起動しているし、もしかしたらドライバー入れ直しで直ったり、他のPC(ノートPCとか)で認識するかもしれませんが……もう古い奴だし、前々からインクカートリッジ買い替えるぐらいなら本体買い替えちゃってもいいかなぁと思ってはいました。正直色々面倒臭くなってたというのもあります。


カラー印刷はあんまり使わないし、なんならコンビニでも出来るし、白黒で充分……となるとレーザーだな!会社のアレ早くて奇麗で便利で羨ましかったんだよな!と、ワクワクしながらAmazonで検索。

元々使っていたインクジェットプリンターがたしか2万円ぐらいだったので、レーザーだと4~5万円ぐらいはするのかなーと思っていたのですが、1万円台で良さげなのをいくつか発見!しかもちゃんと大手メーカー製。

レーザープリンターは高価なイメージでしたが、こんな安いならもっと早く買い替えるべきだったー、と即注文。



そして翌日――。

想像よりも大きな箱が届いてビビる。
箱が大きいだけかと思ったらズッシリ重くて二度ビビる。



ち、ちょっと待ってレーザープリンターってこんなデカいの!?


右にあるシルバーのが元々使っていた大きさ比較用のインクジェットプリンター(どっちも最大A4印刷)と、どこの御家庭にもある1/144ペイルライダーです。

会社でよく見るレーザープリンターは業務用コピー機みたいなヤツばかりだったので、家庭用プリンターがこんなに巨大だとは思いませんでした。


ちゃんと実物を見て買えば……いやこんなの持って帰れないし、急ぎ必要だったのも事実。もちろん大きい機種も小さい機種もあるんでしょうけど、これ程とは……。

どこに置こうコレ……。



でも印刷は早くて奇麗。
あと白黒プリンターなのにフルカラーでスキャン機能が付いてた。マジか。

1件のチップが贈られています

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Heliodor 2021/02/28 17:27

続・最近の作業まとめ

例の液体の処理です。
今回もまたフォロワー以上で。

フォロワー以上限定無料

まずは無料プランで様子見を。 お気軽にフォローしてみて下さい。

無料

【 500円 】プラン以上限定 支援額:500円

このバックナンバーを購入すると、このプランの2021/02に投稿された限定特典を閲覧できます。 バックナンバーとは?

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Heliodor 2021/02/25 17:37

あまり参考にならないメモリー使用量の話


昔のゲームROMとか覗くと出てくる、こういう感じの画像。
なんでこんな細切れ状態なのか? というお話です。

あやかし紅白戦のメモリー使用量は今のところ700MBぐらい。

ヴィータ大脱出200MBを超えないように作っていたので、あやかし紅白戦は3~4倍ぐらい贅沢に使っています。

それでも近年のWindows10搭載PCは最小構成でも4GB(4096MB)ぐらいは搭載しているので、ヴィータ大脱出の頃とくらべるとかなり楽になりました。

とはいえ32BitOSでは、ひとつのアプリで2GBまでしか扱えないので、あまり油断もできません。
64bitOSなら小学生が考えたようなスゴイ数値になりますが、Windows10にも32bit版はあるし、物理的に搭載しているメモリーに限界もあるので無制限というわけにもいきません。
(※参考までに、プレステ3のメインメモリーは256MB。OSとか全然違うので一概には言えませんが、あやかし紅白戦どころかヴィータ大脱出もギリギリ動くかどうかというレベルです)


普通のゲームならそんなに気にする部分ではないのですが、当サークルのゲームはとにかくドット絵によるベタアニメが多いので(調子に乗って全画面アニメとかやってるし)メモリー使用量を気にせず作るとトンデモ無いことになります。


例えば主人公が立ち止まっている待機中の20枚のアニメーション。


これは256ピクセルの正方形なので、そのまま読み込むと一枚当たり256×256×4=256KBのメモリーを消費します。このまま表示すると立っているだけで約5MBのメモリーが必要という計算になりますね。
(カラーはRGBそれぞれ8bit、加えてアルファで8bitあるので32bit=4バイト)

どんな超効率圧縮されたデータでも画面に表示するときは1ピクセルずつメモリー上に展開するので、BMPファイルと同じサイズだけメモリーが必要になるわけです。


今のところ、こういう画像が5000枚ぐらいあって、そのまんま全部読み込むと1.5GBを超えます。
(まだ組み込んでいない画像や、今後描いて増える分も考えると最終的には3GB以上になると思われます)
画像だけでこれなんで、エフェクトとか効果音とかその他色々込みで考えるとエラいこっちゃですね。

あんまり低スペックPCのことは気にし過ぎても作るの大変ですが、全く気にしないと64BitOS必須 メモリー最低8GB以上というヘビー級の同人ゲームになってしまいます。見た目はただの2Dゲームなのに。




ではどうするか? 基本的な考え方は2つ。

1.必要なデータだけ読み込んで要らないデータはどんどん破棄する
2.データそのものの無駄を省く

1の方法ははゲーム機なんかで読み込みが入るのを思い出してもらうと分かりやすいですね。
ステージ1からステージ2に進んだら、ステージ1のデータを破棄して新しいデータを読み込むワケです。
逆にステージ1をプレイ中にステージ2のデータは必要ありません。
こうやってこまめにデータを入れ替えれば、少ないメモリーでも動作できるというわけです。


だかしかし

主人公のアニメーションデータはそうもいきません。
基本的にはいつでも全部メモリー上に持っている必要があります。
(極限まで切り詰めるならリアルタイムで圧縮データ展開とか方法が無いでもないですが)


そこで2の方法ですが、先程の待機モーションとか、画像の余白が結構ありますよね?


大雑把ですが、この水色の部分。余白は無駄なんだ……無駄だから嫌いなんだ 無駄無駄……。
もちろんアニメーションするので、画像によって余白のサイズはまちまちです。

こんな風に16×16ピクセルで区切って、画像の入っていない部分をカットして一つのテクスチャーに入るだけ並べていくと無駄がかなり少なくなるというわけです。


もちろん手動でこんな超面倒くさい作業やるわけには行かないので、16×16サイズで画像を再配置する専用のプログラムを作ります。

みっちり詰められて1枚のテクスチャーとなった待機アニメ20枚分


テクスチャーとして扱うので一辺が2のn乗サイズになっていると無駄がありません。
また、ここではやっていませんが、この16×16ドットで全く同じになる画像がたまに出てくる場合があり(真っ白とか肌色一色のベタとか)こういう重複を省いていくと更に節約が可能になります。

そして実際にゲーム画面に表示するときに再配置し直すワケです。


左がそのまんま使う場合、右が節約した場合です。

節約した場合、実際の画面には16×16の画像がたくさん並んでいる状態ですね。
画期的な方法みたいに語ってますが、昔からよくある手法ですし、ヴィータ大脱出の時点でも採用しています。

他にもメモリー節約する方法は大小色々ありますし、今回紹介した方法ももっと細かくやって切り詰めることもできますが、プログラムが煩雑になりますし、その分処理も重くなります。



そんなワケで、今のところ手持ちで一番ショボイリーズナブルなPCで動作するラインを基準にやっています。ドン〇ノート大活躍。
それでも年々PCパワーは上がっているので楽ちんになりました。

ムーアの法則素晴らしい。
それを守ってるintelやAMDも素晴らしい。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Heliodor 2021/02/21 13:33

最近の作業まとめ

ここ2週間ぐらい脳ミソ沸騰しそうになりながらやっていた作業の話です。
twitterでちょいちょい報告していましたが、補足・説明付きでまとめました。

まだ未確定な部分とかあるので、一応フォロワー以上で。

フォロワー以上限定無料

まずは無料プランで様子見を。 お気軽にフォローしてみて下さい。

無料

1件のチップが贈られています

チップを贈るにはユーザー登録が必要です。チップについてはこちら

2 3 4 5 6 7 8

限定特典から探す

記事のタグから探す

月別アーカイブ

記事を検索