Skip to content

Commit 8a74379

Browse files
committed
vertex optimization: avoid data movement and multi-stage memory reallocation
Signed-off-by: ZhouFANG <indevn@outlook.com>
1 parent 1d2d9a9 commit 8a74379

1 file changed

Lines changed: 16 additions & 26 deletions

File tree

src/renderer.cpp

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -101,34 +101,24 @@ void SimpleRenderer::ExecuteDrawPipeline(const Model &model, uint32_t *buffer) {
101101
/* * * Vertex Transformation * * */
102102
auto vertex_shader_start_time = std::chrono::high_resolution_clock::now();
103103
std::vector<Vertex> processedVertices;
104-
std::vector<std::vector<Vertex>> processed_vertices_all_thread(kNProc);
105-
#pragma omp parallel num_threads(kNProc) default(none) \
106-
shared(shader_, processed_vertices_all_thread) firstprivate(model)
107-
{
108-
int thread_id = omp_get_thread_num();
109-
std::vector<Vertex> &processedVertices_per_thread =
110-
processed_vertices_all_thread[thread_id];
104+
const auto &input_vertices = model.GetVertices();
105+
processedVertices.resize(input_vertices.size()); // 根据顶点总数量进行预分配
111106

112-
#pragma omp for
113-
for (const auto &v : model.GetVertices()) {
114-
// 顶点着色器:世界坐标 -> 裁剪坐标
115-
auto clipSpaceVertex = shader_->VertexShader(v);
116-
117-
// 透视除法:裁剪坐标 -> NDC坐标
118-
auto ndcVertex = PerspectiveDivision(clipSpaceVertex);
119-
120-
// 视口变换:NDC坐标 -> 屏幕坐标
121-
auto screenSpaceVertex = ViewportTransformation(ndcVertex);
122-
123-
processedVertices_per_thread.push_back(screenSpaceVertex);
124-
}
125-
}
107+
// 并行过程保持连续分块,避免false sharing
108+
#pragma omp parallel for num_threads(kNProc) schedule(static) \
109+
shared(shader_, processedVertices, input_vertices)
110+
for (size_t i = 0; i < input_vertices.size(); ++i) { // 按索引并行处理
111+
const auto &v = input_vertices[i];
112+
// 顶点着色器:世界坐标 -> 裁剪坐标
113+
auto clipSpaceVertex = shader_->VertexShader(v);
114+
115+
// 透视除法:裁剪坐标 -> NDC坐标
116+
auto ndcVertex = PerspectiveDivision(clipSpaceVertex);
117+
118+
// 视口变换:NDC坐标 -> 屏幕坐标
119+
auto screenSpaceVertex = ViewportTransformation(ndcVertex);
126120

127-
for (const auto &processedVertices_per_thread :
128-
processed_vertices_all_thread) {
129-
processedVertices.insert(processedVertices.end(),
130-
processedVertices_per_thread.begin(),
131-
processedVertices_per_thread.end());
121+
processedVertices[i] = screenSpaceVertex;
132122
}
133123
auto vertex_shader_end_time = std::chrono::high_resolution_clock::now();
134124
auto vertex_shader_duration = std::chrono::duration_cast<std::chrono::microseconds>(

0 commit comments

Comments
 (0)