haniwaのガラクタ箱 in the ショートコント -9ページ目

haniwaのガラクタ箱 in the ショートコント

日々の思いついたこと(多くはショートショート)、ゲームの企画、映画批評など

最近はじめて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の開発はシミュレータ上で行います。

PSMobileの、ゲームを開発するぞー!!