1. 程式人生 > >【吃雞】客戶端視野管理,管理掉落物

【吃雞】客戶端視野管理,管理掉落物

all div 根據 index 網格 right col size 思路

<1>原因:

在吃雞場景中,有很多掉落物(每種掉落物模型各不相同),服務器在進入場景的時候推送了所有掉落物,後面服務器只做更新掉落和刪除掉落操作

客戶端需要對這些掉落物做視野管理,模型太多手機內存開銷太大,也很可能因為內存過高崩潰

<2>思路:

把地圖劃分成均勻網格,每個掉落物存在網格之中,玩家每次更新自身格子索引,把九宮格之內的物體加載顯示,把上次九宮格之內的物體做回收,公共部分不用動

<3>代碼:

代碼都是在Lua這邊實現

--掉落物管理相關
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

  

關鍵方法提供

1.根據玩家當前格子索引獲取九宮格索引

--獲取格子周圍所有格子
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 

  

【吃雞】客戶端視野管理,管理掉落物