簡體   English   中英

用於游戲開發的C#計時器

[英]C# Timers for game development

我想找出在游戲中創建基於時間的事件的最佳方法。 讓我們談談德州撲克游戲。 服務器可以處理數千個表,並且每個表中都有計時器:轉彎計時器,保持座位計時器等。

為此目的實現計時器的最佳方法是什么?

是System.Timers.Timer類可以處理此問題,還是創建一個具有排序時間隊列的單獨線程(例如,一個升序排序列表,其int值表示以毫秒為單位的時間)會更合理?

預先感謝,瓦倫丁

我建議使用System.Timers.TimerSystem.Threading.Timer 您使用排序隊列的想法正是System.Threading.Timer的實現方式,因此您將浪費時間並增加不必要的開銷。 System.Timers.Timer是周圍的包裝System.Threading.Timer

我不建議使用當前時間(即DateTime.Now或類似時間)來提供超時,因為時鍾會以不可預測的方式在不可預測的時間改變。

如果要基於“當前時間”進行操作,則在程序開始時啟動Stopwatch ,然后將Elapsed屬性用作游戲中的“當前時間”。 因此,距離當前時間五秒的時間是:

var FiveSecondsFromNow = GameTimer.Elapsed + TimeSpan.FromSeconds(5);

評論中提出的問題是我是否建議使用帶有Elapsed發生事件的多個計時器,還是按時間順序維護並定期檢查的動作列表(即在計時器或主游戲循環中)。

我的立即響應將是為需要發生的每個事件使用單獨的計時器對象。 這樣做可以利用多個可用的內核(並發事件可以同時發生),並避免了我必須維護該未決操作列表。 我知道計時器隊列的實現可以毫無問題地處理數千個計時器,而且幾乎可以肯定的是,它們對計時器隊列的實現將比我的效率更高。

除非您有多線程問題,否則使用計時器可以簡化代碼。 我只是為了簡單。 如果我遇到計時器的性能問題,我只會進入手動維護的待處理操作列表。 在我努力消除計時器之前,我將非常確定計時器是罪魁禍首。

我經常發現根本沒有使用計時器是最好的方法。 只需存儲時間戳,然后在進行處理時,使用存儲的時間戳檢查當前時間的差值。

當有其他簡單的解決方案可用時,盡量減少使用線程。

您應該能夠足夠經常地“處理”所有表以處理所有邏輯。 除非我們談論的數字很大,否則這不是問題。

除非您的游戲中有非常繁瑣的邏輯占用大量處理,而且很可能不在德州撲克中使用,否則您不應使用線程,它們只會使事情復雜化。 當完全有可能在一次簡短的更新中更新整個游戲狀態時,為什么要“同時”運行某些內容?

我將保留一個已排序的隊列,但是將System.Timers.Timer調度到隊列中第一個事件的時間。 當事件觸發時,我一次從隊列中選擇一個元素,處理該元素,在下一個達到峰值,以查看時間是否過去。 如果時間已過去,請處理事件,否則請為剩余時間安排一個計時器。

當新事件到達時,將它們插入已排序的隊列中。 如果它們恰好在隊列中的第一位,請重置計時器,並以一定間隔將其重新啟動到新的第一個元素。

所有這些都假定您需要觸發某些事情。 如果您只是想知道何時有人問是否有新事件,則不需要計時器,也不需要額外的線程來處理隊列。 有人問時,只需檢查您的事件隊列即可。

暫無
暫無

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

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