SceneRenderer 实例收集扁平化:batchMats 从 vector<vector> 改为单 vector 按 (first,count) 切片,优化大场景下批次实例存储与 cache 命中率

This commit is contained in:
2026-10-04 21:26:48 +08:00
parent 3e85285e41
commit e038cb39fa
2 changed files with 43 additions and 30 deletions
@@ -103,10 +103,11 @@ namespace Engine {
u32 entityBits = 0; // 实体位模式(HitProxy id pass 消费)
};
CullResult result;
// 每 batch 自己的实例列表(按 mesh 分组)。GPU 端 batch 语义 =
// firstInstance + 连续区间,实体序收集不满足(多实体共享 mesh
// 时实例分散各处),扁平化成连续数组推迟到 appendView
std::vector<std::vector<InstanceMatrices>> batchMats;
// 扁平实例数组(所有 batch 的实例共用一份连续内存)。
// InstanceBatch::first/count 在本数组里切片——大场景下避免
// vector<vector> 的小块分配(每个 batch 自己一个 vector,push_back
// 触发各自重分配,cache miss 严重)。每帧 clear() 复用容量
std::vector<InstanceMatrices> instances;
// 每 batch 实例距离累加(透明排序用:平均距离降序 = 远→近)
std::vector<f32> batchDistSum;
// batch 查找:数组寻址(下标 = Mesh::GetSlot(),值 = 每 LOD 的
@@ -117,7 +118,7 @@ namespace Engine {
{
result.batches.clear();
result.instanceCount = 0;
batchMats.clear();
instances.clear(); // 容量保留,复用
batchDistSum.clear();
for (auto& e : lookup) e.fill(0); // 容量保留,置零复用
}