Unity 在空场景中占用 100% CPU

Unity takes 100% CPU in an empty scene

为什么当我们使用 unity3d 构建游戏场景时它会使用 100% CPU?!

我的意思是这与有很多物体和事物的场景或空场景无关,在这两种情况下CPU使用率都是 100%。

为什么?

我怎样才能减少它?

我想减少 CPU 使用的原因是: 我想 运行 在一个专用服务器中 exe 用于我用 unity UNET 制作的多人游戏,在这个场景中,除了一些功能我什么都没有 syncvars 甚至我没有更新功能... 我只是想让这个 exe 文件使用更少 CPU 以 运行 更好并提高性能。

是否可以减少 CPU 使用量?

当 运行 Unity 中的场景时,对象仅在它们在相机中可见时才被渲染。渲染场景时,Unity 会自动减少其 CPU 需求。当然也有一些例外,但 Unity 足够智能,可以减少不必要的 cpu 使用。 您这里的问题可能是多种因素造成的,每个因素都有自己的解决方案。没有通用的。例如,可能是您有多个具有巨大纹理的游戏对象,或者您正在使用 post-process 包渲染场景(即 memory/cpu 消耗)。或者可能是您的计算机不够强大,而您的目标受众不会有这个问题

没有足够的数据来帮助您找出问题所在,这可能是由多种原因引起的。尝试使用 unity profiler 来追踪是什么让你的 CPU 飙升

Unity 分析器

从使用统一分析器开始。这是 Unity 的内置工具,可让您检查应用程序的哪一部分正在使用什么资源、它的强度以及它的使用时间。

如果您转到 window > Profiler,您将看到 "CPU usage",分为更小的子类别和一个可视化 cpu 用法的图表。您可以单击图表中的任意位置以概览该框架内的所有 cpu 用法。

概览屏幕显示了很多信息,您首先要查看的是 "total" 和 "time ms"。总计是使用的 CPU 的总量百分比。时间是以毫秒为单位的时间。

使用此数据找出 script/action 占用了您所有 CPU 的内容,然后从那里开始优化。

可以找到有关 unity 的 CPU 分析器的更多信息 here

关于 CPU 用法。可能你唯一运行ning的进程是Unity Scene,所以PC使用100%的CPU给Unity,因为它不需要为其他[=99分配资源=] 应用程序(我猜不是 100%,因为系统的其他必要进程也必须 运行ning)。我想如果你 运行 两个场景,每个场景大约 50%...

除此之外,为了让你的场景更有效率,你可以尝试这些东西来让你的游戏更有效率。可能还有更多,您可能不会应用所有这些。但您可以将它们作为起点考虑在内:

1-静态批处理

您的场景中可能有大量静态几何体,例如永不移动的墙壁、椅子、灯光和网格物体。在编辑器中将它们标记为静态。请务必将它们标记为静态光照贴图,以便获得烘焙的光照贴图纹理。标记为静态的 object 可以批处理到一个组合网格中,而不是对每个单独的 object 进行绘制调用。静态批处理有一个关键要求:所有 object 必须使用相同的 material。如果您有带木头的静态墙 material 和带钢的静态椅子 material,墙壁将被分批放入一个带有一个组合网格的绘图调用中,而椅子则在一个单独的绘图调用中,它们的拥有独立的网格。

2-纹理图集

如前所述,每个 material 都会引发一次绘图调用。您可能会认为木门和钢椅可能需要单独的 material,因为它们使用不同的纹理。但是,如果它们可以使用相同的着色器,您可以使用纹理图集来创建一个 material,两个 object 都可以使用。纹理图集只是一个较大的纹理,其中包含所有较小的纹理。您可以让一个 material 仅加载一个纹理,而不是数十个 material 加载数十个纹理。每个 object 都可以映射到使用图集上不同坐标上的纹理。您可以在您的美术管道中手动执行此操作,但我发现 Juan Sebastian 的 Pro Draw Call Optimizer 非常有用。它会自动生成纹理图集并在新的 object 中进行交换,而不会弄乱您的资产。

3-动态批处理

移动 non-static object 可以动态批处理到单个绘制调用中。我注意到这是 CPU 密集的,并且是在每一帧上计算的,但这是一个很好的优化。这仅适用于使用相同 material 的顶点少于 900 个的 object。使用纹理图集为您的动态 object 创建单个 material,您可以获得廉价的动态批处理!

4-LOD

LOD 组是提高性能的一种廉价方法。使用具有多个 LOD 的资产并渲染​​ lower-detail 几何体 objects 远离相机。当相机靠近时,Unity 可以在每个 LOD 之间自动淡入淡出。

5- 填充率、透支和剔除

这涉及到一个我不太熟悉但值得关注的主题:减少透支,其中最远的 object 会首先绘制到一个像素,每靠近一个像素就会重绘该像素 object 随后置顶。这在普通的 1080p PC 显示器上不是什么大问题,但对于具有 ultra-high 分辨率显示器的 VR 和移动设备来说是个大问题。大量的透支加上大量的像素会扼杀你的填充率。纹理过滤是 GPU 中的关键限制指标之一。一些解决方案开箱即用,包括遮挡剔除和视锥体剔除。视锥体剔除不会渲染相机视锥体之外的 objects。没必要渲染 objects 你看不到!遮挡剔除去除了被前面其他 object 遮挡的 object。例如,门后的房间可以完全排除在外。默认情况下,遮挡剔除适用于整个场景,但适当的关卡设计将允许您剔除游戏的整个关卡。

LOD 组还可以剔除离场景太远的 objects,进一步帮助最小化填充率。

6-关卡设计

如果您的游戏涉及玩家从一个房间到另一个房间的旅行,则天真的解决方案将整个游戏放在一个关卡中。然而,缺点是内存消耗。每个房间中的每个 object 和 material 都被加载到内存中,即使它们不可见。将每个房间放到一个单独的关卡中,并在代码中智能地异步加载它们。

7-异步加载

在玩家接近下一个房间的门之前,加载下一个关卡。不要使用 Application.LoadLevel() 同步加载它,因为这会导致您的游戏在加载时挂起。由于头部跟踪会瞬间卡住,这会导致恶心,这对玩家来说是一种可怕的体验。

改为使用 Application.LoadLevelAsync()。您可以在 Oculus Mobile SDK BlockSplosion 示例中找到这方面的示例e、StartupSample.cs

8-烘焙光照

关闭实时阴影! Objects 接收动态阴影的不会被批处理,并且你会招致严重的绘制调用惩罚。

在 PC 上,您可以使用单个实时定向光来获得漂亮的动态阴影。大多数现代 PC 都可以提供华丽的 per-pixel 阴影效果。但是在移动设备上,您希望坚持使用烘焙光照并且没有实时阴影。在非常高分辨率下使用硬阴影和软阴影烘烤您的照明。

9- 阴影

特别是对于高性能的移动体验,跳回到 3D objects 阴影的旧技巧。 Semi-realistic 阴影可以用一个简单的 2D 四边形在你的 object 下用模糊的阴影纹理模拟。

10- 光照探针

当您使用烘焙光照时,动态 object 看起来格格不入,而静态 object 看起来很棒。您可以使用光照探测器在动态 objects.

上廉价地模拟动态光照

光照探测器是烘焙的立方体贴图,用于存储场景中不同点的直接、间接甚至发射光的信息。随着动态 object 的移动,它会插入附近光探测器的样本以近似于该特定位置的照明。这是一种在动态 object 上模拟真实光照的廉价方法,无需使用昂贵的实时光照。

11-避免透明和multi-materialobjects

Objects 像使用透明着色器的玻璃 see-through windows 非常昂贵。通过使用带有灰尘或铁锈纹理的透明 material 以及单独的基础漫反射 material,为墙壁添加真实感是一种常见的做法。这种 multi-material alpha 混合很昂贵;每个 material 添加一个绘图调用!但是请注意,多个纹理不是问题;使用多个单独的 material 是昂贵的。使用一个 material 和一个可以将多个纹理与 alpha 混合而不是多个单独的 material 混合的着色器。

12-蒙皮网格渲染器

蒙皮网格渲染器通常用于具有动画装备的角色,使用物理(布娃娃身体)或自定义动画(行走、跳跃等)实现逼真的网格变形。

不幸的消息:蒙皮网格渲染器没有批处理。场景中的每个角色每只眼睛都可以创建多个绘制调用。我还不确定如何解决这个问题。

来源:https://blog.bigscreenvr.com/12-performance-tricks-for-optimizing-vr-apps-in-unity-5-9849bb6aefa7

我找到了解决方案。只是因为我没有在我的脚本中预设 targetframerate...

如果我们不设置它,那么游戏会尝试 运行 最高帧率,如果我们 运行 它在批处理模式下,那么它将占用所有CPU 用法。

添加到以前的精彩答案中。 GPU 实例化 可以提高性能并从 CPU 卸载工作。

重新启动计算机对我有用。

100% CPU 在空二维项目中使用 (i5-9400) 空场景。

您可能有很多静态对象。对我来说这是一个静态的泰拉瑞安,但在取消选中静态框后,一切都变得正常了。