RSS2.0

友人とハッカ村的な場を作ってアクションゲーム制作に挑戦しました

ここ最近休日を有効活用しきれてないなーと感じていたので、先週の土曜日に、友人と集まってそれぞれ自分の作業をするハッカソン的イベントを開いてみました。お題は特になく、自分で決めた目標にむかって刺激し合いつつも、もくもくと作業していこうぜ、という主旨です。ハッカソンならぬハッカ村です。

友人達は iPhone 用ゲーム作りを進めたり、ドールのメイク(?)をしたり、南方海域へ出撃したり、まどマギ叛逆を見たりとそれぞれ個性あふれるテーマを選んでいました。私は気分転換をかねてアクションゲーム的なものを作ってみました。RPG には幾度となく挑戦しては敗れたり破れなかったりしていますが、アクションゲーム制作は(おそらく)はじめてで楽しかったです。
slashfox.png
できあがったのがこちら。
グラフィックを用意する時間があまり取れなかったので、適当に描いても味があるように見せかけられる和風テイストにしています。かなり昔に見つけてブックマークしていたいい感じの水墨画ブラシがここで役に立ちました。

製作期間は、キャラクターや背景などの画像素材の用意も含めて 1 日に区切っていました。ハッカ村はお昼頃集合で開始だったので、午前中に家で必要になりそうな画像はひととおり準備しています。プレイヤー画像 4 点、敵画像 1 点、背景画像 1 点、ライフゲージ 1 点をだいたい 3 時間強で描いています。

最終的なゲームの仕上がりとしては、果たしてゲームに成立しているかと言われるとかなり微妙なレベルなのですが、これまでのゲーム開発での蓄積もあって、それなりの速度感で作っていけたんじゃないかと思います。ゲームのメインロジック、テクスチャー合成、キーボード入力処理、キャラクターのアクションの扱いなんかは別で作っているゲームのエンジン部分をそのまま利用しています。ちょっと斬撃エフェクトの演出効果を変えたいという場面で、テクスチャーのパラメーターを 1 つ変えるだけで加算合成や乗算合成に切り替えられたりというのは、開発環境としてはなかなか使い心地が良かったです。

続きを読む ゲーム製作雑記  コメント (0)  2014/05/22 08:52:14

AWT Graphics での描画処理を高速化してみる

ゲーム開発は引き続き土台整備をしています。

LWJGL でテクスチャーを読み込んでいたら、サイズが 1024 * 1024 以上の画像が 3 枚くらいになってからロード時間の長さが気になるようになりました。
画像 1 枚読み込むたびに 1 秒くらいかかるとなると、さすがに見過ごせないなーということで、きっちりプロファイリングして原因を探ってみました。

結論から言うと、読み込んだ BufferedImage を LWJGL の glTexImage2D() に渡す ByteBuffer に変換する際に Java AWT の Graphics を使っていたのが問題でした。

glTexImage2D() に渡す画像のバイトデータには、ある形式の ColorModel・Raster を使っているのですが、読み込んだ画像の画像データ形式がこれと同じという保証はないため、正しいデータ形式の BufferedImage を作って、Graphics.drawImage() で描き直していました。が、この Grpahics を使った処理が思いの外重いのです。

AWT の Graphics を使わずに、BufferedImage のピクセルデータを直接 ByteBuffer に積み直すという処理に変えてみたところ、かなり高速化することができました。

改良前後の速度差はこちら。
画像の大きさとファイルサイズが違う画像をいくつか読み込んで処理時間を計測してみました。
PNG 800*400 32.6KB
  212.79561 mili sec. → 36.39858 mili sec.

PNG 500*250 13.4KB
  29.673136 mili sec. → 18.440008 mili sec.

JPG 2048*2048 347KB
  640.6848 mili sec. → 79.925674 mili sec.

PNG 1024*1024 1.22MB
  618.1265 mili sec. → 45.179134 mili sec.

PNG 960*480 240KB
  104.69864 mili sec. → 14.152516 mili sec.
のきなみ速くなってます。
Graphics 使用時に数百ミリ秒かかっていたのが数十ミリ秒で変換できるとなると、まさに効果は抜群だ!という感じ。1 桁減るのは大きいですよねー。

……うーん、ゲーム用途では AWT Graphics は使っちゃだめだということですね。
今回は LWJGL 用ということで ByteBuffer に積み直してますが、AWT でゲームを作る際にも、Raster に対して直接ピクセルデータを読み書きするとか、Raster から DataBufferByte(等)→ byte 配列を取り出し、直接ビット演算して BufferedImage 再構築するとかした方が早くなりそう。とにかく Graphics を介しちゃうと重くなってしまいます。
続きを読む ゲーム製作  コメント (0)  2012/06/15 22:44:20

3D マップに 2D キャラクターを配置してみた

かなり久しぶりの自作ゲームの報告です。何ヶ月ぶりだ(笑

や、LWJGL のゲーム製作系記事で貯めてたノウハウをやっと自分のゲームにフィードバックできるようになったので、またちょっと進んだのです。
戦闘シーンの画面表示以外のロジックをちょこちょこ書いてたりはしてたのですが、見える部分を機能拡張するとだいぶ見栄えが違うなーということで少しだけお披露目です。

今週実装していたのは、Blender で作った 3D マップ上に 2D キャラクターを配置して動かすというものです。
rpg001.png

続きを読む ゲーム製作  コメント (0)  2012/06/08 19:59:25

lwjgl でアニメーションするメッセージウインドウを実装する

 ブログ開発も落ち着いてきて、最近はまたちらほらとゲーム作りに戻ってきています。ブログのネタとしては初かな。
今日はゲームには欠かせないパラパラとメッセージがアニメーション表示されるやつのチューニングをしてました。

 メッセージのアニメーションには、各フレーム毎に追加表示する分だけの文字を書き足していく、という実装をすると思います。今まではこの文字の追加表示のためにフレーム毎にテクスチャを glTexSubImage2D() で修正していて、アニメーション中は 6 ~ 10 FPS くらいしか出てなかったのです。
 OpenGL 使いな方に言わせるとかなりあり得ない実装だったんでしょうが、実際やってみてそのあり得なさを実感した感じです。テクスチャ生成系はやっぱり重いですね。
80e5664108a9b044540b0db00b5ea2f9b6f7.jpg
私は 60 FPS を目安に作っているので、6 FPS とかに落ちると目に見えてアニメーションがカクカクになります。それこそ中割りの少ないアニメみたいな。動画さんもっとがんばれーみたいな。

2012/06/15 追記

その後の調査でボトルネックはテクスチャー更新というより、Java AWT の Graphics を使った日本語フォントの描画だったのではないかという疑惑が浮上しましたが、今回のチューニングの趣旨(テクスチャー生成回数を減らす)自体は相変わらず有効なので、実証はしていません。
脱 AWT Graphics ができれば、さらに高速化を図れると思われます。

続きを読む ゲーム製作  コメント (0)  2012/02/24 00:39:37
プロフィール HN: ももかん
ゲーム作ったり雑談書いたり・・・していた時期が私にもありました。
カレンダー
<<2018, 4>>
1234567
891011121314
15161718192021
22232425262728
293012345