对所有事物都使用实例化?


16

一次渲染同一网格的多个(成千上万个)副本时,实例化可以显着提高性能。但是,一次绘制一次绘制一个副本就需要多少开销呢?将实例化用于引擎渲染的所有几何体是好事还是坏事?

编辑:假设我们正在创建FPS游戏。大多数物体只有一个实例:刀,枪,机枪,建筑物和无线电塔。但是也有一些具有多个实例的对象:树(例如,具有数百个实例的3种树),草等等……我的意思是:不是以“传统”方式渲染单实例对象,而是使用树和草使用实例化,我们使用实例化渲染它们。因此,我们的无线电塔只有一个实例(我们将其信息存储在实例数据缓冲区中),并且我们使用某种DrawInstanced()实例计数等于的调用来渲染该无线电塔1。与所有其他对象相同(当然,树木和草具有多个实例)。

所以我的问题是:使用实例化绘制对象的单个实例是一个坏主意吗?实例化是否有过多的开销(在内存和性能方面),还是以某种方式不希望呈现单实例对象?

Answers:


19

在带有XPDM的D3D9下,您几乎肯定希望尽可能地实例化。抽奖电话的开销是如此之高,以至于很有道理。在那种情况下,交叉点可以低至2或3个实例。

如果只有给定网格的一个实例,则在表面上似乎很容易将其绘制为非实例。但是,请查看其中涉及的内容:

  • 您需要从将数据加载到每个实例的缓冲区切换为上传着色器常量。
  • 您需要保留两个顶点着色器副本:一个用于实例化,一个用于非实例化。
  • 您需要保留渲染代码的两个副本:同样。
  • 您需要切换着色器。
  • 您需要切换顶点格式。
  • 您可能需要切换顶点缓冲区。
  • 然后,如果要返回到下一组网格的实例化图,则需要重新做一遍。

即使您只有一个网格(例如FPS中的枪模型),在某些情况下实例化还是有用的。假设您正在使用正向渲染器和z-prepass进行多程光累积。您无需为每个灯光添加额外的遍历,而是可以针对每个实例创建灯光并实例化它。

根据第一种情况,故事的寓意是,如果任何对象类都可以完全使用实例化,则对于该类的所有对象始终使用实例化是有意义的。

根据第二种情况,这个故事的寓意是,实例化可以具有非显而易见的用途,而不仅仅是说“我需要画20棵树”。


您给出的原因与使我首先提出这个问题的原因完全相同。谢谢。
NPS

12

(在我的系统上,没有在其他任何地方进行测试)在GL中,实例化单个网格(以count = 1绘制)会产生一些令人讨厌的开销,但我不知道它从哪里来。我强烈建议您不要这样做。

几个月前,我在实际应用中对其进行了测试。我在Crytek Sponza场景中编码了一些全局照明算法,该算法由大约350个左右的网格组成(不记得确切),其中几个共享少数实例。一开始,我按照您的建议进行操作,只是实例化所有内容,并以实例数为1绘制其余部分,因为这样可以稍微简化渲染代码。

稍后在优化渲染器时,只需从实例化count = 1个对象切换回以常规方式提交它们,就可以在i7 3770k(和GTX 770)上每帧节省大约3.5毫秒的时间。将具有多个实例的网格切换为仅使用传统方法即可完成操作又为我节省了0.5毫秒。总体而言,应用程序从约120 FPS增至约230 FPS。

这些数字当然总是取决于您的应用程序中的瓶颈所在,而后0.5ms实际上可能会在您受到抽签限制的应用程序中变慢。但是否则,根据我的经验,如果您不立即绘制很多东西,实例化会带来一些麻烦的开销。


有趣,但是也很高兴看到AMD和Intel驱动程序的数据,否则,您确实应该说“在我的系统上”而不是“在GL中”。另一方面,即使它不是其他实现的问题,它可能存在于某些实现上的事实也足以避免在不使用它的情况下实例化。
bcrist 2014年

2

可以确定,绘制单个实例实例比正常绘制单个对象要贵。为了实例化,GPU正在为大量对象做准备,并且此准备工作将与为单个对象准备的工作有所不同。但是,只有通过实验才能发现此性能差距有多大,并且很大程度上取决于您的实际渲染设置。唯一可以确定的方法是自己测试。很难对一个抽签进行基准测试,是有关如何进行的一些想法。


2

已有4年的历史了...我可以肯定地说,用1提交“实例化”绘制调用是完全可以的。您可能已经注意到,新API DX12Vk的实例计数都可以从0到NUM_INSTANCES个。另请注意,没有DrawIndexed(...)

编辑

请注意,以上内容对于这种现代API可能还不错,也许使用诸如Gl <3.3或DX11之类的旧内容就需要其他用户提到的一些概要分析。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.