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

ima*_*_sh 1 cpu performance exe cpu-usage unity-game-engine

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

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

为什么?

我该如何减少呢?

我想减少CPU使用率的原因是:我想exe在专用服务器上运行多个游戏,以统一制作多人游戏。UNET在这种情况下,除了一些功能之外,我什么syncvars都没有,甚至没有更新功能……我只想让此exe文件使用更少的CPU来更好地运行并提高性能。

是否可以减少CPU使用率?

ima*_*_sh 6

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

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


Rem*_*_rm 5

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

统一分析器

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

如果您转到“窗口”>“分析器”,您将看到“CPU 使用情况”,分为更小的子类别和一个可视化 CPU 使用情况的图表。您可以单击图表中的任意位置来获取该帧内所有 CPU 使用情况的概览。

概述屏幕显示大量信息,您首先要查看的信息是“总计”和“时间毫秒”。总计是 CPU 使用总量的百分比。时间是以毫秒为单位所花费的时间。

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

有关 Unity 的 CPU 分析器的更多信息可以在这里找到


Ign*_*rre 5

关于CPU使用率。可能是您正在运行的唯一进程是Unity Scene,因此PC不需要将CPU占用100%的CPU资源用于Unity,因为它不需要为其他“繁重”的应用程序分配资源(我猜不是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