切片与网格渲染
基本信息
| 属性 | 值 |
|---|---|
| 切片类 | 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) |