SceneRenderer 实例收集扁平化:batchMats 从 vector<vector> 改为单 vector 按 (first,count) 切片,优化大场景下批次实例存储与 cache 命中率
This commit is contained in:
@@ -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); // 容量保留,置零复用
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user