添加外部内存数据源
This commit is contained in:
@@ -98,3 +98,77 @@ renderive_scene_app --gtest
|
||||
## Taskflow 查找
|
||||
|
||||
CMake 通过 `RENDERIVE_TASKFLOW_ROOT` 或系统 include 路径查找 `taskflow/taskflow.hpp`。Taskflow 不存在时,仅测试和沙盒构建使用 `tests/compat/taskflow/taskflow.hpp` 验证图生成与依赖语义;正式集成时把 `RENDERIVE_TASKFLOW_ROOT` 指向 Taskflow 4.1.0 根目录或 include 目录。
|
||||
|
||||
## Scene 内存域
|
||||
|
||||
`Scene_Base` 接受外部 `std::pmr::memory_resource` 作为上游资源。Scene 内部建立 `std::pmr::synchronized_pool_resource`,所有可能跨线程访问的持久容器都使用该线程安全内存域:
|
||||
|
||||
```cpp
|
||||
std::pmr::unsynchronized_pool_resource application_resource;
|
||||
Scene2D_Context<> scene(application_resource);
|
||||
```
|
||||
|
||||
外部资源决定最终的上游分配机制。Scene 内部的同步池负责将来自调用线程、后台 Scene 线程和 Renderable 构图路径的分配串行化。外部资源必须比 Scene 以及由 Scene 工厂创建后仍存活的 Renderable 更长寿。
|
||||
|
||||
可通过以下接口访问两个层级:
|
||||
|
||||
```cpp
|
||||
scene.upstream_memory_resource();
|
||||
scene.memory_resource();
|
||||
```
|
||||
|
||||
`upstream_memory_resource()` 返回构造时传入的资源;`memory_resource()` 返回 Scene 实际使用的线程安全同步池。
|
||||
|
||||
单次渲染构图不长期占用同步池。`Scene_Base::execute_taskflow()` 和 Scene2D 树顺序生成使用局部 `std::pmr::monotonic_buffer_resource`,返回后整体释放临时索引、标记和任务句柄容器。
|
||||
|
||||
## Renderable 两种构造模式
|
||||
|
||||
Scene 工厂模式同时控制 Renderable 对象、`shared_ptr` 控制块以及 Renderable 内部树和任务图分配:
|
||||
|
||||
```cpp
|
||||
Scene2D_Context<> scene(memory_resource);
|
||||
auto renderable = scene.make_renderable<Spectrum_Renderable>(configuration);
|
||||
scene.attach_renderable(renderable);
|
||||
```
|
||||
|
||||
工厂只构造对象,不自动挂载,`attach_renderable()` 的原有语义不变。工厂分配器持有 Scene 内存域的共享所有权,因此 Renderable 析构时内存域仍然有效。
|
||||
|
||||
独立构造模式继续保留:
|
||||
|
||||
```cpp
|
||||
auto renderable = std::make_shared<Spectrum_Renderable>(scene, configuration);
|
||||
Spectrum_Renderable stack_renderable(scene, configuration);
|
||||
```
|
||||
|
||||
独立模式下,Renderable 对象本身和 `shared_ptr` 控制块由调用方选择的机制分配;`Multiway_Node`、`Renderable_Task_Graph`、任务名称和依赖边仍使用所属 Scene 的内存域。
|
||||
|
||||
## 独立 allocator-aware 组件
|
||||
|
||||
以下组件可脱离 Scene 独立注入资源:
|
||||
|
||||
- `Multiway_Node`
|
||||
- `Renderable_Task_Graph`
|
||||
- `Recording_Color_Cache`
|
||||
- `Flow_Refresh_Strategy`
|
||||
- `History_Real_Time_Data`
|
||||
- `Property_Builder::build_with_resource()`
|
||||
- `Property_Builder::build_unique_with_resource()`
|
||||
|
||||
`History_Real_Time_Data` 的时间戳容器始终使用传入资源。历史值容器只有在 `Container` 本身支持 PMR allocator 时才使用该资源:
|
||||
|
||||
```cpp
|
||||
History_Real_Time_Data<int, std::pmr::vector<int>> history(memory_resource);
|
||||
```
|
||||
|
||||
## 不受 Scene PMR 控制的分配
|
||||
|
||||
以下内存不属于 Renderive 自己的 allocator-aware 场景域:
|
||||
|
||||
- Taskflow 4.1.0 内部任务节点、执行队列和 executor 工作资源
|
||||
- `std::function` 超出小对象优化后的内部存储
|
||||
- `std::thread` 的系统线程对象和线程栈
|
||||
- 异常运行时对象
|
||||
- 用户自定义 State、Frame、Observer、Renderable 成员内部自行使用的非 PMR 容器
|
||||
- 第三方渲染后端内部资源
|
||||
|
||||
Scene PMR 的语义是控制 Renderive 明确实现为 allocator-aware 的核心对象,不承诺接管第三方库和用户类型的全部动态分配。
|
||||
|
||||
Reference in New Issue
Block a user