大地图如何正确加载和销毁物体

slg地图中的元素模型,大部分都是重复的,所以把加载出来的模型放入对象池中,要注意的是,频繁SetActive()和SetParent会消耗大量性能,所以我们放入对象池和从对象池中取出,最好不要执行SetActive()方法和SetParent()方法。如果原来的对象池管理有涉及到这两个方法的话,大地图的对象池要另外写一套。像我们的项目,因为地图范围是(0-2880),所以当我们放入对象池中,可以把物体移动到(-100,-100)的位置。

关于对象池和异步加载管理的方法,我会在后续文章里涉及。

生成物体时,最好采用异步加载,这样可以有效避免卡顿,其次调用生成命令时,最好不要在一帧内调用,在这里我写了一个管理器,一帧调用2个命令。

local MapResourceManager = Class("MapResourceManager")
local ResourceManager = App:GetResourceManager()

local FrameCount = 2

function MapResourceManager:ctor()
	self.cacheList = {}
	self.cacheIndex = 0

	UpdateBeat:Remove(self.Update,self)
    UpdateBeat:Add(self.Update,self)
end

function MapResourceManager:Update()
	if self.cacheIndex <= 0 then
		return
	end
	for i = 1, FrameCount do
		local data = self.cacheList[1]
		if data.isAddPool then
			ResourceManager:LoadPrefabInstancePool(data.path, data.onLoad)
		else
			ResourceManager:LoadPrefabInstance(data.path, data.onLoad)
		end
		self:RemoveFirstLoad()
		if self.cacheIndex <= 0 then
			break
		end
	end
end

function MapResourceManager:AddLoad(path, onLoad, isAddPool)
	if isAddPool == nil then
		isAddPool = true
	end
	local data = {}
	data.path = path
	data.onLoad = onLoad
	data.isAddPool = isAddPool
	self.cacheIndex = self.cacheIndex + 1
	self.cacheList[#self.cacheList + 1] = data
	return data
end

function MapResourceManager:Unload(data)
	local count = table.removebyvalue(data)
	self.cacheIndex = self.cacheIndex - count
end

function MapResourceManager:RemoveFirstLoad()
	self.cacheIndex = self.cacheIndex - 1
	table.remove(self.cacheList, 1)
end

function MapResourceManager:OnDestroy()
	self.cacheIndex = 0
	self.cacheList = {}
	UpdateBeat:Remove(self.Update,self)
end
return MapResourceManager

 

你可能感兴趣的:(slg游戏开发,unity)