锁优化
This commit is contained in:
@@ -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())
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user