草庐IT

c++ - Vulkan:延迟分配内存?

coder 2024-02-16 原文

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

不幸的是,似乎 VkPhysicalDeviceMemoryProperties 中的所有 VkMemoryType 条目(从 vkGetPhysicalDeviceMemoryProperties 返回)实际上都没有设置此功能位。此外,似乎没有任何 API 示例使用这些位。这是否只是驱动程序级别未实现的功能,驱动程序不支持此功能是否很常见?

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

最佳答案

延迟分配的内存对您没有帮助。或者至少,可能不会,这取决于您的场景。原因有两个。首先,除非您不使用深度进行渲染,否则您必须使用打包的深度/模板图像(因为您不允许使用单独的深度和模板缓冲区)。并且由于您(大概)不希望延迟分配深度部分,因此您别无选择,只能使用实际内存而不是延迟分配的内存。

其次,您正在做的不是延迟分配内存的目的。它不适用于旨在可选的渲染部分。它适用于本质上短暂的图像。

例如,考虑延迟渲染。你需要 g 缓冲区。但是您将在 g-buffer pass 期间填充它们,并且您将在 lighting pass(es) 期间消耗它们。在那之后,您将不会再使用他们的内容。

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

但是 Vulkan 要求图像在使用之前绑定(bind)内存。惰性内存的存在使您可以满足该要求,同时让实现知道您实际上不会使用此内存。或者更重要的是,只有在您执行需要它的操作时才会分配实际内存。

深度缓冲区和深度/模板缓冲区也可以延迟分配,只要您不需要像访问常规图像那样访问它们即可。但即便如此,它也不是一种让模板打印或深度测试成为可选项的方法。这是关于让他们的后备存储变得短暂,内存可以存在于 TBR 的区 block 中,而不是其他任何地方。你还在做手术;它只是不占用实际内存。

关于c++ - Vulkan:延迟分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36612147/

有关c++ - Vulkan:延迟分配内存?的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. Ruby Koans about_array_assignment - 非平行与平行分配歧视 - 2

    通过ruby​​koans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John

  4. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  5. ruby - 在 Ruby 中重新分配常量时抛出异常? - 2

    我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案

  6. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  7. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  8. ruby - 使对象的行为类似于 ruby​​ 中并行分配的数组 - 2

    假设您在Ruby中执行此操作:ar=[1,2]x,y=ar然后,x==1和y==2。是否有一种方法可以在我自己的类中定义,从而产生相同的效果?例如rb=AllYourCode.newx,y=rb到目前为止,对于这样的赋值,我所能做的就是使x==rb和y=nil。Python有这样一个特性:>>>classFoo:...def__iter__(self):...returniter([1,2])...>>>x,y=Foo()>>>x1>>>y2 最佳答案 是的。定义#to_ary。这将使您的对象被视为要分配的数组。irb>o=Obje

  9. 键删除后 ruby​​ 哈希内存泄漏 - 2

    你好,我无法成功如何在散列中删除key后释放内存。当我从哈希中删除键时,内存不会释放,也不会在手动调用GC.start后释放。当从Hash中删除键并且这些对象在某处泄漏时,这是预期的行为还是GC不释放内存?如何在Ruby中删除Hash中的键并在内存中取消分配它?例子:irb(main):001:0>`ps-orss=-p#{Process.pid}`.to_i=>4748irb(main):002:0>a={}=>{}irb(main):003:0>1000000.times{|i|a[i]="test#{i}"}=>1000000irb(main):004:0>`ps-orss=-p

  10. ruby-on-rails - 在所有延迟的作业之前 Hook - 2

    是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述

随机推荐