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

问题描述 投票:-1回答:4

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

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

为什么?

我怎样才能减少它?

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

这可能会降低CPU使用率吗?

performance unity3d exe cpu cpu-usage
4个回答
5
投票

关于CPU使用率。可能是您运行的唯一进程是Unity Scene,因此PC使用100%的CPU用于Unity,因为它不需要为其他“繁重”的应用程序分配资源(我猜不是100%,因为其他必须运行系统的必要过程)。我想如果你运行两个场景,每个场景大约50%......

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

1-静态批处理

您的场景中可能有大量的静态几何体,例如墙壁,椅子,灯光和永不移动的网格。在编辑器中将它们标记为静态。请务必将它们标记为lightmap static,以获得烘焙的光照贴图纹理。标记为静态的对象可以被批处理为一个组合网格,而不是对每个单独的对象进行绘制调用。静态批处理有一个至关重要的要求:所有对象必须使用相同的材​​料。如果你有带木质材料的静态墙壁和带有钢质材料的静态椅子,那么墙壁将被分成一个绘图调用,其中一个组合网格,并且椅子在单独的绘图调用中,具有它们自己的单独网格。

2-纹理图谱

如前所述,每种材料都会产生一次平局调用。您可能会认为木门和钢椅可能需要单独的材料,因为它们使用单​​独的纹理。但是,如果它们可以使用相同的着色器,则可以使用纹理图集来创建两个对象都可以使用的材质。纹理图集只是一个更大的纹理,包括所有较小的纹理。而不是几十种材料加载数十种纹理,你可以让一种材料只加载一种纹理。可以映射每个对象以在图集上的不同坐标上使用纹理。您可以在艺术流程中手动执行此操作,但我发现Juan Sebastian的Pro Draw Call Optimizer非常有用。它会自动生成新对象中的纹理图集和交换,而不会弄乱您的资产。

3-动态批处理

移动的非静态对象可以动态地分批到单个绘制调用中。我注意到这是CPU密集型并且在每个帧上计算,但是是一个很好的优化。这仅适用于使用相同材质的顶点数少于900的对象。使用纹理图集为您的动态对象创建单一材质,您可以获得便宜的动态批处理!

4- LOD

LOD组是提高性能的廉价方法。使用具有多个LOD的资源,并为远离相机的对象渲染较低细节的几何体。当相机接近时,Unity可以在每个LOD之间自动淡出。

5-填充,透支和剔除

这得到了一个我不太熟悉的话题,但值得关注:减少过度绘制,首先将最远的对象绘制到像素,然后将每个更近的对象重新绘制在顶部。这对于普通的1080p PC显示器来说不是什么大问题,但对于具有超高分辨率显示器的VR和移动设备来说这是一个重大问题。大量的透支与较大数量的像素相结合会导致填充率下降。纹理滤波是GPU中的关键限制指标之一。一些解决方案是开箱即用的,具有遮挡剔除和平截头体剔除。 Frustum剔除不会渲染摄像机截头锥体外的物体。没有点你无法看到的渲染对象!遮挡剔除会消除被其前面的其他对象遮挡的对象。例如,门后面的房间可以完全省去。默认情况下,遮挡剔除适用于整个场景,但适当的关卡设计将允许您剔除整个游戏关卡。

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

6-级设计

如果你的游戏涉及一个玩家从一个房间到另一个房间旅行,那么天真的解决方案将整个游戏都放在一个级别。然而,缺点是内存消耗。每个房间中的每个对象和材料都会加载到内存中,即使它们不可见。将每个房间放入一个单独的级别,并在代码中智能地异步加载它们。

7-异步加载

在玩家进入下一个房间的门之前,加载下一个级别。不要使用Application.LoadLevel()同步加载它,因为这会导致游戏在加载时挂起。随着头部追踪瞬间抓住,这将导致恶心并且对于玩家来说是一种可怕的体验。

而是使用Application.LoadLevelAsync()。您可以在StartupSample.cs下的Oculus Mobile SDK BlockSplosion示例中找到此示例

8-烤灯

关掉实时阴影!接收动态阴影的对象将不会被批处理,并且您将遭受严重的绘制调用惩罚。

在PC上,你可以使用单个实时定向灯来获得漂亮的动态阴影。大多数现代PC都可以提供华丽的每像素阴影。然而,在移动设备上,您希望坚持烘焙照明,而不是实时阴影。使用高分辨率的硬阴影和柔和阴影烘焙您的灯光。

9-阴影

特别是对于高性能的移动体验,跳回3D对象上的阴影的旧技巧。可以使用物体下方的简单2D四边形模拟半真实阴影,并使用模糊的阴影纹理。

10-光探针

使用烘焙照明时,动态对象看起来不合适,而静态对象看起来很棒。您可以使用光探针以便宜的方式模拟动态对象上的动态光照。

光探针是烘焙立方体贴图,可在场景中的各个点存储有关直接,间接甚至自发光的信息。当动态对象移动时,它会插入附近光探测器的样本,以近似该特定位置的光照。这是一种在不使用昂贵的实时灯光的情况下模拟动态物体上的真实照明的便宜方式。

11-避免透明和多物质对象

使用透明着色器的玻璃透视窗等物体非常昂贵。通常使用具有灰尘或铁锈纹理的透明材料以及单独的基础漫射材料来为墙壁添加真实感。这种多材料α混合是昂贵的;每种材料都会增加一个平局!但请注意,多个纹理不是问题;使用多种单独的材料是昂贵的。使用一种材质和一种着色器可以将多个纹理与Alpha混合而不是多个单独的材质混合在一起。

12-蒙皮网格渲染器

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

悲伤的消息:剥皮的网状渲染器不会被批量处理。场景中的每个角色都可以为每只眼睛创建多个绘制调用。我不知道如何解决这个问题。

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


3
投票

没有足够的数据来帮助您找出问题所在,而且可能是由很多事情引起的。尝试使用unity profiler来追踪CPU峰值的原因

Unity探查器

首先使用unity profiler。这是Unity的一个内置工具,它允许您检查应用程序的哪个部分正在使用什么资源,它的集成以及它的使用长度。

如果你转到窗口> Profiler,你会看到“CPU使用率”,分为较小的子类别和图形来可视化CPU使用率。您可以单击图表中的任意位置以获取该框架内所有cpu使用情况的概述。

概览屏幕显示了很多信息,第一个你想要看的是“总数”和“时间毫秒”。总计是以百分比表示的CPU总量。时间是以毫秒为单位的时间。

使用此数据可以查找哪些脚本/操作占用了所有CPU并从那里开始优化。

更多关于Unity的CPU分析器可以找到here


3
投票

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

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


1
投票

在Unity中运行场景时,只有在摄像机中可见对象时才会渲染对象。 Unity在渲染场景时会自动降低其CPU需求。当然有一些例外,但Unity足够智能,可以减少不必要的CPU使用率。这里的问题可能是由多种因素造成的,每个因素都有自己的解决方案。没有普遍的。例如,可能是您有多个具有巨大纹理的游戏对象,或者您正在使用后处理包(即内存/ CPU消耗)渲染场景。或者可能是您的计算机不够强大,而且您的目标受众不会遇到这个问题


0
投票

添加到以前的好答案。 GPU Instancing可以提高CPU的性能和卸载工作。

© www.soinside.com 2019 - 2024. All rights reserved.