公司的SLG项目上线运行挺久的,军团领土这一块一直没大问题,大概玩法就是玩家可以创建军团,军团长可以在世界上创建军团基地,玩家可以占领相邻的格子,变为军团领土,增加所有军团成员的收益。如果放弃某个格子,或者由于被其他军团抢夺而失去,则会检查不与基地相连的领土,全部失去。
直到去年一月份一个大版本的更新:军团领土上限变多了很多,并且由于奖励的机制,玩家原本块状的军团领土变成了线条性。更新后玩家群反馈是不是无法操作,类似断网的体验。问题来了,那就开查根据服务器日志,很快定位到卡顿点:但军团失去领土,服务器会因为运算因为不相邻而失去的领土足足卡几秒。看了下现有的算法,伪代码还难以展现它的可怕之处,直接上核心代码(如下图),这函数本身就包含一次排序和多次的加减运算(幸好没有乘除,不然更卡),卡点在于要循环N次(N为领土数量)调用这个函数,每个格子都要检查一次是否相邻。
function LegionWorldMapHelp.CheckCoordConnectByList(nStartCoordX, nStartCoordY, nEndCoordX, nEndCoordY, tGridList)
local nCalcTimes = 0
local nIndex = 0
local tConnectList= {
[1] = {nCoordX = nStartCoordX, nCoordY = nStartCoordY},
}
local tSortGridList = LegionWorldMapHelp.SortGridListByNearCoord(nStartCoordX, nStartCoordY, tGridList)--根据距离返回一个排序