深度排序算法修复
05/101 浏览攻略
问题:之前的排序只使用 sortRow(网格行号),存在两个缺陷:
忽略旋转角度:等距视角有旋转(Q/E),但排序没有考虑列号的影响。同一行不同列的树,在旋转后深度是不同的
排序不稳定:同行号的实体排序结果不确定,随视口变化(玩家移动)会变动
修复方案:使用旋转感知的深度排序键:
sortKey = cx * sin(rotation) + cy * cos(rotation)
这就是内容坐标 (cx, cy) 经过地图旋转后的屏幕 Y 坐标(即深度轴)。
rotation = 0 时:sortKey = cy,纯按行排序
rotation = π/4 时:sortKey ∝ cx + cy,经典 45° 等距排序
rotation = π/2 时:sortKey = cx,纯按列排序
任意中间角度都正确
效果:
树的层级关系只取决于它们的固定位置和当前旋转角度,不会随玩家移动变化
Q/E 旋转时深度关系会正确更新
掉落物也参与统一排序,会被前方树木正确遮挡
双键深度排序修复已完成部署,修改要点回顾:
修复内容:在 _RenderBuildings 的统一深度排序中,为所有实体(建筑、树木NPC、资源网格树、掉落物)添加了第二排序键 sortKey2。
排序逻辑:
主键 sortKey = cx * sin(rot) + cy * cos(rot) — 沿深度轴的投影(决定前后关系)
辅键 sortKey2 = cx * cos(rot) - cy * sin(rot) — 沿垂直于深度轴的投影(决胜用)
这样每个不同位置 (cx, cy) 都会产生唯一的排序对,Lua 的非稳定 table.sort 不再因为数组组成变化(玩家移动导致可视集合变化)而产生不同的排序结果。
请预览测试一下,看树木之间的层级关系是否在移动时保持稳定了。


