2012-11-07 5 views
1

동일한 활동 내에서 OpenGLView 또는 AndroidGameView를 처리하고 다시 시작하려하지만 동일한 활동 내에 배치 된 후에 다른 시간에 게임을 시작할 수없는 것으로 보입니다. 다음은 모노 도이드 게임 샘플 프로젝트를 사용한 테스트입니다.Monodroid에서 OpenGLView를 삭제하고 다시 시작하십시오.

GLView1 view; 

    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     // Create our OpenGL view, and display it 
     //view = new GLView1(this); 
     //SetContentView(view); 

     Timer timer = new Timer(OnTimerDone, this, 3000, 3000); 
    } 

    void OnTimerDone(object state) 
    { 
     System.Diagnostics.Debug.WriteLine("timer"); 
     ((Activity)state).RunOnUiThread(() => 
      { 
       if (view != null) 
       { 
        //view.Stop(); 
        view.Dispose(); 
        view = null; 
        SetContentView(null); 
        GC.Collect(); 
       } 
       else 
       { 
        view = new GLView1((Activity)state); 
        //view.Resume(); 
        SetContentView(view); 
       } 
      }); 
    } 

    //protected override void OnPause() 
    //{ 
    // base.OnPause(); 
    // view.Pause(); 
    //} 

    //protected override void OnResume() 
    //{ 
    // base.OnResume(); 
    // view.Resume(); 
    //} 

감사합니다. 나의 새로운 코드

업데이트는 재사용 된 setContentView을 피하기 위해 :

GLView1 view; 

    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     // Create our OpenGL view, and display it 
     //view = new GLView1(this); 
     //SetContentView(view); 
     SetContentView(Resource.Layout.Main); 
     Timer timer = new Timer(OnTimerDone, this, 3000, 3000); 
    } 

    void OnTimerDone(object state) 
    { 
     ((Activity)state).RunOnUiThread(() => 
      { 
       LinearLayout linearLayoutMain = ((Activity)state).FindViewById<LinearLayout>(Resource.Id.linearLayoutMain); 
       if (view != null) 
       { 
        System.Diagnostics.Debug.WriteLine("timer delete"); 
        linearLayoutMain.RemoveView(view); 
        try 
        { 
         view.Stop(); 
         view.Dispose(); 
         view = null; 
         //SetContentView(null); 
         GC.Collect(); 
        } 
        catch (Exception ex) 
        { 
         //Android.Util.Log.Debug("ex:", ex.ToString()); 
         System.Diagnostics.Debug.WriteLine("ex:" + ex); 
        } 
       } 
       else 
       { 
        view = new GLView1((Activity)state); 
        view.Run(); 
        //view.Resume(); 
        //SetContentView(view); 
        linearLayoutMain.AddView(view); 
        System.Diagnostics.Debug.WriteLine("timer create"); 

       } 
      }); 
    } 
+0

무엇이 오류입니까? –

+0

나는 어떤 에러도 내지 않는다 : GLView는 올바르게 폐기되지 않는다. 타이머가 예외를 두 번 내지 않고 두 번째로 멈췄 기 때문에 나는 생각한다! 또한 SetContentView를 다시 사용하지 않으려하지만 문제는 동일하게 유지됩니다. – Alphapage

+0

이것은 어리석은 질문 일지 모르지만 Try/Catch 블록에 배치하여 예외 메시지를 출력 해 보았습니까? MonoTouch를 사용하여 가끔씩 런타임에서 삼키는 예외가 있기 때문에 때때로 그렇게해야한다는 것을 알았습니다. –

답변

1

나는 당신의 코드 주위에 플레이를했다하고 Timer이 계속 실행하지만 RunOnUiThread() 내부의 블록이 호출되는되지 않은 것으로 나타났습니다. view.Stop() 메서드가 제거되었고 view.Dispose()이 올바르게 작동하기 시작했습니다.

여기에 (시간에 대한 5000ms 간격을 사용) 내 전체 코드

GLView1 view; 

    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     SetContentView(Resource.Layout.Main); 
     Timer timer = new Timer(OnTimerDone, this, 5000, 5000); 
    } 

    void OnTimerDone(object state) 
    { 
     RunOnUiThread(() => 
     { 
      try 
      { 
       LinearLayout linearLayoutMain = ((Activity)state).FindViewById<LinearLayout>(Resource.Id.linearLayoutMain); 

       if (view != null) 
       { 
        linearLayoutMain.RemoveView(view); 
        view = null; 
       } 
       else 
       { 
        view = new GLView1(this); 
        view.Run(); 
        linearLayoutMain.AddView(view); 
       } 
      } 
      catch (Exception ex) 
      { 
       System.Diagnostics.Debug.WriteLine(ex.ToString()); 
      } 
     }); 
    } 

오래된보기는 여전히 (아래 로그에 참조) 가비지 컬렉션으로 나타납니다. 나는 여분의 전화가 필요하다고 생각하지 않는다. 나는 문제없이 똑바로 약 15 분 동안 신청서를 돌렸다.

11-16 00:30:05.828 D/dalvikvm(2144): GC_EXPLICIT freed 119K, 6% free 8813K/9351K, paused 3ms+5ms, total 56ms 
11-16 00:30:08.047 D/dalvikvm(2144): GC_CONCURRENT freed 992K, 12% free 8270K/9351K, paused 4ms+36ms, total 162ms 
11-16 00:30:10.667 D/dalvikvm(2144): GC_CONCURRENT freed 202K, 10% free 8467K/9351K, paused 5ms+63ms, total 116ms 
+0

고맙습니다. 나는 더 이상 GC 작업을하려고하지 않을 것입니다! – Alphapage