@@ -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