PaperVision3DのBitmapMaterialのメモリ挙動

 PaperVision3Dのメモリ挙動がどうもおかしい気がする。

 ダンジョンのフロア移動の際、一旦現在いるフロアの配列化したDisplayObject3Dを、removeChildした上、個々をnullに設定、さらにdeleteまでかけてから、新しいDisplayObject3Dを配列に入れ、addChildしているのだけど、その度にメモリがガンガン増えて行く。明らかに何かのメモリが解放されていない。

 容量も半端無いので、恐らくBitmapMaterial絡みだろうと思うのだが、disposeに当たる命令が用意されていない。destroyっていう凄い名前の関数っぽいのがクラスに書かれているのだけど、ちゃんと動くようにはなっていないようだ。

 現状の作りではあっという間にメモリ落ちしてしまうので、作りを変えないといけない。

 「BitmapMaterialに設定するBitmapData自体を、破棄するDisplayObject3Dに応じてdisposeする」というのをまだ試してないので、これをそのうち試すことにする。

 このメモリ問題が解決しないと、リリースはできないな。メモリ2GB積んでるマシンで、階段を20~30往復したら落ちるとか、あり得ない。起動直後は、占有メモリ100~120MBくらいなんだけど。それでもかなりメモリ喰ってると言える。

 ちょっと、安易に配列化し過ぎかもしれない。BitmapDataを先頭フレームで全部クラス化するのも、問題あるかも。PNGファイルを外に置いておいて、Loaderで読む……とかしないといけないかもしれないけど、それだと、素材の二次利用とか流出を防げないんだよな。何かうまい方法を考えないと。

PaperVision3Dを使って3Dダンジョン 9

 階段ができました。階段ができたので、テストダンジョンも3階建てに増築しました。

 階段移動後が余りに唐突な感じなので、間に何か演出を挟む予定ではありますが、当面はその演出は先送りにして、ぼちぼち画面表示系のものを入れていこうと思います。今のキャラクターウィンドウも仮ですし。

 それにしても、テクスチャを作るのは難しい!今回新規に作った2層分も、どうもしっくりきません。

 外を出歩くときは常にデジカメを持ち歩いていて、テクスチャに使えそうな壁なんかを写真撮りまくっているんですけど、なかなかこう、うまく使えていません。加工し過ぎても変になるし、何より、スケール感がうまく噛み合ってない印象です。これがなかなか難しい……。貼ってみて、「あ、もうちょっと大きく」とか「小さく」とかを繰り返して行くのが思いのほか大変で、3Dのテクスチャ作成を仕事にしている人は偉いと思いました。

 階段の周りの柵のテクスチャは、なかなか気に入っています。テクスチャの元写真は、とある溝蓋でした。

Continue reading

PaperVision3Dを使って3Dダンジョン 8

 大幅に画質の向上に成功。ってか、単に、壁と地面でScene3Dを分けた、ってだけの話。これならポリゴンの干渉のしようがない、ってことに今朝電車の中で気付いた。

 あと、上り階段置いてみた。障害物判定とかまだやってないので、中に潜れてしまうけど。明日は下り階段。

 ぼちぼち、ブログにアップするには厳しい容量になってきたかも。

Continue reading

PaperVision3Dを使って3Dダンジョン 7

 昨夜は、軽減化のための作業と、SimpleLevelOfDetailの調整に夢中になってしまって、寝るのが遅くなった。失敗、失敗。今日はほどほどで引き揚げる。

 ちょっと技術的なところに入れ込み過ぎてる気がしたので、モチベーション維持のために、なんちゃって体裁を整えた。これでもう「どれがFlash?」なんて言われないことだろう(たぶん)。

 仮当てのパーティウィンドウを並べたら、Viewport3Dを横幅いっぱいにしてるのが馬鹿馬鹿しくなって、横幅を縮小。描画範囲が狭くなるんだから、ちょっとは軽くなる……かな?

 セグメントの分割数とか、色々調整してやってみたけど、結局根本的な解決にはならなかった。まぁ、仕様だ。なもんで、ポリゴン漏れがあってもいいから、サクサク動くゲームってのを目標にしようと思う。

 SimpleLevelOfDetailを使ってる時点で、移動時に一瞬「クッ」てなるのは避けられないんだけどね。いつかPSPの開発環境を整えられるようになったら、そん時はポリゴン欠けの出ないように作ろう。

Continue reading

PaperVision3Dを使って3Dダンジョン 5

 テクスチャが、ことごとく上下逆になっていたのを修正。ついでに、壁の画面では見えない部分(天井側と地面側)のセグメントを減らして、少しでも負荷を軽減。

 それから、見ての通り、「なんちゃってフォグ」を入れた。要は、半透明の円筒(objects.primitives.Cylinder)を半径を変えて並べ、カメラと一緒に動かしているだけ。色々考えてみたけど、これが一番手っ取り早いと思う。

 色々やってみたいことはありましたが、今日はここまで。それなりにちゃんと動く3Dダンジョン、完成でっす。

Continue reading

PaperVision3Dを使って3Dダンジョン 4

 え、厭だ。嘘。これって――。

 デキちゃってない?

 普通に動いちゃってない?

 ということで、無事に一通り実装が終わりました。週末で作ったにしては、上出来な方ではなかろうか。

 いくつかメモ書き。

  • カメラすぐ横の左右の壁が表示されなかったのは、カメラに描画範囲があり、左右の壁がカメラに「近過ぎるので描画しなくて良し!」と判断されたため。
  • 普通に3Dモデルを1個表示させるだけならカメラを目標から遠ざければいいので問題無いわけだが、ダンジョンでは背後に壁がある場合があるので、そう上手くはいかない。
  • 「近過ぎると描画されない」のを逆手に取って、カメラを現在位置の背後にある壁に埋まる位置に配置してみると、何とか描画された。それでも、前進のアニメーションの間とかに(カメラが前進して壁に近付く都合)壁がポロッとなっちゃったりはするけど。これはまぁ、仕様。
  • 3D空間のX軸・Y軸・Z軸の把握はとても難しい。最初に立方体表示させたときも、どっちがどっちか分からなかった。あらかじめ、紙などに書いて整理しておくべし。
  • セグメントの分割に若干無駄があることに今気付いた。横側は今分割数3×3にしていますが、壁の下側や上側はそんなに分割しなくてもいいもんね。
  • カメラの回転でまたも三角関数に詰まる。勉強するべし。
  • dispatchEventは、上手く使うとかなり便利。これが使えるようになると、なんかActionScript 1より全然楽になった気がする。

 能書きはここまで。週末の力作を触ってみてやってくださいな。

Continue reading