簡體   English   中英

游戲設計-主循環中止-是否有比Abort()和ResetAbort()更好的方法?

[英]Game design - main loop aborting - Is there a better way than Abort() and ResetAbort()?

我有一個C#線程程序(一個游戲),該程序以布爾值終止(如大多數文章所推薦)。

while (gameContinueRun)
{
  createRound();
  line1;
  line2;
  line3;
  line4;
  endRound();
}

一些代碼行鎖定了游戲,並等待其他線程將其釋放:

lock (stateSync)
{
  Monitor.Wait(stateSync)
}

為了從另一個線程停止該線程,我將布爾值設置為false:

if (cancel)
{
  gameContinueRun= false;
}

一切工作正常,但我仍然需要等到當前循環結束為止。

我想結束循環,中斷所有工作(中止游戲)。 另一件事是能夠重新開始循環(打開新回合)。 換句話說,有兩件事:

  1. 中止游戲

  2. 取消當前一輪並開始新一輪

我考慮了一下,有兩種方法:

  1. 解鎖所有鎖,並在每行代碼后進行檢查:

     if (!cancelRound) { line1; } if (!cancelRound) { line2; } if (!cancelRound) { line3; } if (!cancelRound) { line4; } 

    不太好,如果其中有很多代碼行要覆蓋,會很累...

  2. 使用Thread.Abort() ,捕獲Exception並在需要時resetAbort()

  3. 使用goto和標簽(我認為這更難看然后中止)。

哪種方法更好? 或者,還有更好的推薦方法嗎?

嘗試查看WaitHandle.WaitAny(WaitHandle [])方法來獲取鎖。 然后,您可以使用AutoResetEvent或ManualResetEvent數組-一個用於退出,其余所有用於鎖定。 請參閱: http//msdn.microsoft.com/en-us/library/yy12yx1f.aspx

我通常會寫很多

if (m_state != GameState.Active) {
    return;
} // if

某種代碼。

也許您可以使用自定義屬性,類似於代碼訪問安全性。 並做類似的事情

[RequireState(GameState.Active)]
void DoSomething();

尚不清楚您要做什么,但看起來您想要某種形式的線程間通信。 但是,游戲循環通常控制其他線程,而不是對其本身進行控制。 因此,您將擁有:

function GameLoop
  start threads
  while (continuing game loop)
    tell threads to do something
    wait for threads to finish doing something
  end while
  tell threads to stop
  wait for threads to terminate
end function

您使用鎖和Monitor.Wait的解決方案很不尋常,可能不夠強大。 我認為您需要對多線程進行一些研究,並可能嘗試一些經典問題(例如餐飲哲學家),然后重新設計代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM