【问题标题】:How do I know when Vulkan isn't using memory anymore so I can overwrite it / reuse it?我怎么知道 Vulkan 何时不再使用内存,以便我可以覆盖/重用它?
【发布时间】:2021-09-24 21:38:35
【问题描述】:

在使用 Vulkan 时,通常在创建缓冲区(例如统一缓冲区)时会创建多个(缓冲区“版本”),因为如果您有双缓冲,例如,您不知道图形 API 是否是仍在绘制最后一帧(使用您绑定的内存并指示它使用最后一个循环)。我已经看到这种情况发生在统一缓冲区而不是顶点或索引缓冲区或图像/纹理缓冲区。这是因为统一缓冲区会定期更新,而顶点缓冲区或图像不会?

如果您想更新图像或顶点缓冲区,如果您不知道图形 API 是否仍在使用它,您会怎么做?您是否只是为该图像/缓冲区重新分配新内存并重新开始?即使你只是想更新一部分呢?如果这是您分配新缓冲区的情况,您何时知道释放旧缓冲区?会说,例如未来 5 帧可以吗?还是2秒?毕竟,它仍然可以使用。这是怎么做到的?

【问题讨论】:

    标签: vulkan


    【解决方案1】:

    假设你不知道图形 API 是否还在使用它?

    但你确实知道。

    Vulkan 不会随意使用资源。它准确地使用它们并且仅使用您的代码告诉它使用资源的方式。您创建并提交了使用这些资源的命令,因此如果您需要知道某个资源何时被使用,那么您必须跟踪并管理它。

    您必须使用 API 同步函数来跟踪 GPU 对命令的执行。

    如果一个动作命令使用了一组资源,那么这些资源在该命令执行时正在使用。您拥有诸如事件之类的工具,可用于阻止后续命令执行,直到某些先前的命令完成为止。事件可以告知特定命令何时完成,以便您知道这些资源何时不再使用。

    信号量具有类似的能力,但在一批工作的水平上。如果发出信号量,则批处理中发出信号量的所有命令都已完成并且不再使用它们使用的资源。 Fences 可用于在提交命令级别进行极其粗略的同步。

    您使用多缓冲区统一数据,因为统一数据的性质通常需要更改每一帧。如果您有顶点缓冲区或图像来更改每一帧,那么您需要对它们执行相同的操作。

    对于不频繁的更改,您可能需要额外的可用内存,以便您可以创建新的图像或缓冲区,然后在内存不再使用时删除旧的。或者您可能不得不停止 CPU,直到 GPU 使用完这些资源。

    【讨论】:

      猜你喜欢
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多