「在生存模式取得指令方塊」:修訂間差異

增加 1,392 位元組 、​ 2024年9月5日 (星期四)
行 26: 行 26:
 有了兩個獨立的遊戲執行緒後就能產生 async observer lines 依靠觀察者方塊不斷對著特定的方塊輸出大量的方塊更新,由於現在遊戲同時有兩個執行緒同時運行,這樣就會造成 Race Conditions 的情況發生,使的特定方塊內部數據發生覆蓋而改變方塊的種類。
 有了兩個獨立的遊戲執行緒後就能產生 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 。
142

次編輯