繁体   English   中英

Vulkan:懒惰分配内存?

[英]Vulkan: lazily allocated memory?

我有一种情况,我可能需要在渲染过程中使用模板缓冲区,但是,直到执行渲染过程中途我都不会“知道”。 不幸的是,一旦渲染过程正在进行中,Vulkan就无法修改帧缓冲的附件(如D3D12)。 然而,我在规范中发现,有概念“懒洋洋地分配内存”使用VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT分配内存时,并VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT的表面。

不幸的是,似乎没有任何的VkMemoryType条目VkPhysicalDeviceMemoryProperties (从返回vkGetPhysicalDeviceMemoryProperties )居然有这种功能位设置。 此外,似乎没有API样本使用这些位。 这只是驱动程序级别的一个未实现的功能,并且驱动程序通常不支持此功能吗?

我使用的是Vulkan SDK 1.0.5,Nvidia驱动程序356.45。

懒惰分配的内存对你没有帮助。 或者至少,可能不是,取决于你的场景。 原因有两方面。 首先,除非你没有深度渲染,否则你必须使用打包的深度/模板图像(因为你不允许有单独的深度和模板缓冲区)。 而且由于你(大概)不希望深度部分被懒惰地分配,你没有办法,只能使用实际的记忆而不是懒惰分配的记忆。

其次,你正在做的不是懒惰分配的内存。 它不是用于渲染的部分是可选的。 这是因为他们的本性短暂的图像。

例如,考虑延迟渲染。 你需要g-buffers。 但是你要在g-buffer传递期间填充它们,并且你将在光照传递期间消耗它们。 在那之后,您将不再使用他们的内容。

对于许多渲染器来说,这并不重要。 但是使用基于图块的渲染器,它可以。 为什么? 因为如果一个tile大到足以同时存储所有g-buffer数据,那么实现实际上并不需要将g-buffer数据写入内存。 它可以将所有内容保留在磁贴内存中,在磁贴内执行光照传递( 它们作为输入附件读取),然后忘记它们存在。

但是Vulkan要求图像在使用之前有内存绑定它们。 存在惰性内存,以便您可以满足该要求,同时让实现知道您实际上不会使用此内存。 或者更重要的是,只有在你做了需要它的事情时才会分配实际内存。

深度缓冲区和深度/模板缓冲区也可能被懒惰地分配,只要您不需要像常规图像那样访问它们。 但即便如此,这也不是一种可以选择模板印刷或深度测试的方法。 这是关于使他们的后备存储短暂存在,内存可以存在于TBR的区块内,而不是其他地方。 你还在做手术; 它只是没有占用实际的记忆。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM