修复 gen_1_21 渲染:1.21 的 gameLoadFinished 门禁(第 13 处世代差异)
症状:gen_1_21 启动成功、数据注入成功(loadedChunks=49),
但 chunksRendered=0、画面停在 Mojang 加载屏(distinctColors≈199)。
根因(1.21 GameRenderer.render 内部,编译期看不出):
boolean ok = minecraft.isGameLoadFinished();
if (ok && renderLevel && level != null) renderLevel(...);
该标志只在 reloadResourcePacks 回调(onResourceLoadFinished)里置 true。
我们不跑异步 reload(会死锁)⇒ 恒 false ⇒ 世界永不渲染。
1.20.x 无此门禁 ⇒ gen_1_20 从未受影响。
修法:gen_1_21 的 McfoldBridge 加 markGameLoadFinished(反射置位),
在 boot 里 shader 编译后调用 —— 差异留在 Java 侧。
★ 教训:这类差异不崩不报错,只是画面不对 ⇒ 判据必须用
chunksRendered/distinctColors,不能只看进程活着。
顺带修:tick 异常不再静默吞掉(try{tick()}catch(ignore){} → 打印第一帧异常)
新增诊断字段:screenNow/overlayNow/levelNow/playerNow/noRender
实测:gen_1_21 现在 chunksRendered=25、has_world_content=True
(草地/天空/太阳/HUD 正常)
This commit is contained in:
@ -233,6 +233,8 @@ public class McfoldRenderServer {
|
||||
});
|
||||
light.setLightEnabled(new ChunkPos(cx, cz), true);
|
||||
light.runLightUpdates();
|
||||
// ★ 必须触发网格重建 —— 否则渲染器不知道该 section 有数据(实测)
|
||||
mc.levelRenderer.allChanged();
|
||||
JsonObject r = new JsonObject();
|
||||
r.addProperty("ok", true);
|
||||
r.addProperty("placed", placed);
|
||||
@ -529,7 +531,9 @@ public class McfoldRenderServer {
|
||||
static void tickFrames(int n) {
|
||||
MainTarget target = (MainTarget) mc.getMainRenderTarget();
|
||||
for (int f = 0; f < n; f++) {
|
||||
try { mc.tick(); } catch (Throwable ignore) {}
|
||||
try { mc.tick(); } catch (Throwable t) {
|
||||
if (f == 0) { System.err.println("[mcfold] tick 异常(第1帧): " + t); t.printStackTrace(System.err); }
|
||||
}
|
||||
RenderSystem.clear(16640, Minecraft.ON_OSX);
|
||||
target.bindWrite(true);
|
||||
mc.gameRenderer.render(0.0F, (long) f * 16_000_000L, true);
|
||||
|
||||
Reference in New Issue
Block a user