###前提・実現したいこと
Xamarin.FormsでAndroidとiOSのアプリの開発を行っており、
ゲーム以外のUIをXamarin.Forms、ゲーム機能をCocosSharp.Formsで作成しています
アプリではXamarin.Forms画面からゲーム画面に遷移してゲームを実施
ゲーム終了後にXamarin.Forms画面に戻ってくる作りとなっており
ゲームは何回でも実施できるようになっています
ゲーム終了後にメモリが解放されずに肥大化(プレイするごとに増加)する為
CocosSharpでメモリリークが発生しているとみて調査しています
- 下記で説明するメモリリークの調査方法は間違っていないか
- またメモリリークしている認識だが間違っていないか
- 他にお勧めのアプローチがあれば教えて欲しいです
- メモリリークを解消する具体的なコードや方法
- CocosSharp.Formsを使う上でメモリリーク対策として気を付けるべきこと
###発生している問題
ゲームを続けているとメモリ使用量が増えていき最終的にアプリが落ちてしまいます
###該当のソースコード
開発中のソースコードは大量で掲載できない為、最小限のアプリを作成しました
https://github.com/ta-yamaoka/CocosSharpMemoryLeakSample
上記アプリは2画面構成となっています
MainPage→GamePage(CocosSharpView)
NavigationPageで画面遷移して、戻ってくるだけとなります
以下GamePage.csより抜粋した
Xamarin.FormsからCocosを起動するコードです
C#
1public void HandleViewCreated(object sender, EventArgs e) 2{ 3 gv = sender as CCGameView; 4 5 if (gv != null) 6 { 7 scene = new GameScene(gv); 8 gv.RunWithScene(scene); 9 } 10} 11 12protected override void OnAppearing() 13{ 14 base.OnAppearing(); 15 Content = new CocosSharpView() 16 { 17 ViewCreated = HandleViewCreated, 18 }; 19}
###試したこと
メモリリークの調査にXamarin Profilerを使用しています
調査方法は下記URLを参考にしています
https://xamarinhelp.com/tracking-memory-leaks-xamarin-profiler/
上記アプリにて
- MainPageからGamePageに遷移
- MainPageに戻る
- GC.Collect()を実行
という一連の処理を複数回繰り返し行い
Xamarin Profilerでメモリが解放有無を確認しています
画像1:5回繰り返したときのProfilerの画面
「Only Live Objects」にチェックを入れているので生き残っているオブジェクトの件数が表示されています
GamePage、CCGameView、GameSceneの3つのクラスに着目しています
GamePageはCountが1となり、メモリが解放されていることがわかります
CocosSharpViewとGameSceneはCountが5となっており、メモリが解放されていません
以下、解放されていないクラスの参照(Paths to roots)です
いずれもCocosSharpライブラリの中の処理に見受けられます
画像2:CCGameView
画像3:GameScene
GamePageについては、GamePageのOnDisappearing()で
gv.ViewCreated -= HandleViewCreated;
を実行することで、メモリが解放されるようになりました
CCGameViewとGameSceneについては、Dispose()、NULL代入を行っていますが解放されません
GameSceneはViewCreated内でnew及びRunWithSceneするとリークします
newだけならリークはしません
GameScene自体はCCSceneを継承しただけで中身の処理は空となります
###補足情報(言語/FW/ツール等のバージョンなど)
- Visual Studio Enterprise 2017
- Xamarin.Forms 2.3.4.224
- CocosSharp & CocosSharp.Forms 1.7.1.0
- Androidの実機でUSBデバッグ
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/13 01:54