2010-06-20 49 views
3

因此,我正在開發一款適用於Android的新基本2D遊戲,並且正在設置我通常使用SurfaceView進行遊戲線程的實現。打字時,我意識到,雖然這似乎工作,但我真的想知道是否有更好的方法來實現相同的結果。這裏是什麼,我現在(我的冗長道歉,我試圖壓縮儘可能多地)做的基本知識:Android遊戲線程生命週期實現

GameActivity類

@Override 
public void onCreate(final Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    this.setContentView(R.layout.game); 

    this.mGameView = (GameView)this.findViewById(R.id.gameview); 
} 

XML佈局

<?xml version="1.0" encoding="utf-8" ?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android"> 
<com.package.name.GameView 
    android:id="@+id/gameview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:focusable="true" 
     android:focusableInTouchMode="true" /> 
</merge> 

GameView

@Override 
public void surfaceCreated(final SurfaceHolder holder) { } 

@Override 
public void surfaceChanged(final SurfaceHolder holder, final int format, 
          final int width, final int height) 
{ 
    this.mGameThread = new GameThread(this.getContext(), holder, 
             width, height); 

    this.mGameThread.start(); // starts the game 
} 

@Override 
public void surfaceDestroyed(final SurfaceHolder holder) 
{ 
    // flips volatile flag stopping execution 
    // then calls .join() 
    this.mGameThread.release(); 
} 

GameThread類

@Override 
public void run() 
{ 
    // load game state 
    while (this.mRunFlag) // volatile loop flag 
    { 
     // game loop 
    } 
    // save game state 
} 

正如你所看到的,基本上我依靠SurfaceHolder的回調來管理遊戲。這種方法在取向改變等情況下效果很好,但如果不問,我可能永遠不知道這是否能以更好的方式實現,如果存在的話,我會急於學習。所以這就是我問的原因!有什麼想法嗎?

(我很好奇的原因是因爲我幾乎完全忽略了活動生命週期事件,並認爲這可能是一個問題...)

回答

1

它可能會更好聽活性壽命因爲onSurfaceChanged可以在你不期望的時候被調用(方向改變,某種奇怪的尺寸改變,VRAM上的內存被回收,以及其他奇怪的內存)。

也就是說,對於遊戲而言,如果表面發生變化,您可能想對遊戲進行一些重置,這是真的。因此我建議使用兩者。創建一個方法來處理所有遊戲停止事件和遊戲開始事件。在onPause和onSurfaceDestroyed調用該方法(保持一個標誌,以確保你不會加倍卸載你的遊戲)。在onResume和onSurfaceChanged創建你的遊戲,如果它不存在。這樣可以縮短啓動時間,因爲在渲染器準備就緒之前,它可以讓您的線程自行初始化(但不會啓動實際的遊戲,基本上是將其置於就緒狀態)。一旦渲染器準備就緒,遊戲就能夠在該時刻開始。