位于摄像机视线之外的游戏对象会消耗Unity中的计算机/移动资源吗?


11

团结起来,让我们假设我的场景中有一些游戏对象对摄像机不可见,因此在游戏运行时不会渲染。

游戏运行时,这些游戏对象会消耗计算机/移动资源吗?

在哪里可以找到有关此类用法的详细信息?

Answers:


13

您需要的是Unity确实具有的内存分析器。此处:http//docs.unity3d.com/Manual/ProfilerMemory.html

但是您的假设基本上是正确的,如果游戏对象在相机中不可见,则不会绘制游戏对象,并且它使用的资源较少,但仍然必须消耗一些资源。gameObject仍然存在于内存中,包括所有纹理,模型脚本等。它还通过Update和FixedUpdate方法(以及此处介绍的其他各种方法)仍然消耗CPU时间。

但是通常最主要的减慢是绘图,需要使用少量的CPU时间来确定对象是否在相机视锥范围内(边界),但是没有完成绘图。


5

我认为您还应该了解有关“平截头剔除”或“隐藏表面去除”的信息:http : //en.wikipedia.org/wiki/Hidden_​​surface_determination

这是优化游戏的重要环节,因为即使您的对象不在给定帧的视锥范围内(即可见),也会为它们启动一些绘制调用(着色器),从而降低性能。


2
@ Gissipi_453,在沿着这些思路进行研究的同时,还研究了四叉树和八叉树(空间数据排序)
Jon

3

简短的回答是“是”。任何准备在游戏中使用的东西都会占用内存。

要考虑的另一件事是帧速率的成本:

分别绘制的5个具有5个单独纹理的对象需要在它们之间进行状态更改。您可以通过卸载未使用的纹理来节省一些内存。

通过将所有单独的纹理加载到单个图集纹理中,内存占用空间变得固定,您将无法再卸载单个纹理。创建完成后,只需将地图集绑定一次即可绘制所有对象。

另一个示例是简单的顶点和索引缓冲区。如果许多点经常在可见和不可见之间切换,则将“陈旧”的点保留在顶点缓冲区中并仅上载新的索引缓冲区会更快。

在许多其他情况下,增加前期存储成本比许多状态更改更为可取。

如果旋转相机,除非您知道,否则绝对不会销毁那些物体,否则该相机不会旋转回去检查该物体。” –卡图

以侧面滚动条为例,如果您只能向右移动(地图仅向左滚动),则从屏幕左侧滚动的任何对象都可以永久卸载,因为您将不再使用它。此外,可以在对象从右侧滚动到视图之前立即加载对象的内容。


1

很多答案主要是考虑问题的图形方面。

事实是它们将占用各种资源,与绘制对象相比它们的成本是不确定的。它并没有像某些答案所暗示的那样使您的组件进行比绘制更昂贵的操作,但是您可以最大程度地减少它们使用的资源量。还请记住,GameObject占用少量内存,组件也是如此。这些组件也可能正在做占用大量内存的事情。

最小化屏幕外组件影响的最简单方法是基于OnBecameVisibleOnBecameInvisible回调的系统。

void OnBecameVisible()
{
    myComplexComponent.enabled = true;
}
void OnBecameInvisble()
{
    myComplexComponent.enabled = false;
}

当然,这种方法的用途非常有限,因为很多时候您会希望屏幕外的对象影响游戏。但是,您可以在这种模式下扩展一个细粒度的系统,该系统能够最大程度地减少最昂贵的计算的影响。即使只是一些简单的操作(例如,当对象不在屏幕上时降低脚本后面的路径质量),从长远来看也可以节省大量费用。


1

它需要内存来保持活动状态并更新其位置和其他属性。

但是由于它不可见,因此不会消耗计算机/移动图形资源。

因此,是的,它确实消耗了内存资源,但不像可见的游戏对象那样消耗图形资源。


非常感谢。这是我一直在寻找的非常直接的答案。
Gissipi_453

0

程序中的任何东西都会消耗资源。您不认为程序仅基于希望和梦想,对吗?

问题应该是游戏对象消耗多少资源,为此,我认为这是一个非常可靠的答案:http : //answers.unity3d.com/questions/280455/how-much-memory-a-gameobject-消耗.html

简而言之,他们自己消耗微不足道的资源。但是,为什么您只想让一堆游戏对象什么也不做呢?归根结底,您实际上要使这些游戏对象“做什么”,这将导致任何类型的开销,并且视情况而定需要多少资源。


非常感谢你。那么,在游戏运行时,我应该销毁那些看不见的物体吗?
Gissipi_453

1
我认为此答案实际上并没有真正尝试回答您的问题,因此这是完全错误的。如果旋转相机,除非您知道,否则相机绝对不会销毁那些物体,也不会旋转回去检查该物体。游戏世界存在,并且AI的移动,灯光会影响环境,即使您没有看到这些环境也是如此。
卡图2015年

@Katu,那也很重要。谢谢。除非根本不需要渲染该对象,否则我不应该销毁它。
Gissipi_453 2015年

@Katu我确实回答了这个问题:“在运行游戏时,这些游戏对象(我的场景中的对象对摄像机不可见)会消耗计算机/移动资源吗?” 答案是:“是的。程序中的任何东西都会消耗资源”。然后,我继续解释了空游戏对象在场景中的影响以及资源成本。
返回真实

2
@ Gissipi_453要回答您的问题,这完全取决于场景中游戏对象的实际行为,创建/删除游戏对象的频率以及其他注意事项。知道何时进行优化本身就是一项技能,但是经验法则是不必担心,除非有什么需要担心的。多余的游戏对象的开销几乎没有,所以不用担心。在某些情况下,如果要频繁添加/删除对象,则对象池可以节省生命,而在其他情况下,您可以使用其他技巧。这完全取决于是否存在问题以及确切的问题是什么。
返回true
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.