RSS2.0

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

イエス! アスミス!!

聴き続ければ部活も期末試験も就職試験も司法試験もすべてうまくいくと巷で噂のひだまりラジオを最近聴いていました。
公式サイトのバックナンバーに過去の放送もだいたい残っているので、私みたいなご新規さんにも大変優しい番組です。
ありがとうアスミス!ありがとう長田さん!

それにしても長寿番組なんですねー。何度も消えては復活しているとは言えど。
無印の頃はアスミスが 23 歳とか言ってましたが、☆☆☆頃になると 27 歳…歴史とか勝手な親近感とかいろいろ感慨深いです。松来さんも言ってましたけど、そろそろ結婚して幸せになってもらいたいものです(余計なお世話)。

ラジオ番組は中の人の個性が見えてきて楽しいですね。
ひだまり本編での吉野屋先生&校長先生パートは、正直それに時間割くならゆのっち達を映して欲しいと思ってたのですが、ラジオのチョーさん回や松来さん回を聴いてキャラクターも好きになってきました。一度おとこのこパズルのフルバージョンも聴いてみたいなー。

ギガっちゲットだぜ!

今朝ひだまりラジオ×☆☆☆の最終回を聴いて、ああついにこれで終わりかー、寂しくなるなーと思ってふと Amazon を見てみると、なななんと☆☆☆特別編 Blu-ray 版が!いつの間に在庫復活したんだ!
これが噂に聞くひだまりラジオのご利益かー!ということでさっそくポチらせてもらいましたよー。
買うなら絶対 Blu-ray 版がよかったんですが、確かどこも売り切れてて買えなかったんですよね。すごい嬉しいです。
hidamarisp.png
限定版だと USB メモリ(通称: ギガっち)が付いてるのですけど、その中には散々聞いていたひだまりラジオ☆☆☆が(笑
や、なんか他にも聴いてなかったひだま~ぶるラジオもあったので全然 OK です。
続きを読む 雑記お買い物  コメント (0) 2012/06/10 20:55:26

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

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

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

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

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

LWJGL で Blender の 3D モデルを表示してみる

普通 3D モデルを作るには Blender やメタセコイアなどのモデリングソフトを使うため、ゲームプログラム側ではこれらのモデリングソフトで作った 3D モデルを読み込み、表示する機能が必要になります。今回は Blender で作成した 3D モデルを Wavefront OBJ フォーマットと呼ばれるデータ形式で書き出し、LWJGL で読み込んで表示してみたいと思います。

完成図はこちら。
kuma.png
カクカクしててすごくレトロな感じがしますね!(注意: 作ったモデルのせいです(笑)

続きを読む LWJGLBlender  コメント (3) 2012/06/03 11:33:06

LWJGL で光源を使ってみる

LWJGL でのライティングについて試してみました。3D モデルといっしょに光源を置いて光を当て、3D モデルに陰影をつけていく機能です。
screenshot.png
光源から発せられる光には、モデルの照らし方によっていくつか種類があります。
またライティングにおいては、光をどの向きに反射するかを決める法線をモデルに設定していく必要があります。

ベクトルなんかも出てきてちょっと長くなるかもしれませんが、それでは見ていきましょー。

続きを読む LWJGL  コメント (0) 2012/05/20 15:54:54

残された最後の希望だったんだ

4/26 にまどかマギカポータブルのアップデートファイルが公開されてました。
バージョン 1.01 ということで、主にフリーズ系の不具合が修正されているようです。
私もワルプルギス戦で2、3回フリーズしてたので嬉しい修正です。ていうかバンナム最初から本気出せ。

ゲームの方は、さやかルートに続き杏子ルートもクリアしましたー。
杏子ルートはすごい辛かったです。巷で囁かれていた通り、戦闘少なめでキャラ育成が難しい上に人魚の魔女結界では感情値が 600 くらいあるのでソウルジェムが濁る濁る…。
一応グリーフシードは2つ持ってたんですが、感情値が高すぎて対して浄化できず、あっという間に魔女化してしまいました。あんこー!!
最終階層に行くとボス戦なしで終了したので、ひたすら戦わずに逃げ切るのが正解なのかなーと思います。まあでも杏子の魔女化した姿も見れましたしね!(鬼

これで謎の魔女結界はすべて解放されたので、あとはマイペースにやりこむだけですな。

そうそう、ソフトの方は Amazon 先生にて 60 % OFF で売られてます。完全受注限定生産版なのにまだ在庫がある上に大幅値引きという謎な状況に。意味がわからないよ!

後藤邑子さん病気療養のため休養に

5/18 付けで事務所のアクセルワンからニュースが出ました
病気ということなので、ぜひゆっくり静養して元気になって欲しいのですが…
ひだまり4期はどうなるのかが気がかりです><
ヒロさんはどうなるのかなー。いろいろな意味で心配です。

2012/5/20 追記
ご本人のブログにてメッセージが掲載されました。
病気云々もそうですが、アクセルワンがとても良い環境のようなので安心しました。片倉小十郎の中の人とルルーシュの中の人が最近作った事務所なんですよね。ぜひこういう会社には成功していってほしいです。

続きを読む 雑記  コメント (0) 2012/05/18 21:58:42

LWJGL でデプステストを試してみる

今回は隠面消去の手法の1つである、デプステスト(深度テスト)について扱ってみたいと思います。
隠面消去とは、複数のテクスチャーを重ね合わせて描き込む際に、背後にある方のテクスチャーを割り出して手前のテクスチャーで隠すことです。

普通、複数のテクスチャーを重ね合わせる場合、先に描いたテクスチャを後から描いたテクスチャが上書きするため、奥にあるテクスチャーから描きこんでいく必要があります。しかし隠面消去を用いると、テクスチャーの描き込む順序をプログラマーが考慮しなくてよくなるため、コード側でテクスチャーを表示順でソートするといった処理が不要になるというメリットがあります。

デプステストによる隠面消去で、背景、キャラクター、キャラクターの前後にある複数のカードを重ねてみました。
screenShot.png
キャラクターの前後にあるカードがそれぞれ適切に上書きしている・されているのがわかると思います。
カードとキャラクターは透過イメージになっていて、これはアルファブレンドで合成されています。デプステストには透過イメージを扱いきれないという問題があるのですが、今回はこの問題への解決策についても触れていきます。
続きを読む LWJGL  コメント (0) 2012/05/15 15:54:46

LWJGL の座標系についてまとめてみる

今回は、三次元のモデルの座標が PC のウインドウ上の座標に変換される手順について触れながら、LWJGL(OpenGL)で扱ういくつかの座標系について、そして OpenGL 系の記事では必ず出てくるモデルビュー変換・射影変換とは何だったのかについてより知っていただければと思います。

今まで扱ってきたプログラムの裏でどのようなことが行われているのかを掘り下げたものなので、サンプルプログラムはありません。べ、別に楽しようとかじゃなi(以下略

OpenGL や Direct3D では、三次元でモデリングしたモデルを PC のアプリケーションのウインドウに配置する際に、何回か座標系を変換する処理が行われています。
突き詰めてしまえば、モデルは点、点同士を結ぶ線、線同士を結ぶ面で構成されていますが、そのひとつひとつの点がどこにあり、それをどの角度・距離から見たものなのか等を考慮して、アプリケーションウインドウ内での表示位置を決めなければなりません。ある点の座標をウインドウ内での座標に変換するために、以下のような段階を追って座標系を変換していきます。
続きを読む LWJGL  コメント (2) 2012/05/14 12:08:00

Fedora 15 64bit 環境で Blender をインストールしてみる

そろそろモデリングにも手を出してみようということで、オープンソースの 3D モデリングソフト Blender をインストールしてみました。
Blender_linux.png

RPM パッケージもあるらしいですが、公式でバイナリを配布していたのでそれを落としてみたらすんなり動きました。
かなりサクサクでいい感じです。試しに何か作ってみたいと思います。
続きを読む Blender  コメント (0) 2012/05/07 14:24:40

LWJGL で日本語フォントを使ってみる

今回は LWJGL でのフォントの使い方について書いてみたいと思いますー。
日本語表示もばっちり、こんな感じです。
screenshot.png
PSP 版だーりんも発売されたということでシュタゲネタ(笑

テキストメッセージの表示はゲームには欠かせない要素になりますが、OpenGL としてはあまりサポートされていない分野なので、LWJGL でも扱うのは少し手間がかかります。

基本的には、予め必要な文字をすべて書き込んでおいた画像をテクスチャーとして読み込み、そこから表示したい字を切り貼りしていく、というアプローチになります。
ただこれではフォントの準備だけで大仕事になってしまうので、Java AWT と連動させて動的に文字を書き込んだ画像を作っていく方法についても触れていきたいと思います。

2014/02/25 追記

LWJGL での日本語表示をより手軽に実現できるライブラリ LWJGFont をリリースしました。
この記事で紹介している方法とは表示するためのアプローチが異なりますが、あわせてご検討ください。


続きを読む LWJGL  コメント (0) 2012/05/05 09:28:25
プロフィール HN: ももかん
ゲーム作ったり雑談書いたり・・・していた時期が私にもありました。
カレンダー
<<2024, 11>>
272829303112
3456789
10111213141516
17181920212223
24252627282930