ローディング画面とか、やられたときの処理、いろいろ作ってます。
最近はじめてDispose(メモリの解放)を確認しました。
今までは、噂には聞いていた程度でした。
いやはや、お恥ずかしい。
プログラムのヘルプとか、ネットに、Disposeメソッドがあるものは
いらなくなったらDisposeするべきと、書いてあったので
Sprite.Dispose()とやっても、そんなメソッドはないと表示されるので、
SpriteTile(私はこのスプライトクラスを主に使っている)クラスにはない、
ないものはしなくていいんだと、少し腑に落ちなかったが、
納得していました。
しかし、ネットとかヘルプとかには画像や音楽ファイルを読み込んだら
Disposeするべきと書いてあり、
???
といった感じでした。
(もちろんSpriteは画像を読み込む)
しかし、また別のところにガベレージコレクションがいらなくなったところを
勝手に解放してくれると書いてあり、
また、腑に落ちないけど、納得してました。
しかし、ヘルプをきちんと読むと、
newして、読み込んだときはガベレージコレクションが解放してくれるが
画像などを読み込んだときはしてくれないと書いてあり
(このことをアンマネージドリソースというそうです。)
びっくりして、調べなおすとありました。
Dispose!!
正確に言うと
Sprite.Dispose()
ではなく、
Sprite.TextureInfo.Dispose();
でした。
Spriteのメンバ変数TextureInfoに、あったんです。
Sprite.TextureInfo.Dispose();の前後でメモリをダンプすると
きちんとメモリの解放が行われています。
すばらしい。
あーよかった。
すっきりした。
しかし、私の中の疑問がまだあります。
ここまで、Disposeの存在をしらなくても問題なかったのは
私のゲームがメモリをあまりつかわないことにあります。
つまり、VitaというかPSMの最大メモリ96MBを超えなかったからです。
(Vitaのマックスは512MB+128MBある)
なんだ、お前のゲームちいせいなぁと思うかもしれませんが、
こんなんインディーズゲームとしては普通ですよ。
96MBフルで使うインディーズゲームなんか、ごく一握りですよ。
ゆえに、メモリを無駄に何回も読み込むなどという
バグない限りDiposeが必要がない
(もちろんプログラムを終了させるとメモリの解放が行われる)
とも言えるわけです。
でも、ネットでかなりの確立でDisposeの議論がなされ
(ちょっと前の私のように理解していない人は結構いる)
そのたびにきちんとDisposeをしメモリの管理をするようにと
議論の結論がいく。
みんな、すごいなぁ
Dispose()をきちんと必要な
でかいゲーム(アプリ)作ってんだなぁ。
わけがわからん。
ちなみに、今回のDiposeのサンプルソースは以下のとおり。
public Sce.PlayStation.HighLevel.GameEngine2D.SpriteTile TitleSprite { get; set; }
public Title ()
{
TitleSprite = Support.TiledSpriteFromFile("/Application/assets/Title03.png", 1, 1);
}
public void Term()
{
TitleSprite.TextureInfo.Dispose();
}
ゲーム作るために(サラリーマン)生活をすてるなって話をよく聞くけど、
生活を捨てるぐらいじゃないと、ゲームなど完成しないって話ですよ!
まったく、わかっとらん。
Xbox360のインディーズが縮小傾向になり、
XboxOne(通称、バツイチ→マーケット的にはバツニ!)でも、
インディーズは、やらないと話が有力なので
(一部では、復活するかもとのこと)
弊社、ガレージソフトは新たにPSMで開発することになりました。
なぜ、PSVita何だという突っ込みは
あると思いますが、
あまんじて、受け入れます。
なお、引き続きiPod/iPadの開発はシミュレータ上で行います。










