【BUG经验】下面地图被“吃”了
前天 19:33综合
我:下面地图被“吃”了,怎么回事,查清原因。
嗒:
我发现了关键问题。看第 670-676 行的可见范围计算(无旋转时):
local viewB = viewT + layout.h * invZoom
当有 isoScaleY 时,layout.h 需要除以 isoScaleY 才能得到正确的内容空间高度。但这里没有考虑 isoScaleY_,导致可见行范围 rowMax 计算偏小,底部的行根本没有被渲染。
让我确认 isoScaleY_ 的值和变换链。
isoScaleY_ = 0.5。变换链是:Translate → Scale(1, 0.5) → Rotate → Scale(zoom, zoom)。
无旋转时,视口的底部在内容坐标中应该是 viewT + layout.h / (isoScaleY * zoom),但代码只用了 layout.h * invZoom,少除了 isoScaleY。这意味着可见区域的高度被低估了一半,底部的行不会被渲染。
让我同时检查有旋转时的 ScreenToContent 是否正确处理了 isoScaleY。
找到根因了。问题不在 scissor,而在可见范围计算。
变换链是 Translate → Scale(1, 0.5) → Rotate → Scale(zoom),无旋转时:
screenY = layout.y + panY + isoScaleY * zoom * contentY
反推:contentY = (screenY - layout.y - panY) / (isoScaleY * zoom)
但代码只除了 zoom,漏了 isoScaleY(0.5),导致可见高度只算了实际的一半,底部的行根本没被渲染。
根因:无旋转时的可见范围计算没有考虑 isoScaleY = 0.5。变换链 Translate → Scale(1, 0.5) → Zoom 使得 Y 方向上,屏幕像素对应的内容坐标范围需要额外除以 isoScaleY。原代码 viewT/viewB 只除了 zoom,漏了 isoScaleY,导致可见高度只算了实际的一半,底部的行根本没被渲染出来。
(有旋转时用的是 ScreenToContent 函数,那里正确处理了 isoScaleY,所以旋转视角下没问题。)



