local ExpBatchSystem = {} local lastTransDic = {} local lastPetTransDic = {} --批量应用单位的表现数据 local batchPosDirCount = 0 local batchPosDirData = LuaExt.CreateTable(128 * 6) local batchEffectCount = 0 local batchEffectData = LuaExt.CreateTable(32 * 7) local batchHitEffectCount = 0 local batchHitEffectData = LuaExt.CreateTable(32 * 10) local CSExt=CSExt local FP=FP --每个位置有5个参数需要同步 local function BatchPosDir(entity, px, pz, dx, dz) local start = batchPosDirCount * 5 batchPosDirCount = batchPosDirCount + 1 batchPosDirData[start + 1], batchPosDirData[start + 2], batchPosDirData[start + 3], batchPosDirData[start + 4], batchPosDirData[start + 5] = entity, px, pz, dx, dz end --每个特效有2个参数需要同步 function ExpBatchSystem.BatchEffect(entity, effectId, mainPlayerSelf, characterType, timeScale, layer, dontPlayMusouShow) local start = batchEffectCount * 7 batchEffectCount = batchEffectCount + 1 batchEffectData[start + 1], batchEffectData[start + 2], batchEffectData[start + 3], batchEffectData[start + 4], batchEffectData[start + 5], batchEffectData[start + 6], batchEffectData[start + 7] = entity, effectId, mainPlayerSelf, characterType, timeScale, layer, dontPlayMusouShow end --处理Hit特效同步 function ExpBatchSystem.BatchHitEffect(entity, effectId, playerSelf, characterType, timeScale, duration, fx, fz, hitSoundLevel, isNotPlayHitSound) local start = batchHitEffectCount * 10 batchHitEffectCount = batchHitEffectCount + 1 batchHitEffectData[start + 1], batchHitEffectData[start + 2], batchHitEffectData[start + 3], batchHitEffectData[start + 4], batchHitEffectData[start + 5], batchHitEffectData[start + 6], batchHitEffectData[start + 7], batchHitEffectData[start + 8], batchHitEffectData[start + 9], batchHitEffectData[start + 10] = entity, effectId, playerSelf, characterType, timeScale, duration, fx, fz, hitSoundLevel, isNotPlayHitSound end function ExpBatchSystem.RemoveEntityBatchEffect(renderEntity, effectId) for i = batchEffectCount - 1, 0, -1 do local index = i * 7 if batchEffectData[index + 1] == renderEntity and batchEffectData[index + 2] == effectId then batchEffectCount = batchEffectCount - 1 local endIndex = batchEffectCount * 7 for j = 1, 7 do batchEffectData[index + j] = batchEffectData[endIndex + j] batchEffectData[endIndex + j] = nil end end end end function ExpBatchSystem.RemoveEntityAllBatchEffect(renderEntity) for i = batchEffectCount - 1, 0, -1 do local index = i * 7 if batchEffectData[index + 1] == renderEntity then batchEffectCount = batchEffectCount - 1 local endIndex = batchEffectCount * 7 for j = 1, 7 do batchEffectData[index + j] = batchEffectData[endIndex + j] batchEffectData[endIndex + j] = nil end end end for i = batchHitEffectCount - 1, 0, -1 do local index = i * 10 if batchHitEffectData[index + 1] == renderEntity then batchHitEffectCount = batchHitEffectCount - 1 local endIndex = batchHitEffectCount * 10 for j = 1, 10 do batchHitEffectData[index + j] = batchHitEffectData[endIndex + j] batchHitEffectData[endIndex + j] = nil end end end end function ExpBatchSystem.ChangeBatchEffectTimeScale(renderEntity, timeScale) for i = 0, batchEffectCount - 1 do local index = i * 7 if batchEffectData[index + 1] == renderEntity then batchEffectData[index + 5] = timeScale end end end --批量应用单位的表现数据 function ExpBatchSystem.BatchApplyData() if batchPosDirCount > 0 or batchEffectCount > 0 or batchHitEffectCount > 0 then CSExt.BatchApplyExpData(batchPosDirCount, batchPosDirData, batchEffectCount, batchEffectData, batchHitEffectCount, batchHitEffectData) for i = #batchPosDirData, 1, -1 do batchPosDirData[i] = nil end batchPosDirCount = 0 for i = #batchEffectData, 1, -1 do batchEffectData[i] = nil end batchEffectCount = 0 for i = #batchHitEffectData, 1, -1 do batchHitEffectData[i] = nil end batchHitEffectCount = 0 end end function ExpBatchSystem.BatchEntities(entityDic) --filter trans for k, entity in pairs(entityDic) do if entity.needBatchPosDir then -- 做优化时添加的标记 local last = lastTransDic[entity] if last then local move = entity.components.move local currPos, currDir = move.LogicPos, move.LogicRotateDir local lastPos, lastDir = last[1], last[2] if lastPos ~= currPos or lastDir ~= currDir then local posX,posZ = FP.tonumberV2(currPos) local dirX,dirZ = FP.tonumberV2(currDir) lastPos:Reset(currPos) lastDir:Reset(currDir) local expEntity = entity.ExpEntity BatchPosDir(expEntity.RenderEntity, posX, posZ, dirX, dirZ) -- 子模型跟着旋转 if expEntity.SubRenderEntityList then local renderPosList = expEntity:GetSubRenderEntityOffsetList() for i,renderEntity in ipairs(expEntity.SubRenderEntityList) do local offsetx = renderPosList[i*2-1] local offsetz = renderPosList[i*2] BatchPosDir(renderEntity, posX + offsetx, posZ + offsetz, dirX, dirZ) end end end end end end ExpBatchSystem.BatchPetEntities() end function ExpBatchSystem.SetEntityTrans(entity,pos,dir) local last = lastTransDic[entity] if last then last[1]:Reset(pos) last[2]:Reset(dir) else lastTransDic[entity] = {pos:cloneV2(),dir:cloneV2()} end end function ExpBatchSystem.RemoveEntity(entity) local last = lastTransDic[entity] if last then FP.releaseV2(last[1]) FP.releaseV2(last[2]) lastTransDic[entity] = nil end end function ExpBatchSystem.SetPetEntityTrans(petRenderEntity, posX, posZ, dirX, dirZ) local last = lastPetTransDic[petRenderEntity] if last then last[1] = posX last[2] = posZ last[3] = dirX last[4] = dirZ last[5] = true else lastPetTransDic[petRenderEntity] = {posX, posZ, dirX, dirZ, true} end end function ExpBatchSystem.BatchPetEntities() for petRenderEntity,info in pairs(lastPetTransDic) do if info[5] then info[5] = false BatchPosDir(petRenderEntity, info[1], info[2], info[3], info[4]) end end end function ExpBatchSystem.RemovePetRenderEntity(petRenderEntity) local last = lastPetTransDic[petRenderEntity] if last then lastPetTransDic[petRenderEntity] = nil end end return ExpBatchSystem