2013-03-16 41 views
0

我一直在想這個問題。我不知道如何在同一時間發生事情。如何同步東西

我想知道如何在沒有單獨線程的情況下在java中同步。例如,在一個真實的視頻遊戲中,沒有單獨的線程的情況下,事情如何同時發生?
一個人在遊戲中如何同時移動雙肢?
我怎麼能在java中做到這一點?

+0

據我知道你不能,這就是爲什麼我們有線程,因爲其他的東西是連續的,所以你必須要等待一個操作到另一個開始之前結束.. – 2013-03-16 01:28:14

+0

我想我現在理解你的評論。這是有道理的 – 2013-03-16 01:32:34

+0

1)在不同的位置繪製雙臂到用於屏幕的圖像。 2)'repaint()' – 2013-03-16 01:32:43

回答

1

通常他們沒有。視頻遊戲中的這些更新通常都是一次完成,然後在一個幀中一次完成。所以有一個狀態更新步驟,然後是一個渲染步驟。

在更新步驟中,例如手臂骨骼的位置將根據它們應該如何移動(可能是響應從鍵盤或鼠標接收的輸入)而更新,然後整個場景再次以新的位置呈現。

沒有線程,事情就不會(在技術上)完全同時發生。通常情況下,程序會等待來自某個東西(用戶或網絡,​​或者您每隔100毫秒設置爲關閉的計時器)的輸入,並且程序的一部分正在等待,另一部分可能會跑。

這些情況通常都是由事件驅動的 - 請參閱Observer Pattern以獲取有關如何處理該問題的指南。您將有一些等待輸入的內容,然後觸發相應的響應事件,這些響應事件由「等待」該事件發生的任意數量的對象「偵聽」。

這通常會導致同時發生的事情出現,因爲您試圖保持在這些事件上運行的代碼很小 - 它非常快,您無法區分差異。

如果你真的想要的東西卻在同一時間運行的,你只是需要使用線程(或進入顯卡編程 - 這是很多的樂趣:d)

+0

這非常有幫助。所以處理器比渲染要快得多,所以用戶不會注意到任何東西。 – 2013-03-16 01:37:23

+0

@HarrisonBergeron是的。那麼,這取決於你想要做多少處理 - 如果處理器要慢或需要做很多事情,它就不會經常得到。這有時候是爲什麼你得到幀率下降(其他原因是顯卡的處理過多,我認爲這可能通常更普遍) – Jeff 2013-03-16 01:39:28

+0

是的,這是完美的感覺:) – 2013-03-16 01:53:21

0

標準的軟件架構是一個遊戲循環。它基本上是這樣的:

while the game is running 
    for each object in the game 
     check for interactions with other objects 
     update the objects position 
    draw the game state to a hidden surface 
    copy the hidden surface to the screen