Unity在空场景中占用了100%的CPU

5
为什么我们使用unity3d构建游戏场景时会占用100%的CPU?
我是说无论是有许多物体和事物的场景还是空场景,CPU使用率都是100%。
为什么?
如何减少CPU占用率?
我想要减少CPU使用率的原因是: 我想在专用服务器上运行多个exe文件,这些exe文件是我用unity UNET制作的多人游戏中的一部分,并且在这些场景中,除了一些函数和syncvars,我什么都没有 ... 我只想让这些exe文件占用更少的CPU来运行更好并提高性能。
减少CPU使用率是否可能?

你在Unity中创建了一个空场景的新项目,但是CPU占用率达到了100%? - FCin
1
你尝试过关掉电脑然后再重新启动吗? - Thalthanas
7个回答

8

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

如果我们不设置它,那么游戏将尝试以尽可能高的帧率运行,如果我们在批处理模式下运行它,则会占用所有 CPU 使用率。


7
关于CPU使用率。也许你所运行的唯一进程就是Unity场景,因此PC会将100%的CPU用于Unity,因为它不需要为其他“重型”应用程序分配资源(我猜测不是100%,因为系统必须运行其他必要的进程)。如果你运行两个场景,那么每个场景大约为50%...
此外,为了使您的场景更加高效,您可以尝试以下方法来提高游戏效率。可能还有更多方法,您可能无法应用所有方法,但您可以将它们视为起点:
1- 静态批处理
您的场景中可能有大量静态几何体,例如墙壁、椅子、灯光和永远不移动的网格。在编辑器中将它们标记为静态。务必将它们标记为Lightmap静态,以获取烘焙的光照贴图纹理。静态对象可以被合并成一个组合网格,而不是为每个单独的对象产生绘制调用。静态批处理具有一个至关重要的要求:所有对象必须使用相同的材料。如果您有带木材材料的静态墙壁和带钢材材料的静态椅子,则墙壁将与一个组合网格合并为一个绘制调用,而椅子则在单独的绘制调用中与自己的单独网格在一起。
2- 纹理图集
如前所述,每种材料都会产生一个绘制调用。您可能会认为木门和钢椅需要分别使用不同的材料,因为它们使用不同的纹理。然而,如果它们可以使用相同的着色器,则可以使用纹理图集来创建两个对象都可以使用的一个材质。纹理图集只是包含所有小纹理的更大纹理。您可以将每个对象映射到图集上不同坐标使用的一个纹理。您可以在艺术流程中手动执行此操作,但我发现Juan Sebastian的Pro Draw Call Optimizer非常有用。它会自动生成纹理图集并在不影响资产的情况下交换新对象。
3- 动态批处理
移动非静态对象可以动态批处理为单个绘制调用。我注意到这对CPU资源密集型,并且在每个帧上计算,但是这是一种不错的优化。这仅适用于具有少于900个顶点并使用相同材料的对象。使用纹理图集为您的动态对象创建单个材质,您就可以获得便宜的动态批处理!
4- LOD(细节层次)
LOD组是提高性能的简单方法。使用具有多个LOD的资产,并为相机远离的对象呈现较低详细度的几何体。随着相机越来越接近,Unity可以自动在每个LOD之间淡化。
5- 填充率,过度绘制和剔除
这让我谈到一个我不太熟悉但值得关注的话题:减少过度绘制,即先绘制最远的像素,然后逐层重绘覆盖前面的物体。这在普通的1080p PC显示器上不是什么问题,但对于VR和移动设备等具有超高分辨率显示屏幕的设备来说是个显著的问题。过多的过度绘制加上更多的像素会降低您的填充率。纹理滤波是GPU中关键的限制指标之一。遮挡剔除和视锥剔除提供了一些内置的解决方案。视锥剔除不会渲染相机视锥体外的对象。没有必要渲染看不到的对象!遮挡剔除可以消除被其它对象遮挡的对象。例如,房门后面的房间可以完全剔除。默认情况下,遮挡剔除适用于整个场景,但适当的关卡设计可以使您剔除游戏的整个部分。
LOD组也可以剔除距场景太远的对象,进一步帮助最小化填充率。
如果您的游戏涉及玩家从一个房间到另一个房间,在一个关卡中放置整个游戏是一个天真的解决方案。然而,缺点是内存占用。每个房间中的每个对象和材质都被加载到内存中,即使它们不可见。将每个房间放入单独的关卡中,并在代码中智能异步加载它们。
在玩家接近下一个房间的门之前,加载下一个关卡。不要使用Application.LoadLevel()同步加载,因为这会导致您的游戏在加载时挂起。由于头部跟踪会短暂停止,这将导致恶心并对玩家产生可怕的体验。相反,使用Application.LoadLevelAsync()。您可以在Oculus Mobile SDK BlockSplosion示例中找到此示例,在StartupSample.cs中。
关闭实时阴影!接收动态阴影的物体将不会被批处理,您将遭受严重的绘制调用惩罚。在PC上,您可以使用单个实时定向光线获得漂亮的动态阴影。大多数现代PC可以提供华丽的像素级阴影。但是,在移动设备上,您需要坚持烘焙照明和没有实时阴影。使用硬阴影和软阴影以非常高的分辨率烘焙您的照明。
特别是对于具有出色性能的移动体验,可以回到旧技巧,为3D对象上的阴影模拟半逼真的阴影。您可以在对象下面放置一个简单的2D平面,带有模糊的阴影纹理。
当使用烘焙照明时,您的动态对象看起来不协调,而静态对象看起来很棒。您可以使用光探针便宜地模拟动态对象上的动态照明。

光探针是烘焙的立方贴图,存储了场景中各个点处的直接、间接甚至自发光信息。当动态物体移动时,它会插值附近光探针的样本,以近似该位置的照明。这是在不使用昂贵实时光源的情况下,模拟动态物体上逼真照明的廉价方法。

11- 避免使用透明和多材质对象

像玻璃透明窗户之类使用透明着色器的对象非常昂贵。有一个普遍的做法是通过使用带有灰尘或锈迹纹理的透明材质以及单独的基础漫反射材质来增加墙壁的真实感。这种多材质α混合很昂贵;每个材质都会添加一个绘制调用!请注意,多个纹理不是问题;使用多个单独的材质是昂贵的。使用一个材质和一个能够使用α混合融合多个纹理而不是多个单独材质的着色器。

12- 换装网格渲染器

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

不幸的消息是:换装网格渲染器不能批处理。您场景中的每个角色可以为每个眼睛创建多个绘制调用。我还不确定如何解决这个问题。

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


5

没有足够的数据帮助您跟踪问题所在,因为它可能由很多原因引起。尝试使用Unity Profiler来追踪导致CPU升高的原因。

Unity Profiler

首先要使用Unity Profiler。这是Unity内置的工具,可以让您检查应用程序的哪个部分正在使用什么资源,以及使用的强度和长度。

如果您转到“窗口”>“Profiler”,您将看到“CPU使用率”,以及细分的子类别和可视化CPU使用率的图形。您可以单击图形中的任何位置,以概述该帧中的所有CPU使用情况。

概述屏幕显示了大量信息,您需要查看的第一个信息是“总数”和“时间ms”。总数是CPU使用的百分比总量。时间是花费的时间(以毫秒为单位)。

使用这些数据找出占用您所有CPU的脚本/操作,并从那里开始优化。

有关Unity CPU Profiler的更多信息,请单击此处


1
当我说我的场景中什么都没有,它是空的时候,使用分析器与否都没有意义! - iman_sh
@iman_sh,你自相矛盾。你的场景中是否包含脚本或者是一个空场景? - Bizhan
@Bijan,我的场景中唯一的游戏对象是一个空对象,它有一个简单的脚本,没有任何更新。 - iman_sh
@iman_sh 只需查看分析器即可。如果分析器没有指示高CPU使用率,则可能是Unity的错误,您应该向Unity支持报告,或者您的硬件/操作系统/Unity安装存在问题。 - Bizhan

1
在Unity中运行场景时,只有当对象在相机可见时才会呈现。Unity自动降低其渲染场景时的CPU需求。当然也有一些例外情况,但Unity足够智能以减少不必要的CPU使用率。
你在这里遇到的问题可能由多种因素引起,每个因素都有自己的解决方案,没有通用的解决方案。例如,可能是你有多个具有巨大纹理的游戏对象,或者你正在渲染一个使用后处理包的场景(这需要大量内存/CPU)。或者可能是你的计算机性能不足,而你的目标受众不会有这个问题。

我在批处理模式下运行EXE文件,但我的场景中什么也没有!但无论我在强大的系统还是弱小的系统上运行它,在两种情况下CPU使用率始终为99或100%。 - iman_sh
如果你在一台性能较弱的系统和一台性能强大的系统上运行,而CPU使用率在场景中没有任何脚本或任何游戏对象的情况下达到99-100%,那么这是一个错误,你应该向Unity报告。@iman_sh - AresCaelum

0

重启电脑 对我有用。

100% CPU 使用率(i5-9400),空场景在空2D项目中。


0

你可能有很多静态对象。对我来说,它是一个静态的地球人,但是在取消静态框后,一切都变得正常了。


0
补充之前的优秀回答。 GPU实例化可以提高性能并卸载CPU的工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接