锁优化

This commit is contained in:
2026-08-27 11:02:26 +08:00
parent 420fcaf315
commit d4dba2c340
29 changed files with 695 additions and 449 deletions
+23 -8
View File
@@ -108,7 +108,9 @@ Render_Scene_3D::Builder<Object>::add_camera(Camera_Object* camera_value) {
if (camera) throw std::logic_error("Render_Scene_3D accepts one Camera component");
camera = camera_value;
read_camera = [](const Root* root) {
const auto& prop = static_cast<const Camera_Object*>(root)->template read_prop<Camera_3D::Base_Tag>();
const auto* object = static_cast<const Camera_Object*>(root);
const Camera_3D::Prop& prop =
Base::template current_prop<Camera_3D::Base_Tag>(object);
return Camera_Descriptor{prop.initial_view, prop.projection, prop.controller,
prop.turntable_control, prop.arcball_control,
prop.fly_control, prop.panzoom_control,
@@ -125,7 +127,9 @@ Render_Scene_3D::Builder<Object>::add_axes(Axes_Object* axes_value) {
if (axes) throw std::logic_error("Render_Scene_3D accepts one Axes component");
axes = axes_value;
read_axes = [](const Root* root) {
const auto& prop = static_cast<const Axes_Object*>(root)->template read_prop<Axes_3D::Base_Tag>();
const auto* object = static_cast<const Axes_Object*>(root);
const Axes_3D::Prop& prop =
Base::template current_prop<Axes_3D::Base_Tag>(object);
return std::array<plot::Axis_Descriptor, 3>{prop.x_axis, prop.y_axis, prop.z_axis};
};
return static_cast<Final_Builder&>(*this);
@@ -158,7 +162,8 @@ std::expected<std::unique_ptr<Object>, Dependency_Graph_Error> Render_Scene_3D::
}
template <Attached Object>
detail::Scene_3D_Parameters Render_Scene_3D::Private::parameters(Object* object) const {
const auto& prop = object->template read_prop<Render_Scene_3D::Base_Tag>();
const auto& private_data = static_cast<const typename Object::Private&>(*this);
const Prop& prop = private_data.template current_prop<Render_Scene_3D::Base_Tag>();
const auto axis = read_axes(axes_component);
return {prop.viewport, prop.clear_color, read_camera(camera_component), axis[0], axis[1], axis[2]};
}
@@ -286,7 +291,6 @@ void Render_Scene_3D::Private::ensure_frame_taskflow(Object* object) {
std::chrono::steady_clock::now().time_since_epoch()).count());
state.paint_execution_time_ns = finished - state.paint_execution_time_ns;
}
dispatch->state.publish(root);
});
done.describe("renderable", std::string(dispatch->business_name))
.describe("dimension", "3D")
@@ -390,7 +394,6 @@ void Render_Scene_3D::Private::ensure_frame_taskflow(Object* object) {
std::chrono::steady_clock::now() - started)
.count());
}
dispatch->state.publish(root);
});
task.describe("renderable", std::string(dispatch->business_name))
.describe("dimension", "3D")
@@ -491,7 +494,8 @@ void Render_Scene_3D::Private::ensure_frame_taskflow(Object* object) {
template <Attached Object>
Render_Scene_3D::Render_Result Render_Scene_3D::Private::render(Object* object, Frame_3D* frame) {
if (!frame) throw std::invalid_argument("Render_Scene_3D requires a non-null external frame");
const auto& prop = object->template read_prop<Render_Scene_3D::Base_Tag>();
const auto& private_data = static_cast<const typename Object::Private&>(*this);
const Prop& prop = private_data.template current_prop<Render_Scene_3D::Base_Tag>();
if (!prop.view_active) return Render_Result::view_inactive;
if (prop.viewport.empty()) return Render_Result::empty_viewport;
if (!backend || !backend->available()) return Render_Result::backend_unavailable;
@@ -509,8 +513,19 @@ Render_Scene_3D::Render_Result Render_Scene_3D::Private::render(Object* object,
try {
auto completion = [this, object, frame] {
auto& private_data = static_cast<typename Object::Private&>(*this);
private_data.state.advance();
object->template notify_state<Render_Scene_3D::Base_Tag>();
std::unordered_set<Root*> published_renderables;
const auto publish_renderable_states = [&](const auto& graph) {
graph.for_each_bound([&](Renderable* renderable,
Renderable::Private& data) {
if (published_renderables.insert(renderable).second)
data.dispatch->state.publish(renderable);
});
};
publish_renderable_states(
object->template current_dependency_graph<Prepare_Data_Tag>());
publish_renderable_states(
object->template current_dependency_graph<Submit_Tag>());
private_data.template publish_state<Render_Scene_3D::Base_Tag>();
complete_frame(object, frame);
};
if (frame->taskflow_trace_requested())
+1 -1
View File
@@ -46,7 +46,7 @@ template <typename Spec>
template <Attached Object>
void Basic_Visual<Spec>::Private::prepare_data(Object* object) {
using Visual_Tag = typename Basic_Visual::Base_Tag;
const auto& prop = object->template read_prop<Visual_Tag>();
const auto& prop = this->template read_current_prop<Visual_Tag>(object);
if (!valid_items(prop.items) || !detail::finite(prop.transform)) throw std::invalid_argument("3D visual property contains invalid data");
auto data = std::make_shared<Prepared_Data>();
Spec::prepare(prop.items, *data);