【发布时间】:2017-01-18 22:47:34
【问题描述】:
为了将我的静态数据传输到 GPU,我正在考虑使用单个暂存 VkMemory 对象(大约 64MB),并将其用作旋转队列。但是,我有多个线程生成内容(例如:渲染字形、加载文件、程序),如果他们可以完全自己上传数据(即编写 plus 提交 Vulkan 传输命令),我希望它.
我打算至少在加载期间(但如果我想流式传输数据可能更长)保持整个暂存 VkMemory 永久映射(如果这是愚蠢的,请说出来)。
为了实现上述目标,一旦线程的数据被完全写入/刷新到暂存,我希望它能够立即提交 GPU 传输命令。
但是,这意味着 GPU 将从 VkMemory 的一部分读取,而其他线程可能正在写入/刷新。
AFAIK 我还需要使用图像内存屏障来实现从 VK_IMAGE_LAYOUT_PREINITIALIZED 到 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL 的过渡。
我在规范中找不到任何明确说明这是合法还是非法的内容,只是应该注意确保同步。但是,我没有找到足够的细节来确定哪种方式。
注意:暂存队列需要确保在覆盖任何内容之前已完成传输 - 我打算为此保留一个免费的 VkFences 队列。
问题:
- 这样可以吗?
- 是否需要将每个单独的对象与页面边界对齐?或者别的什么。
- 我是否正确假设图像内存屏障(上图)不需要设备写入到暂存内存。
【问题讨论】:
-
"为了实现上述目标,一旦线程的数据完全写入/刷新到暂存,我希望它能够立即提交 GPU 传输命令。" 我会强烈建议不要这样做。将 GPU 命令提交到队列,即使只是副本,也是一个重量级操作。最好将命令批量化并在帧结束时一次性提交。一个好的多写并发队列就足够了。
标签: multithreading memory vulkan memory-mapping