23148


2Dゲームを作っています。  
計41MBのアルファ付きPNG(2500枚)と、効果音(WAV)16MB(200個)でゲームを作っています。  
しかしなぜかUnityがメモリを1.6GBも使うようになってしまい、

Fatal error!  
Could not allocate memory: System out of memory!  
Trying to allocate : 1638356B with 32 alignment.  
Memory Label: Texture

と出てPC再起動直後でもUnityが起動できなくなってしまいました。  
Unityのバージョンは4.6.51fでOSはWinXPです。

プロジェクトを開き、全Assetsが用意された状態で  
シーンだけは読み込んでいない(Hierarchyがカメラのみの)状態でなら  
Unityは147MBしかメモリを使っていません。(タスクマネージャ上)

ゲームの開発は以下の様にやっていました。  
Hierarchyに空のゲームオブジェクトを作り、C＃スクリプトを貼り付け、  
public GameObject[] spriteParts = new GameObject[1]; // スプライト2500枚の管理  
public AudioClip[] audioClip = new AudioClip[1]; // 効果音200個の管理  
と変数を作り、Inspector上で全部１つずつ加えて、直接配列を指定して利用していました。

「ゲームが重くなるからFindなどは使わずこうした方が良い」という記述を見て  
その通りにやっていたのですが、  
このやり方がメモリを1.6GBも使う原因になっていたのでしょうか？

今のやり方では数週間前のバックアップから作り直しても同じ事になるので  
メモリを使い過ぎない手法があれば教えては頂けませんでしょうか。


CC BY-SA 3.0
2016-03-12T08:05:38.337
23055
2016-03-15T02:57:29.453
14755
question
unity3d
Unityがメモリ不足らしくシーンが読み込めなくなりました。


・まずテクスチャの圧縮設定の見直し  
・それでもダメなら、スプライト（テクスチャ）を必要に応じて生成・破棄するように対応

といった感じでしょうか。

> 計41MBのアルファ付きPNG(2500枚)

PNGファイルでは合計で41MBかも知れませんが、テクスチャのインポート設定（圧縮設定）次第で使用するメモリサイズは変わります。

例えば、512x512サイズの画像を無圧縮（RGBA32）で使う場合は１枚あたり 1MBが最低必要。2500枚ともなると合計
2.5GBほど必要になります。まずは圧縮設定を見直してみましょう。

> public GameObject[] spriteParts = new GameObject[1]; // スプライト2500枚の管理

常にメモリ上に持っておくには量が多すぎです。スプライト2500枚というか、テクスチャ2500種類を同時に使うのでなければ、必要なものだけを必要なときに生成し、不要になったら破棄する、という仕組みが必要です。単純なカジュアルゲームでない限りこの仕組みは必須でしょう。

「ゲームが重くなるから〜」というのも、動かないことには気にしても無意味になってしまいます。


CC BY-SA 3.0
2016-03-15T02:57:29.453
23148
2016-03-15T02:57:29.453
2079
23055
answer