内核优化
This commit is contained in:
@@ -37,9 +37,7 @@ public:
|
||||
template <class... Args>
|
||||
requires Scene2D_Frame_Control_Constructible<Frame_Control, Args&&...>
|
||||
explicit Scene2D_Context(std::pmr::memory_resource& memory_resource, Args&&... args)
|
||||
: Scene_State_Strategy(State{}, memory_resource), frame_control(make_frame_control(this->memory_resource(), std::forward<Args>(args)...)), display_root(nullptr, this->memory_resource()), dependency_root(nullptr, this->memory_resource()), final_color_cache(make_cache(this->memory_resource())), color_caches_(&this->memory_resource()) {
|
||||
this->frame_control_strategy = &frame_control;
|
||||
}
|
||||
: Scene_State_Strategy(State{}, memory_resource), frame_control(make_frame_control(this->memory_resource(), std::forward<Args>(args)...)), final_color_cache_(make_cache(this->memory_resource())), display_root_(nullptr, this->memory_resource()), dependency_root_(nullptr, this->memory_resource()), color_caches_(&this->memory_resource()) {}
|
||||
template <class... Args>
|
||||
requires Scene2D_Frame_Control_Constructible<Frame_Control, Args&&...>
|
||||
Scene2D_Context(With_Observer<State_Observer> state_observer, With_Observer<Scene_Observer> scene_observer, Args&&... args)
|
||||
@@ -47,35 +45,54 @@ public:
|
||||
template <class... Args>
|
||||
requires Scene2D_Frame_Control_Constructible<Frame_Control, Args&&...>
|
||||
Scene2D_Context(std::pmr::memory_resource& memory_resource, With_Observer<State_Observer> state_observer, With_Observer<Scene_Observer> scene_observer, Args&&... args)
|
||||
: Scene_State_Strategy(State{}, std::move(state_observer), memory_resource), frame_control(make_frame_control(this->memory_resource(), std::forward<Args>(args)...)), display_root(nullptr, this->memory_resource()), dependency_root(nullptr, this->memory_resource()), final_color_cache(make_cache(this->memory_resource())), scene_observer_(std::move(scene_observer.observer)), color_caches_(&this->memory_resource()) {
|
||||
this->frame_control_strategy = &frame_control;
|
||||
}
|
||||
: Scene_State_Strategy(State{}, std::move(state_observer), memory_resource), frame_control(make_frame_control(this->memory_resource(), std::forward<Args>(args)...)), final_color_cache_(make_cache(this->memory_resource())), display_root_(nullptr, this->memory_resource()), dependency_root_(nullptr, this->memory_resource()), scene_observer_(std::move(scene_observer.observer)), color_caches_(&this->memory_resource()) {}
|
||||
~Scene2D_Context() override {
|
||||
this->wait_for_render();
|
||||
this->frame_control_strategy = nullptr;
|
||||
this->shutdown();
|
||||
}
|
||||
Frame_Control frame_control;
|
||||
Renderable_Base::Layer_Node display_root;
|
||||
Renderable_Base::Dependency_Node dependency_root;
|
||||
Cache final_color_cache;
|
||||
template <class Function>
|
||||
void with_final_color_cache(Function&& function) {
|
||||
if (this->is_render_worker_thread()) {
|
||||
function(static_cast<const Cache&>(final_color_cache_));
|
||||
return;
|
||||
}
|
||||
auto lock = this->lock_render_idle();
|
||||
function(static_cast<const Cache&>(final_color_cache_));
|
||||
}
|
||||
protected:
|
||||
Frame_Control_Strategy_Base& frame_control_strategy_impl() noexcept override {
|
||||
return frame_control;
|
||||
}
|
||||
const Frame_Control_Strategy_Base& frame_control_strategy_impl() const noexcept override {
|
||||
return frame_control;
|
||||
}
|
||||
Renderable_Base::Layer_Node* display_root_node() noexcept override {
|
||||
return &display_root_;
|
||||
}
|
||||
Renderable_Base::Dependency_Node* dependency_root_node() noexcept override {
|
||||
return &dependency_root_;
|
||||
}
|
||||
void on_renderable_attached(Renderable_Base& renderable) override {
|
||||
if (!renderable.layer_node.parent) {
|
||||
display_root.append_child(renderable.layer_node);
|
||||
auto& display_node = Scene_Base::layer_node(renderable);
|
||||
auto& dependency_node = Scene_Base::dependency_node(renderable);
|
||||
if (!display_node.parent()) {
|
||||
display_root_.append_child(display_node);
|
||||
}
|
||||
if (!renderable.dependency_node.parent) {
|
||||
dependency_root.append_child(renderable.dependency_node);
|
||||
if (!dependency_node.parent()) {
|
||||
dependency_root_.append_child(dependency_node);
|
||||
}
|
||||
if (color_caches_.try_emplace(&renderable, make_cache_pointer(this->memory_resource())).second) {
|
||||
renderable.invalidate_cache();
|
||||
}
|
||||
color_caches_.try_emplace(&renderable, make_cache_pointer(this->memory_resource()));
|
||||
}
|
||||
void on_renderable_detached(Renderable_Base& renderable) override {
|
||||
promote_children(renderable.layer_node);
|
||||
promote_children(renderable.dependency_node);
|
||||
promote_children(Scene_Base::layer_node(renderable));
|
||||
promote_children(Scene_Base::dependency_node(renderable));
|
||||
color_caches_.erase(&renderable);
|
||||
}
|
||||
void prepare_render_task(Render_Task& task, const Renderable_List& renderables) override {
|
||||
task.render_order = tree_order(dependency_root, renderables);
|
||||
task.display_order = tree_order(display_root, renderables);
|
||||
task.render_order = tree_order(dependency_root_, renderables);
|
||||
task.display_order = tree_order(display_root_, renderables);
|
||||
}
|
||||
Color_Cache* prepare_renderable_cache(Renderable_Base& renderable, bool clear) override {
|
||||
Cache* cache = color_caches_.at(&renderable).get();
|
||||
@@ -85,9 +102,9 @@ protected:
|
||||
return cache;
|
||||
}
|
||||
void generate_final_color_cache(const Scene_Render_Context&, const Renderable_List& renderables) override {
|
||||
final_color_cache.clear();
|
||||
final_color_cache_.clear();
|
||||
for (const Renderable& renderable : renderables) {
|
||||
final_color_cache.composite(*color_caches_.at(renderable.get()));
|
||||
final_color_cache_.composite(*color_caches_.at(renderable.get()));
|
||||
}
|
||||
}
|
||||
std::uint64_t acquire_scene_state() override {
|
||||
@@ -125,13 +142,19 @@ private:
|
||||
}
|
||||
template <class Node>
|
||||
void promote_children(Node& node) {
|
||||
if (!node.parent) {
|
||||
if (!node.parent()) {
|
||||
return;
|
||||
}
|
||||
Node* parent = node.parent;
|
||||
const auto iterator = std::find(parent->children.begin(), parent->children.end(), &node);
|
||||
std::size_t index = static_cast<std::size_t>(iterator - parent->children.begin());
|
||||
std::pmr::vector<Node*> children(node.children.begin(), node.children.end(), &this->memory_resource());
|
||||
Node* parent = node.parent();
|
||||
std::size_t index{};
|
||||
while (&parent->child(index) != &node) {
|
||||
++index;
|
||||
}
|
||||
std::pmr::vector<Node*> children(&this->memory_resource());
|
||||
children.reserve(node.child_count());
|
||||
for (std::size_t child_index = 0; child_index < node.child_count(); ++child_index) {
|
||||
children.push_back(&node.child(child_index));
|
||||
}
|
||||
node.detach();
|
||||
for (Node* child : children) {
|
||||
parent->insert_child(index++, *child);
|
||||
@@ -139,14 +162,14 @@ private:
|
||||
}
|
||||
template <class Node, class Attached, class Visited>
|
||||
static void append_tree_order(Node& node, const Attached& attached, Visited& visited, Renderable_List& order) {
|
||||
if (node.owner) {
|
||||
auto iterator = attached.find(node.owner);
|
||||
if (iterator != attached.end() && visited.insert(node.owner).second) {
|
||||
if (node.owner()) {
|
||||
auto iterator = attached.find(node.owner());
|
||||
if (iterator != attached.end() && visited.insert(node.owner()).second) {
|
||||
order.push_back(iterator->second);
|
||||
}
|
||||
}
|
||||
for (Node* child : node.children) {
|
||||
append_tree_order(*child, attached, visited, order);
|
||||
for (std::size_t index = 0; index < node.child_count(); ++index) {
|
||||
append_tree_order(node.child(index), attached, visited, order);
|
||||
}
|
||||
}
|
||||
template <class Node>
|
||||
@@ -168,6 +191,9 @@ private:
|
||||
}
|
||||
return order;
|
||||
}
|
||||
Cache final_color_cache_;
|
||||
Renderable_Base::Layer_Node display_root_;
|
||||
Renderable_Base::Dependency_Node dependency_root_;
|
||||
Scene_Observer scene_observer_;
|
||||
std::pmr::unordered_map<Renderable_Base*, Cache_Pointer> color_caches_;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user