【问题标题】:Unity3D : Performance with multi-camera rendering with a lot of spheric meshesUnity3D:具有大量球面网格的多相机渲染的性能
【发布时间】:2016-06-15 01:52:24
【问题描述】:

我有一个 Unity 3D 场景,其中有多个摄像机看着同一个对象(一个巨大的大脑网格 ~ 100k tri),但没有必要以相同的视角。

在同一个 3D 场景中,有大量的球形图网格(从 100 到 30000)。

在所有相机中,我必须显示大脑网格和部分绘图网格。

根据相机视图,每个绘图可以有不同的大小(网格过滤器和球形对撞机)、不同的材料(不透明或透明),并且可以可见或不可见。 球形对撞机的大小必须与网格相同。

我为每个球形网格设置了一个共享网格。 它们的材质可以是我定义的几种共享材质之一。

在渲染场景之前,对于 OnPreCull 函数中的每个摄像机视图,我必须定义哪些图是可见的以及它们的外观。

这部分可能非常昂贵,我尝试了几件事:

  • 将游戏对象设置为非活动状态:成本太高
  • 将局部比例设置为 vector3(0,0,0):更好,但我可以看到渲染仍在分析器中完成
  • 设置完全透明的材质:结果相同,但在分析器中,渲染现在是透明的而不是不透明的
  • 在相机图层蒙版中设置图层:巨大的脚本成本

我不知道我是否可以制作一个高效的剔除系统,让所有这些相机都指向同一点...

我欢迎任何新想法。

【问题讨论】:

  • 嗨,你能解释一下什么是“球形网格”吗?请附上第二张和/或第三张图片,详细说明这些内容。请在游戏视图中显示一个特写,并在编辑器视图中显示一个。
  • 我对你为什么要进行剔除感到困惑:Unity 包含出色的剔除,无论如何都不可能编写更快的剔除。当然,在某些情况下,您必须“分解某些东西”。经典的例子是说你有一条 2 公里长的赛道。显然,您必须将其分解为 20 段 100m - 否则无论如何都会被绘制出来!但这不言而喻。一旦你将其分解,没有什么比 Unity 的剔除工作做得更好了。剔除引擎很棒。
  • 请注意,你提到了“碰撞器”,我看不出有任何理由在这个项目中使用碰撞器,如果我误解了,请解释一下。他们有什么目的?
  • 球体网格只是一个游戏对象,其生成的球体为 meshFilter,球体碰撞器的半径为 1。我必须能够单击每个球体以显示信息并执行一些操作投资回报率操作。
  • 我谈到了剔除,因为我怀疑我可以在分析器中看到很多渲染工作,而场景中没有可见的球体。 (添加图片)

标签: c# unity3d rendering


【解决方案1】:

第一期:

关于您的四个点的具体问题。

只需设置renderer.enabled = false,就可以了。

但是请注意,正如我在评论中提到的那样,您永远不会尝试在 Unity 中“挑剔自己”(除非我误解了您的描述)。


第二期:

关于小领域。我怀疑你在现场有很多人。你根本做不到。在视频游戏(所有 3D 工程中最困难的)中,您只需使用广告牌即可。这就是在场景中如何说“草”。您可以使用 Unity 中的粒子系统或其他技术很好地实现这一点。实现超出了此答案的范围,但您必须全面调查广告牌。简单地说,它是一个小的平面图像,在渲染过程中始终面向相机。


问题 2B:

不过请注意,球体碰撞器 非常棒,您可以根据需要使用任意多个。我敢肯定,从基本的数学原因来看,这是显而易见的。小贴士:人们通常会尝试“自己编写”,认为这样会更快。不可能超过100?在 PhysX 中进行了数人年的空间剔除科学研究,而且他们使用的是金属、gpu,所以你无法击败它。


问题三:

您是否有可能在项目的某处使用 mesh 对撞机?永远不要使用网格对撞机。 (Unity 中提到或使用它们非常令人困惑;它们只有一两个非常具体的有限用途。)


第四题:

我很困惑你为什么要打开和关闭东西。我有一个猜测。

我怀疑您没有使用多个“阶段”!

当您拥有多个摄像头时,视频游戏有一个惊人的技巧。事实上,你有“屏幕外”场景!所以你可能在地牢之类的地方有玩家。关闭“到一边”,您可能对其他相机有一个完全重复或三份的整个运行设置(如果相机转向错误的方向,您可以“看到它”)。 (在示例中,您将在分身、着色、地图样式或任何情况下具有不同的品质。)有时您制作一个完整的替身只是为了进行物理计算或解决其他问题。

Fascinating extreme example of that sort of thing.

简而言之,在您的情况下,

对于每个摄像机视图,您可能需要一个完整的摄像机“舞台”和大脑

同样,这可以是http://answers.unity3d.com/answers/299823/view.html,但这确实是日常用品。在你的整个场景中,你会看到八个快乐的大脑排成一排,每个人都有自己的相机。在每一个中,您都会显示任何相关的项目/角度等。 (显然,如果某些项目是“相同的,除了视角”,你可以使用“同一个大脑有多个摄像头”:但我不会那样做,最好每个视图都有一个大脑一个摄像头.)

我相信这可能是您遇到的根本问题!

【讨论】:

  • 我已经尝试过了,但是为每一帧启用和禁用渲染器 1 到 5 次(对于每个相机)需要很长时间。但感谢有关剔除的建议。
  • 我对你为什么要打开和关闭东西感到困惑 - 我有一个怀疑!您可能错过了 3D 工程中的主要技巧之一!我将在答案中解决这个问题。
  • 我认为因为网格很重,最好只有一个“舞台”,但现在多亏了你,这对我来说似乎无关紧要,但我认为我没有时间重新思考这部分。我还在为大脑使用网格对撞机(有时我需要单击一些三角形),但只有在需要时我才能轻松地用光线投射替换它(基本上我已经拥有了所有的东西,所有的c# 代码是我的 C++ DLL 几何库的包装器)。但是我没有考虑使用广告牌,我将对其进行调查。非常感谢您的宝贵时间!
  • (1) 这是我的荣幸 (2) 老实说,我可以向您保证,每台相机必须使用一个大脑。 绝对不会影响渲染性能。每个相机无论如何都在绘制 .. 你看到了吗?通过切换到多个大脑,您的性能提升将令人难以置信,例如快 100 倍。 (3) 如果你使用OnPreCull,有问题,你“不能”使用它。 (注意 - 错误的是你试图“改变场景 - 在摄像机之间!!!”你根本不能这样做。)(4)关于广告牌:是的,你实际上,简单,绝对有改为广告牌。
  • 一个小提示:您可能必须使用 Unity 中的“层”系统,以便更轻松地分离内容。
猜你喜欢
  • 2020-12-02
相关资源
最近更新 更多