跳至內容
切換側欄
搜尋
建立帳號
登入
個人工具
建立帳號
登入
用於已登出編輯者的頁面
了解更多
貢獻
討論
導覽
首頁
近期變更
隨機頁面
MediaWiki說明
工具
連結至此的頁面
相關變更
特殊頁面
頁面資訊
正在編輯
在生存模式取得指令方塊
(章節)
頁面
討論
臺灣正體
閱讀
編輯
編輯原始碼
檢視歷史
更多
閱讀
編輯
編輯原始碼
檢視歷史
警告:
您尚未登入。 若您進行任何的編輯您的 IP 位址將會被公開。 若您
登入
或
建立帳號
,您的編輯將會以您的使用者名稱標示,並能擁有另外的益處。
防垃圾訊息檢查用。
請勿
填寫此欄位!
== 原理 == Minecraft 遊戲運行時只會有一個 Main Thread 依序的處理遊戲所有事件,但使用特殊的手段可以額外創造出獨立於 Main Thread 以外的另一個執行緒 有了兩個獨立的遊戲執行緒後就能產生 async observer lines 依靠觀察者方塊不斷對著特定的方塊輸出大量的方塊更新,由於現在遊戲同時有兩個執行緒同時運行,這樣就會造成 Race Conditions 的情況發生,使的特定方塊內部數據發生覆蓋而改變方塊的種類。 === 額外執行緒產生 === 當玩家放置或破壞染色玻璃時,遊戲會開始從染色玻璃位置開始向下檢查直到碰到烽火臺為止,碰到烽火臺後遊戲開始 getBlockState 檢查方塊狀態,而檢查的過程中如果該區塊沒有載入則又會觸發 load a chunk 從硬碟中讀取該區塊的資料。 依靠染色玻璃這種特性,如果讓染色玻璃額外獨立出一個執行緒,那每次在 getBlockState 時觸發 load a chunk 從硬碟中讀取資料,這樣同時 Main Thread 與染色玻璃這兩個執行緒同步動作時,就會有兩份資料互相衝突導致最後的方塊種類發生改變。 但這就有一個問題玩家放置或破壞染色玻璃時就已經載入區塊了如何處去觸發 load a chunk ? === 控制Hash Map === 在遊戲中儲存以載入區塊的方式是使用 Long2ObjectOpenHashmap 來紀錄每一個區塊索引值,當遊戲內載入的區塊超過 Hash Map 能容納的數量的 3/4 時 遊戲將會重新 rehash 並把容量增加到目前載入區塊量的 2n+1,相對的如果容量小於 3/16 時則會 rehash 到當前區塊數量的一半。 當遊戲觸發 rehash 時且同時觸發另一個執行緒的 getBlockState 這時候會開始尋找該區塊的索引值,但是前面觸發的 rehash 會導致索引值尋找失敗 最後得到的結果是,這個區塊沒有載入所以觸發了 load a chunk 。
摘要:
請注意,所有於華麥百科所做的貢獻會依據CC BY-SA(創用CC 姓名標示─相同方式分享)授權條款發佈(詳情請見
說明:版權
)。若您不希望您的著作被任意修改與散佈,請勿在此發表文章。
您同時向我們保證在此的著作內容是您自行撰寫,或是取自不受版權保護的公開領域或自由資源。
請勿在未經授權的情況下發表文章!
取消
編輯說明
(在新視窗開啟)