簡體   English   中英

何時在2D動畫中使用Thread.sleep而不是SwingTimer

[英]When to use Thread.sleep over SwingTimer in 2D animation

在這種情況下的上下文是創建一個游戲循環,它與模型集成並每幀更新一次視圖。 與控制器聽眾接口,控制器更新模型, repaint()處理來自模型視圖更新(上一個重寫paintComponent()JPanel )。

適當的答案包括“從不”,哈哈。

這是一個我認為有一個更好的答案的問題,所以它不應該違反規則。

我問這個是因為主游戲循環是一個Runnable實例,我將其鎖定到60FPS(大致,此刻。由於當前渲染循環非常便宜而1000/60每個丟失一毫秒或兩個,因此幾毫秒差異周期)。 不通過Thread.sleep()鎖定幀速率會導致每秒23 幀(顯然),這可以理解地使我的CPU崩潰。 每個問題都不是問題 ,更多的例子是為什么需要幀鎖定。

然而,在我遇到的每一個答案中,每一條評論,其中大多數都說“你為什么甚至觸摸Thread.sleep()你不想讓EDT睡覺”。 如果您的循環中存在導致無響應的缺陷,這是可以理解的,但在我已經整理的應用程序中並非如此。 我已經閱讀了所有相關的事件調度線程文檔,如何使用Swing Timers等。我甚至自己也使用過Timers和SwingWorkers(在一種情況下將圖標加載委托給后台以防止GUI實例化上的阻塞) 。

這里有一個首選的方法嗎? 我沒有遇到過很多/不依賴於libgdx的Java獨立游戲解決方案。

使用Swing Timer時:

您不希望限制或控制更新之間的時間。 Swing Timer僅保證“至少”持續時間(它將在給定延遲后觸發),並且處理事件的時間長度可能影響下次更新之前的時間量。

因此,如果您有16ms的延遲(粗略的60fps),您的回調需要20ms才能處理,第一次和第二次回調之間的時間實際上可能是36ms

當您想要使用Swing提供的現有(被動)渲染系統時,您還可以使用Swing Timer

Swing Timer相對簡單易用,它在Event Dispatching Thread中觸發回調,可以很容易地修改游戲狀態並安排UI的更新,這減少了可能的線程競爭條件(繪畫和更新之間) )

在以下情況下使用Thread#sleep

您希望更多地控制時序,產生可變延遲。 為此,您需要管理自己的Thread

當您使用BufferStrategy來控制輸出時,此方法更適合於更復雜的動畫。

這樣做的原因是,使用Thread方法,您可以在更改狀態的線程和繪制它的繪制周期之間運行競爭條件的風險。 相反,您需要自己控制油漆過程,因此您知道當您繪制某些東西時,狀態不會在您執行時發生變化。

使用這種方法可以提供更多的靈活性和控制力來決定事情何時完成(以及如何完成),但會增加復雜性和做事的責任

Thread.sleep幾乎可以肯定地用於javax.swing.Timer和java.util.Timer的實現,但是現在Thread.sleep的唯一真實用例是用於在某些東西上創建超時,通常是I / O連接。 我在工作方式上使用過一次,用於在請求用戶消息之后延遲更新GUI,直到從服務器發送的最后一條消息過去一定時間。 我也在這里用它

在你的情況下,你應該使用搖擺計時器為您的游戲循環

暫無
暫無

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

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