切片与网格渲染

基本信息

属性 值
切片类 journeymap.client.render.map.Tile(render/map/Tile.java)
网格渲染器 journeymap.client.render.map.GridRenderer
绘制步骤 TileDrawStep、TileDrawStepCache
区域缓存 journeymap.client.model.RegionImageSet / RegionImageCache
切片坐标 TilePos
纹理实现 render/texture/TextureCache / TextureImpl
绘制步骤工厂 render/draw/RadarDrawStepFactory、WaypointDrawStepFactory
渲染类型档位 4 档(tileRenderType 1–4)

功能

制图渲染器把区块画进内存位图后,界面并不直接读它,而是经过"区域图集(RegionImageSet)→ 切片(Tile)→ 网格(GridRenderer)"三层缓存。好处是缩放时只需重新取切片而不重画像素。

切片坐标系

Tile 提供 4 个坐标工具(Tile.java:72-83):

方法 作用
blockPosToTile(int b, int zoom) 方块坐标 → 切片坐标
tileToBlock(int t, int zoom) 切片坐标 → 方块坐标
toCacheKey(int tileX, int tileZ, int zoom) 缓存键,格式 "<tileX>,<tileZ>@<zoom>"(:83-85)
toString() "Tile [ r<tileX>, r<tileZ> (zoom <zoom>) ]"(:188-191)

4 档 OpenGL 渲染参数

tileRenderType(CoreProperties 中的 jm.advanced.tile_render_type,范围 1–4)直接选择贴图过滤与寻址模式。Tile.updateRenderType()(Tile.java:152-185)逐档设置:

档位 textureFilter textureWrap debugGlSettings
1(默认) GL11.GL_LINEAR GL14.GL_MIRRORED_REPEAT GL_LINEAR, GL_MIRRORED_REPEAT
2 GL11.GL_LINEAR GL12.GL_CLAMP_TO_EDGE GL_LINEAR, GL_CLAMP_TO_EDGE
3 GL11.GL_NEAREST GL14.GL_MIRRORED_REPEAT GL_NEAREST, GL_MIRRORED_REPEAT
4 GL11.GL_NEAREST GL12.GL_CLAMP_TO_EDGE GL_NEAREST, GL_CLAMP_TO_EDGE

即档位 1/2 为线性插值(平滑),3/4 为最近邻(锐利);CLAMP_TO_EDGE 档(2/4)会消除切片边缘的镜像重复接缝。

两个切换开关

switchTileRenderType()(Tile.java:88-102)与 switchTileDisplayQuality()(:104-112)对应 Ctrl+= 与 Ctrl+-:

方法 行为 落盘
switchTileRenderType() tileRenderType.incrementAndGet(),超过 4 则回绕到 1;用 ChatLog.announceError() 播报新档位与 Tile.debugGlSettings 调 coreProperties.save()
switchTileDisplayQuality() 翻转 tileHighDisplayQuality 布尔值,播报 On/Off 调 coreProperties.save()

两者末尾都调 resetTileDisplay()(:114-120),级联清空 4 层缓存:

TileDrawStepCache.instance().invalidateAll();
RegionImageCache.instance().clear();
MiniMap.state().requireRefresh();
Fullscreen.state().requireRefresh();

切片内容管理

方法 语义 源码
create(tileX, tileZ, zoom, worldDir, mapType, highQuality) 工厂方法 :65-70
updateTexture(worldDir, mapType, highQuality) 重建绘制步骤,返回是否有多于 1 个步骤 :123-129
hasTexture(MapType) 检查所有 TileDrawStep 是否都有纹理,全有才返回 true :131-141
clear() 清空绘制步骤 :143-146
cacheKey() / hashCode() 缓存与哈希 :193-、:199-

updateTexture() 内部先 updateRenderType() 再从 RegionImageHandler.getTileDrawSteps(...) 重新拉取绘制步骤(:124-128),因此切档位会立即反映到下一次纹理更新。

数值

数值名 值
渲染档位数 4
默认档位 1(GL_LINEAR + GL_MIRRORED_REPEAT)
缓存键格式 <tileX>,<tileZ>@<zoom>
档位切换的播报方式 ChatLog.announceError()(复用错误播报通道,非普通聊天)
缓存重置级联层数 4
绘制步骤来源 RegionImageHandler.getTileDrawSteps(worldDir, ulChunk, lrChunk, mapType, zoom, highQuality)

交互

触发 行为
Ctrl + = 渲染档位 1→2→3→4→1 循环并重置全部缓存
Ctrl + - 切换切片显示质量(高/低)并重置全部缓存
全屏地图缩放 zoomLevel 变化 → 方块边长 2^zoomLevel(Fullscreen.java:695),按新 zoom 取切片
切片缺纹理 hasTexture() 返回 false,界面回退到父级 RegionImageSet
地图数据更新 drawSteps.clear() 后重新拉取(Tile.java:125-126)

相关条目