1 名前:名前は開発中のものです。 mailto:sage [2007/06/19(火) 12:21:35 ID:oqLsw/ra] ランダムでダンジョンを自動作成する手法についてのスレです。 ローグタイプやシレンタイプのダンジョンや、街並みや地形など。 ※過去スレ ダンジョン自動生成 pc11.2ch.net/test/read.cgi/gamedev/1027084016/ 関連サイトは>>2 >>3
149 名前:名前は開発中のものです。 mailto:sage [2008/01/29(火) 16:53:20 ID:ubNaezab] 異常にページフォルトが頻発してるね(暴走してるのかと思って一瞬焦ったお・・) プロファイラでメモリ使用状況見てみたけど(個=インスタンス数) ・全体 - 5.670.000個 - 約117M ・Dictionary<T,U>.Entry - 270,000個 - 41M(34.2%) ・DungeonAutoCreate.Data.arrow - 3,300,000個 - 38M(32.2%) ・Int32 - 1,600,000個 - 18M(15.5%) ・Int32[] - 270,000個 - 13M(10.5%) ・Dictionary<T,U> - 90,000個 - 4.5M(3.8%) これで全体の96.2%を占めている。 ・DungeonAutoCreate.Block - 90,000個 - 1.7M(1.5%) ・DungeonAutoCreate.Block[] - 10,000個 - 1.7M(1.4%) ここまで入れると99.1% 330万インスタンスあるData.arrowってのも気にはなるけど、何で辞書がこんなに大量に使われてるの? GCも何度か発生して殆どのインスタンスがGEN2になっている辺りも改善の余地がある(=無駄なGCが発生している) 処理速度に関しては明らかにボトルネックは別なので見ていない。 あと、ReadMeに書いてあるサイズ変更した場合に大量のメモリが消費される問題だけど 「古いフィールドを破棄→新しいフィールドを作成」の間で手動でGCを実行してやるのが効果的だと思う。
150 名前:名前は開発中のものです。 mailto:sage [2008/01/29(火) 20:19:35 ID:ubNaezab] 既存のコードを極力変更せずに対処してみた Dictionary<Data.arrow, Block> 互換の辞書クラスを作成 ・IDictionary<Data.arrow, Block>を実装 > ArrowDict.cs ・Dictionaryとして使えるが、実態は配列として実装されている internal class ArrowDict : IDictionary<Data.arrow, Block> ttp://gamdev.org/up/img/10994.zip ↑実際のコード例(ちょっと手抜き) > Block.cs ・ArrowDictを使うように修正 // public Dictionary<Data.arrow, Block> arw = new Dictionary<Data.arrow, Block>(); public ArrowDict arw = new ArrowDict(); これでメモリ使用量が激減(117M→10M)して、処理速度が大幅に改善する筈。 これ以上の最適化が必要なら、自分でパフォーマンス計測して頑張ってくださいな。