From 641f79d89e07969a279d15ba4f478cfe72c29788 Mon Sep 17 00:00:00 2001 From: atdunbg Date: Thu, 24 Sep 2026 14:32:39 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20GPUDriven=20batch=20lookup=20=E7=B4=A2?= =?UTF-8?q?=E5=BC=95=E8=AF=AD=E4=B9=89=E6=B7=B7=E6=B7=86=E2=80=94=E2=80=94?= =?UTF-8?q?=E5=A4=9A=E5=AE=9E=E4=BD=93=E5=85=B1=E4=BA=AB=20mesh=20?= =?UTF-8?q?=E8=B6=8A=E7=95=8C=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ViewScratch.lookup 误存 worlds 索引却被当 batches 索引用。单实体时 每个 mesh 恰好只出现一次、两序号恒等,潜伏不炸;多实体共享同一 Model(2x2 实例网格实测)后 worlds 与 batches 分叉,first-insert 用 worlds.size() 索引 batches → vector 断言越界。 修:lookup 存 batches 索引,batch.first(GPU firstInstance 基址) 保持 worlds 索引,两语义各归其位。 --- Engine/src/Renderer/SceneRenderer.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Engine/src/Renderer/SceneRenderer.cpp b/Engine/src/Renderer/SceneRenderer.cpp index 8422b4e..1003394 100644 --- a/Engine/src/Renderer/SceneRenderer.cpp +++ b/Engine/src/Renderer/SceneRenderer.cpp @@ -303,8 +303,12 @@ namespace Engine instanceTruncated = true; return; } + // lookup 值 = batches 索引(此前误存 worlds 索引: + // 单实体时两序号恰好恒等,多实体共享 mesh 后分叉 + // → batches[worldsIdx] 越界)。batch.first(GPU + // firstInstance 基址)才是 worlds 索引,语义别混 const auto [it, inserted] = s.lookup.emplace( - mesh.get(), static_cast(s.worlds.size())); + mesh.get(), static_cast(s.result.batches.size())); if (inserted) { s.result.batches.push_back({mesh.get(), static_cast(s.worlds.size()), 0});