<1>緣由:服務器
在吃雞場景中,有不少掉落物(每種掉落物模型各不相同),服務器在進入場景的時候推送了全部掉落物,後面服務器只作更新掉落和刪除掉落操做blog
客戶端須要對這些掉落物作視野管理,模型太多手機內存開銷太大,也極可能由於內存太高崩潰索引
<2>思路:內存
把地圖劃分紅均勻網格,每一個掉落物存在網格之中,玩家每次更新自身格子索引,把九宮格以內的物體加載顯示,把上次九宮格以內的物體作回收,公共部分不用動get
<3>代碼:io
代碼都是在Lua這邊實現function
--掉落物管理相關 local mapX = 0 --地圖寬 local mapY = 0 --地圖長 local mapCenterX = 107 --地圖中心X local mapCenterY = 176 --地圖中心Y local rowSize = 24 --格子行高 rowSize local colSize = 24 --格子列高 colSize local maxRow = math.ceil(mapX/rowSize) --多少行 local maxCol = math.ceil(mapY/colSize) --多少列 local allCount = maxRow*maxCol ---格子總數 local startX = (-mapX/2)--+mapCenterX -- (-(mapX/2-mapCenterX))/2--格子起始座標X local startY = (mapY/2)--+mapCenterY --(mapY-mapCenterY)/2--格子起始座標Y
關鍵方法提供class
1.根據玩家當前格子索引獲取九宮格索引map
--獲取格子周圍全部格子 function BattleRoyaleDropMgr:getRoundIndex(index) local lst = {} --top 沒有上 r1r2r3 --bottom沒有下 r6r7r8 --left沒有左r1r4r6 --right沒有右r3r5r8 local isTop = index<=maxRow local isBottom = index > (maxCol-1)*maxRow local isLeft = index%maxRow == 1 local isRight = index%maxRow == 0 local filter = {} local r1 = index - maxRow - 1 local r2 = index - maxRow local r3 = index - maxRow + 1 local r4 = index - 1 local r5 = index + 1 local r6 = index + maxRow - 1 local r7 = index + maxRow local r8 = index + maxRow + 1 if isTop then filter[r1] = true filter[r2] = true filter[r3] = true end if isBottom then filter[r6] = true filter[r7] = true filter[r8] = true end if isLeft then filter[r1] = true filter[r4] = true filter[r6] = true end if isRight then filter[r3] = true filter[r5] = true filter[r8] = true end local result = {r1,r2,r3,r4,r5,r6,r7,r8} for i =1,#result do if filter[result[i]] == nil then lst[result[i]] = true end end lst[index] = true return lst end