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

时间:2018-07-31 09:06:47

标签: performance unity3d exe cpu cpu-usage

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

我的意思是,这不是一个包含许多对象和事物的场景,也不是一个空的场景,在两种情况下,CPU使用率为100%。

为什么?

如何减少它?

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

是否可以减少CPU使用率?

7 个答案:

答案 0 :(得分:5)

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

除此之外,为了使您的场景更加高效,您可以尝试使用这些方法来使您的游戏更加高效。可能还有更多,您可能无法全部应用​​。但是您可以将它们作为起点考虑:

1-静态批处理

您的场景中可能有大量的静态几何体,例如墙,椅子,灯光和永远不会动的网格。在编辑器中将它们标记为静态。请确保将其标记为静态光照贴图,以获取烘焙的光照贴图纹理。可以将标记为静态的对象批处理到一个组合的网格中,而不是对每个单个对象进行绘制调用。静态批处理有一个关键要求:所有对象必须使用相同的材​​料。如果您有使用木质材料制成的静态墙和使用钢材料制成的静态椅子,则这些墙将被分为一个带有一个组合网格的绘制调用,而这些椅子将被单独绘制成一个单独的网格,作为单独的绘制网格。

2-纹理图集

如前所述,每种材料都会产生抽奖。您可能会假设木门和钢制椅子可能需要使用单独的材料,因为它们使用了单独的纹理。但是,如果它们可以使用相同的着色器,则可以使用纹理地图集创建两个对象都可以使用的一种材质。纹理图集就是包含所有较小纹理的较大纹理。您可以让一种材料仅加载一种纹理,而不是用数十种材料加载多种纹理。可以将每个对象映射为在地图集的不同坐标上使用纹理。您可以在艺术流程中手动执行此操作,但是我发现Juan Sebastian的Pro Draw Call Optimizer非常有用。它会自动生成纹理地图集并交换新对象,而不会破坏您的资产。

3-动态批处理

移动的非静态对象可以动态地批处理到一个绘制调用中。我注意到这是占用大量CPU的资源,并且是在每帧上计算的,但这是一个不错的优化。这仅适用于使用相同材质的顶点少于900个的对象。使用纹理图集为您的动态对象创建单一材料,即可获得廉价的动态批处理!

4个LOD

LOD组是提高性能的一种廉价方法。使用具有多个LOD的资产,并为距离摄像机更远的对象渲染低细节几何形状。摄像机靠近时,Unity会在每个LOD之间自动消失。

5-填充,透支和剔除

这涉及到一个我不太熟悉的话题,但值得关注:减少过度绘制,首先将最远的对象绘制到一个像素,然后重新绘制像素,然后将每个更靠近的对象放在顶部。对于普通的1080p PC显示器而言,这并不是什么大问题,但对于具有超高分辨率显示器的VR和移动设备而言,这是一个重大问题。大量的透支结合大量的像素会破坏您的填充率。纹理滤液是GPU中的关键限制指标之一。开箱即用地提供了一些解决方案,包括遮挡剔除和视锥剔除。视锥剔除不会渲染相机视锥以外的对象。没有看不见的点渲染对象!遮挡剔除消除了其他物体被其前面的物体遮挡的情况。例如,可以将门后的房间完全排除在外。默认情况下,遮挡剔除适用于整个场景,但是适当的关卡设计将使您可以消除游戏的整个关卡。

LOD组还可以剔除距离场景太远的对象,从而进一步降低填充率。

6-关卡设计

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

7-异步加载

在玩家接近下一个房间的门之前,先加载下一个关卡。不要使用Application.LoadLevel()同步加载此文件,因为这会导致您的游戏在加载时挂起。由于头部跟踪会立即发生,这会引起恶心,对玩家来说是一种可怕的经历。

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

8-烘烤照明

关闭实时阴影!具有动态阴影的对象将不会被批量处理,并且会招致严重的抽奖。

在PC上,您可以摆脱单一的实时定向光,以获得出色的动态阴影。大多数现代PC可以提供出色的每像素阴影效果。但是,在移动设备上,您希望坚持使用烘焙的照明,而没有实时阴影。以非常高分辨率的硬阴影和软阴影烘焙照明。

9-阴影

特别是为了提供出色的移动体验,请跳回旧的技巧以获取3D对象上的阴影。可以使用简单的2D正方形在您的对象下模拟具有模糊阴影纹理的半真实阴影。

10个光探头

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

光探测器是烘焙的立方体贴图,用于存储有关场景中各个点的直接,间接甚至是发射光的信息。当动态对象移动时,它将对附近的光探测器的样本进行插值,以近似该特定位置处的照明。这是在不使用昂贵的实时光源的情况下在动态对象上模拟逼真的光照的一种廉价方法。

11-避免使用透明和多材质的物体

诸如玻璃透明窗口之类的使用透明着色器的对象非常昂贵。有一种常见的做法是使用具有灰尘或铁锈纹理的透明材料以及单独的基础扩散材料来增加墙壁的真实感。这种多材质的Alpha混合非常昂贵;每种材料都会添加抽奖电话!但是请注意,多个纹理不是问题。使用多种单独的材料非常昂贵。使用一种材质和可以通过alpha混合将多个纹理混合的材质球,而不是多个单独的材质。

12-蒙皮的网格渲染器

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

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

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

答案 1 :(得分:3)

没有足够的数据来帮助您找出问题所在,这可能是由很多原因引起的。尝试使用统一分析器来跟踪导致CPU峰值的原因

Unity探查器

使用统一分析器开始。这是Unity的内置工具,可让您检查应用程序的哪个部分在使用什么资源,它的完整性以及其使用时间。

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

概述屏幕显示了很多信息,您首先要查看的信息是“总计”和“时间ms”。 Total是使用的CPU总量(以百分比为单位)。时间是毫秒级的时间。

使用此数据查找占用您所有CPU的脚本/操作并从那里开始进行优化。

有关Unity的CPU分析器的更多信息,请访问here

答案 2 :(得分:1)

在Unity中运行场景时,仅当对象在相机中可见时才渲染对象。渲染场景时,Unity自动减少其CPU需求。当然也有一些例外,但是Unity足够聪明,可以减少不必要的cpu​​使用。 您的问题可能是由多种因素引起的,每个因素都有其自己的解决方案。没有通用的。例如,可能是您拥有多个具有巨大纹理的游戏对象,或者是使用后处理程序包渲染了一个场景(这消耗了内存/ cpu)。或者可能是您的计算机功能不够强大,并且目标受众不会遇到此问题

答案 3 :(得分:1)

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

如果未设置,则游戏将尝试以最高帧速率运行,如果以批处理模式运行,则它将占用所有CPU使用率。

答案 4 :(得分:0)

添加到以前的出色答案。 GPU实例可以提高性能并从CPU上卸载工作。

答案 5 :(得分:0)

重新启动计算机为我工作。

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

答案 6 :(得分:0)

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