出自Minecraft Wiki
跳至導覽 跳至搜尋
  Tick」重新導向至此。關於指令,請見「指令/tick」。
  gt」重新導向至此。關於gametest指令,請見「指令/gametest」。

幾乎所有的遊戲(包括Minecraft)都由一個大的程式循環驅動,遊戲內的計算遵照循環執行,按照固定的順序依次被呼叫。當程式執行了一次循環,這個程式就進行了一次滴答(Tick),而計量滴答次數的單位就是刻(Tick)。在大多數情況下,刻不僅可以代表滴答的次數,也可以代表滴答本身。

遊戲刻與計算速率[編輯 | 編輯原始碼]

Minecraft的絕大多數計算邏輯都在一個遊戲循環內執行,執行一次這個循環就被稱為執行了一次遊戲刻(Game Tick),作為單位時縮寫為gt

由於遊戲不能時刻都在計算而消耗資源,所以遊戲刻執行一次後執行緒會進行休眠,等待下一次執行,從而維持一秒內遊戲刻的執行次數相等且均勻。通常每秒最多執行20次遊戲刻,即從這一遊戲刻開始執行到下一遊戲刻執行的時間間隔為0.05秒。如果這次遊戲刻計算時間小於兩個遊戲刻的時間間隔,則會進行休眠直到下一遊戲刻的執行。在Java版中,每秒最多執行遊戲刻的次數可用/tick rate修改,從而縮短或延長兩個遊戲刻開始執行的時間間隔。

在實際執行中,遊戲刻計算的平均時間被稱為每刻毫秒數(Milliseconds per Tick,MSPT),用於衡量遊戲計算的負載。每秒具體執行了多少次遊戲刻被稱為每秒刻數(Ticks per Second,TPS),用於衡量遊戲執行的真正速率。同時,每秒最多執行多少次遊戲刻也被稱為最大TPS。在未使用/tick rate修改時,遊戲的正常TPS為20,MSPT不超過50。

當MSPT小於或等於遊戲刻時間間隔時,遊戲能夠以最大TPS速率執行。但當遊戲刻內計算量太大時,MSPT上升導致超過遊戲刻時間間隔,TPS就不能維持在最大TPS速率,而維持在1000mspt,此時遊戲的執行速度就會減慢,又稱掉刻。在Java版中,若一個遊戲刻的執行時間超過了1秒,且距離上次警告已經超過10秒加100個遊戲刻,伺服器端就會輸出日誌Can't keep up! Is the server overloaded? Running <執行時間>ms or <延遲遊戲刻數> ticks behind警告計算發生了卡頓。

Java版中的單人模式或多人遊戲主機的除錯畫面內,MSPT和遊戲刻時間間隔位於左上區域,開啟幀生成時間圖表(F3 + 2)也可以查看目前的TPS。

遊戲刻在用戶端和伺服器端上都存在。伺服器端的遊戲刻主要負責遊戲的計算邏輯,而用戶端遊戲刻主要和繪製有關。

遊戲刻流程[編輯 | 編輯原始碼]

在每個遊戲刻中,各個模組的計算都按照固定的順序依次呼叫。下面的遊戲刻流程中,只考慮伺服器端的遊戲刻流程。

Java版[編輯 | 編輯原始碼]

Java版中,伺服器端分為集成伺服器端和獨立伺服器端。集成伺服器端內建在用戶端內,會受到用戶端的影響,而獨立伺服器端的執行狀態基本不會受到用戶端連接的影響。

集成伺服器端的流程如下:

  • 檢查遊戲是否被暫停。當暫停時,遊戲自動儲存。
  • 當遊戲暫停時,且集成伺服器端正以區域網路聯機伺服器執行,則對所有玩家統計世界開啟時間
  • 若遊戲恢復執行,對所有玩家進行強制時間同步。
  • 執行伺服器端邏輯。
  • 更新用戶端控制的顯示距離和模擬距離

集成伺服器端和獨立伺服器端都擁有同樣的伺服器端邏輯。下文中帶有藍色星號標記(*)的流程在伺服器端使用/tick freeze凍結時忽略執行。

  • 更新遊戲刻計數器。遊戲刻計數器與世界時間無關,用於記錄伺服器從啟動到現在執行了多少遊戲刻。
  • 若遊戲被/tick freeze凍結,並使用/tick step步進時,計算剩餘的步進次數
  • 關閉與用戶端的網路自動傳送隊列的刷新。
  • *若遊戲被重載,執行帶有load標籤的函數
  • *執行帶有tick標籤的函數
  • 遍歷所有維度,進行每個維度的計算。預設處理順序為主世界終界地獄
    • 每經過20個遊戲刻,與這個維度中的玩家同步這個維度的時間。
    • 執行維度遊戲刻邏輯
      • 若維度遊戲刻邏輯內產生異常,則立刻崩潰
  • 檢查用戶端連接,刪除已經關閉的連接,刷新傳送隊列,解析來自玩家用戶端的網路包(包括玩家的各種動作,但處理這些動作不在此階段),計算網路使用情況。
    • 絕大多數玩家的實體計算任務在此階段完成。
  • 每600遊戲刻向所有玩家傳送更新延遲網路包
  • 伺服器GUI存在,更新伺服器GUI。
  • 對所有玩家傳送正在等待傳送的區塊網路包,並開啟與玩家用戶端的網路自動傳送隊列刷新。
  • 嘗試自動儲存。兩次自動儲存的時間不小於100遊戲刻。當遊戲正在快進時,兩次自動儲存間隔為300×TPS,否則兩次自動儲存間隔為300×最大TPS
  • 執行處理隊列中的事件,包括來自玩家用戶端的各種互動網路包。

每個維度執行遊戲刻的流程如下:

  • *世界邊界範圍更新。
  • *計算天氣循環,更新降雨和暴風雨計時器。若降雨和暴風雨的程度發生變化,向維度內的玩家傳送世界事件網路包
  • 玩家睡眠邏輯。當維度內所有玩家入睡時,將時間調整到下一個日出,若在降雨則重設天氣循環。
  • 更新內部光照等級乘數,與目前時間和降雨、暴風雨有關。
  • *更新時間
  • *若為非除錯維度,則執行計劃刻邏輯。先執行方塊計劃刻,再執行流體計劃刻,每個遊戲刻最多處理65536個方塊計劃刻和65536個流體計劃刻。
  • *更新維度內的突襲事件,清除已經結束的突襲事件。
  • 計算維度內的區塊資料
    • *刪除已經逾時的計算標籤,更新計算標籤,計算目前所有已載入區塊的計算等級。
    • 計算需要執行區塊刻的區塊,並打亂區塊執行區塊刻的順序。
    • *計算生物上限等生成資料
    • *執行每個區塊的區塊刻
    • *執行計劃週期生成
    • 更新各個玩家追蹤的區塊,並以網路包傳送到玩家用戶端。
    • 刷新區塊的興趣點資料卸載不需要的區塊
  • *計算方塊事件,並將方塊事件資料傳送到玩家用戶端。
  • 若維度內有玩家或強制載入區塊,則重設閒置逾時
  • 若閒置逾時小於300遊戲刻,則執行實體和方塊計算邏輯:
    • *計算終界龍戰鬥資料。
    • 遍歷維度內的所有實體,進行實體計算。對於玩家騎乘的實體,/tick freeze對它們沒有作用:
      • 遍歷順序由一個遊戲內不可見的實體ID決定,實體按照ID從小到大進行遍歷。從伺服器啟動開始,ID被初始化為0,每載入一個實體此ID自增1,即此ID代表了實體的載入順序。對於同一個實體,若它未被卸載,那麼實體ID不變,直到被卸載為止。
      • 刪除已被標記清除的實體。
      • server.properties內的spawn-npcsfalse,刪除所有村民流浪商人。如果spawn-animalsfalse,刪除所有動物和水生動物。
      • *檢查清除條件,清除滿足條件的實體。
      • *對於強載入區塊內的實體,檢查騎乘情況並使失去坐騎的實體停止騎乘,並進行它們自身的實體計算。
        • 玩家的部分實體計算也會在此階段被計算,如伏守者生成資料。
    • *計算維度內的方塊實體邏輯。
  • 載入區塊內未載入的實體,卸載不需要的實體,更新各個玩家追蹤的實體,並以網路包傳送到玩家用戶端。

基岩版[編輯 | 編輯原始碼]

此段落暫無內容。

你可以幫助我們加入資訊

區塊刻[編輯 | 編輯原始碼]

此章節仍需完善,你可以幫助我們擴充更多資訊。
說明:基岩版相關內容並不全

在遊戲刻計算流程中,遊戲會以一個區塊為單位進行一次遊戲刻計算,而這次計算被稱為區塊刻。在Java版中,載入等級為實體計算等級,且區塊中心距離玩家128格(水平距離)以內[失效:JE 1.21.5]載入等級為實體計算等級[新增:JE 1.21.5]的區塊才可以執行區塊刻,在遊戲凍結時區塊刻全部停止計算;在基岩版中,每個遊戲刻內,所有載入的區塊都得到區塊刻處理。

Java版中,每個區塊執行區塊刻的執行順序如下,帶有橙色星號標記(*)的流程僅可在計算等級小於等於32的區塊內執行。[失效:JE 1.21.5]

  • 增加區塊時間。
  • 執行週期生成
  • *若目前為暴風雨,執行暴風雨相關邏輯。
    • 每個遊戲刻,若遊戲規則doMobSpawningtrue,每個區塊都有1100000的機率產生閃電,並計算落點位置(受到避雷針影響),若落點沒有降雨則閃電無法生成。
    • 在成功生成閃電的同時,若閃電沒有落到避雷針上,則有區域難易度×1%的機率生成骷髏陷阱
  • *若正在降雨,執行雨雪相關邏輯。
    • 每個遊戲刻,每個區塊會嘗試隨機刻速率次雨雪邏輯,但只有148的機率可以執行。
    • 每次雨雪邏輯都會在區塊內隨機找到一個水平位置,並計算這個水平位置上的最高的阻止運動的方塊(含水方塊和流體也被視為阻止運動)。
      • 若該方塊是,且滿足結條件,將水替換為冰。
      • 計算此處是否降雪和是否能積雪,若滿足條件積雪則增加一層
      • 若該方塊是鍋釜,計算鍋釜收集水和粉雪的邏輯。在降雨時鍋釜接收到區塊刻有5%的機率使水位上升一級,在降雪時有10%的機率收集一層粉雪。
  • *當隨機刻速率大於0時,執行每個子區塊內的隨機刻

Java版中,區塊刻的執行順序如下:[新增:JE 1.21.5]

  1. 以隨機順序,遍歷所有滿足區塊刻條件、載入等級為實體計算等級、且區塊中心距離玩家128格(水平距離)以內的區塊。
    1. 增加區塊時間。
    2. 若目前為暴風雨,且此區塊為強載入區塊,執行暴風雨相關邏輯。
      • 每個區塊刻,若遊戲規則doMobSpawningtrue,每個區塊都有1100000的機率產生閃電,並計算落點位置(受到避雷針影響),若落點沒有降雨則閃電無法生成。
      • 在成功生成閃電的同時,若閃電沒有落到避雷針上,則有區域難易度×1%的機率生成骷髏陷阱
    3. 如果此區塊位於世界邊界內,執行週期生成
  2. 遍歷所有滿足區塊刻條件的區塊。
    1. 若正在降雨,執行雨雪相關邏輯。
      • 每個遊戲刻,每個區塊會嘗試隨機刻速率次雨雪邏輯,但只有148的機率可以執行。
      • 每次雨雪邏輯都會在區塊內隨機找到一個水平位置,並計算這個水平位置上的最高的阻止運動的方塊(含水方塊和流體也被視為阻止運動)。
        • 若該方塊是,且滿足結條件,將水替換為冰。
        • 計算此處是否降雪和是否能積雪,若滿足條件積雪則增加一層
        • 若該方塊是鍋釜,計算鍋釜收集水和粉雪的邏輯。在降雨時鍋釜接收到區塊刻有5%的機率使水位上升一級,在降雪時有10%的機率收集一層粉雪。
    2. 當隨機刻速率大於0時,執行每個子區塊內的隨機刻

隨機刻[編輯 | 編輯原始碼]

隨機刻的範圍,以草在泥土上的生長傳播所示。草是服從區塊邊界分布,說明隨機刻按子區塊為單位計算。中間的紅色和藍色箭頭分別標記+X和+Z方向。玩家位於區塊的(7,7)位置,略微面朝區塊的西北角,這意味著-X和-Z方向邊緣上兩個區塊的中心納入了128方塊的半徑內,從而得到區塊刻處理。正北方和正西方邊緣的兩個一區塊面積的草突出證實了這一點。(以上為北)

在區塊刻的執行過程中,區塊會在其中選取幾個方塊進行計算,這種計算被稱為隨機刻(Random Tick)。隨機刻由隨機刻速率,即遊戲規則randomTickSpeed控制。

Java版中,隨機刻在每個子區塊內進行,每個子區塊隨機選取隨機刻速率個方塊執行隨機刻。預設情況下,隨機刻速率為3,即每個子區塊在其中選取3個方塊執行隨機刻。由於隨機刻為隨機選取,每個方塊被選中執行隨機刻的時間間隔隨機。兩次隨機刻時間間隔的中位數為47.30秒(946.03遊戲刻),平均數為68.27秒(1365.33遊戲刻)。也就是說時間間隔有50%的機率短於47.30秒,有50%的機率長於47.30秒。不過,有時候這個時間間隔會長得多或短得多:比如,時間間隔有1.38%的機率會比一秒還短,且有1.23%的機率比五分鐘還長。

基岩版中,隨機刻在每個區塊內進行,每個區塊隨機選取2.5×子區塊數量×隨機刻速率個方塊執行隨機刻。預設情況下,隨機刻速率為1。

一次隨機刻中方塊可被選取多次,從而在方塊上同時產生多次隨機刻。

絕大多數方塊不會回應隨機刻,回應隨機刻的方塊使用隨機刻計算下列事件:

計劃刻[編輯 | 編輯原始碼]

一些方塊的行為可能不會在本遊戲刻立刻執行,而是延後到之後的遊戲刻執行。這種情況下,方塊向遊戲請求一個計劃在指定遊戲刻後執行的任務,而規劃請求的這項計劃任務被稱為計劃刻(Scheduled Tick)

Java版中,計劃刻分為兩種,分別為方塊計劃刻和流體計劃刻。計劃刻的執行順序取決於它的優先權,優先值越小,它的執行時間在一個遊戲刻中越靠前。通常的計劃刻優先權為0,對於紅石比較器紅石中繼器,其狀態切換時的優先權更高。當中繼器狀態切換時指向其他比較器或中繼器的側面或後面(即輸入端),則具有最高優先權-3;當中繼器本身正在熄滅時,優先權為-2;當中繼器正在亮起,或比較器狀態切換且指向其他比較器或中繼器的側面或後面時,優先權為-1。

Java版中,每個遊戲刻內至多處理65536個計劃刻。在基岩版中,每個遊戲刻內,每一個區塊至多處理100個計劃刻。

若一個遊戲刻內的計劃刻數量超過了最大處理計劃刻數,那麼超出的計劃刻將延後至下一遊戲刻處理(即「計劃刻堆積」[需要更多資訊])。

紅石刻[編輯 | 編輯原始碼]

紅石刻(Redstone Tick),常縮寫為rt,是紅石系統的時間單位,它代表兩個遊戲刻。

Java版中,紅石刻並不存在於真正的遊戲流程中,因為紅石系統本質是方塊更新和計劃刻計算。定義紅石刻的目的是為了更好解釋紅石系統的執行和便於交流,因為絕大多數紅石元件都以兩個遊戲刻作為基礎時間單位,有時也並不需要精準到遊戲刻級別的時序分析。

基岩版中,紅石刻真實存在於遊戲中,紅石系統每2遊戲刻啟動一次,計算並更新紅石系統。如增刪紅石元件、依賴變動(如可能被充能的紅石導體,被比較器檢測的容器)和紅石訊號在元件間的流動等。有時透過將並發執行緒啟動的那1遊戲刻稱為「紅石刻」,反之稱為「非紅石刻」來區分並發執行緒是否啟動的遊戲刻。

  • 遊戲源碼中,紅石系統的工作頻率(以遊戲刻為基準單位)被硬編碼為2。但實際上可以透過特殊手段強制改動,以此來調整紅石刻的工作頻率。

歷史[編輯 | 編輯原始碼]

Java版
1.20.223w31a現在區塊刻處理時露天方塊檢查天氣更新的頻率受遊戲規則randomTickSpeed影響。
Java版(即將到來)
1.21.525w06a現在區塊刻不再要求距離玩家128格以內,並修改了區塊刻的執行順序與邏輯。
25w09a現在區塊刻要求區塊載入等級為實體計算等級而非方塊計算等級。

導覽[編輯 | 編輯原始碼]