主界面操作窗口

image-20240920160742085

参数解释

CPU

第一个带ms的数据是完成主线程一帧的时间,第二个是渲染一帧图片的时间,值小点好,

Batches

批次,表示调用(Draw Call,也可以简称为DC)的总次数,详见Unityshader的学习笔记,值小点好,在屏幕上输出一个画面

Save by barching

有多少DC被合并到了一个批次,将可能然让这个数据大

以下二者的数量统计都是相对于摄像机的视椎体来讲的

Tris

屏幕中剩余三角形数量,就算是一个cube在屏幕部分看不见,依然是要计入

verts

屏幕中剩余顶点数量,Unity中对于顶点的判断是一个面由两个三角形组成,这两个三角形存在共用顶点,一个cube是有由六个面组成,因为一个cube的顶点数量为 4 * 6 =24

(在3D建模软件中创建的模型导入到Unity后,该模型在Unity中显示的三角面和网格顶点的数量和在3D建模软件中的可能不同。因为3D建模软件和Unity对模型的三角面和网格顶点的计算方式可能是不一样的。)

Screen:

屏幕分辨率以及在内存中占据的大小

image-20240920172925133

红框内的数据代表启动 垂直同步

垂直同步解释

垂直同步用于将游戏的帧率限制为显示器的刷新率,可以防之游戏画面在告诉移动时的画面撕裂现象,使游戏画面更加平滑和连贯。
如果不启用垂直同步,当游戏的帧率高于显示器的刷新率时,图像的一部分可能会在显示器刷新之前更新,导致画面上出现明显的断裂线。而启用垂直同步后,图形处理器会等待显示器完成一次完整的刷新,然后再发送下一帧图像,确保每个图像帧都在刷新之前完全绘制,从而消除了撕裂现象。
但是启用垂直同步会消耗 一些性能,也可能会出现卡顿的现象,要根据自己的实际情况来决定是否启用

保持纵横比

image-20240920173253146

勾选第一个 aspect radio,在屏幕变小的情况下会保持纵横比进行缩放

默认分辨率设置

设置游戏启动时的默认屏幕分辨率:
所需的屏幕宽度和屏幕高度
Edit–Project Settings–Player–展开Resolution and Presentation下拉菜单–取消勾选Defaultls NativeResolution-写上

SetPass calls

表示在当前摄像机的渲染过程中,Unity切换着色器通道(Shader Pass)来渲染游戏对象的次数。一个着色器(Shader)可以包含多个着色器通道,每个着色器通道可以通过不同的方式来渲染游戏对象。但每次切换着色器通道都会消耗一定的性能。应尽量避免这项数据过大

Shadow casters

表示摄像机画面中有多少个物体产生了阴影。应尽量避免这项数据过大。

image-20240920174429081

Visible skinned meshes

网格用来定义一个模型的形状、大小和表面细节等信息。
模型的所有顶点、
线
面共同构成了这个模型的网格。

表示当前摄像机中有多少个可见的蒙皮网格。网格用来定义一个模型的形状、大小和表面细节等信息,模型的所有顶点、线、面共同构成了这个模型的网格。蒙皮网格是一个与骨骼绑定的网格,这个网格可以发生形变和做出各种动作。一个网格在没有蒙支之前是不能发生形变的,也不能做出各种动作的。但是在成功蒙皮之后,这个网格就可以发生形变和做出各种动作。应尽量避免这项数据过大。

蒙皮网路在Unity中实际上是组件形式管理的

Animator components playing

表示当前场景中有多少个 Animaor正在播放动画

Animation components playing

表示当前尝尽中有多少个animation正在播放

性能分析窗口

//TODO:后序添加打开的方式

模式选择

image-20240920180152373

在图片中的Edit模式下,不运行游戏可以收集数据,点击右侧的同心圆 按钮启动就行,同理还有需要在游戏运行时才能用的Play Mode

Deep Profile

image-20240920201412807

对自己编写的C#脚本中的各个方法进行功耗分析,适合单独去解决问题

image-20240924155449737

调用栈

调用栈(Call Stack)是计算机程序在执行过程中记录函数调用的一种数据结构。
调用栈是一个栈结构,即先进后出。它用于记录程序执行过程中,每个函数被调用的情况。
当一个函数被调用时,它的相关信息,如函数名、参数、返回地址等,会被添加进调用栈中。当该函数执行完成后,相应的信息会从调用栈中移除。通过不断添加和移除函数调用的信息,调用栈就记录了程序执行的顺序。
调用栈对于程序调试和分析非常有用。当程序出现错误或异常时,可以通过査看调用栈来确定错误发生的位置和函数调用的顺序。调试器通常会显示当前调用栈的信息,以帮助开发人员查看函数的执行过程并找出发生异常的原因。

选中Deep Profile右侧的Call Stacks按钮,这样在收集性能数据的时候,每一帧都会记录该方法的的调用栈信息。GC.AIloc,JnsafeUtility.Malloc、JobHandle.complete是Unity的方法,启用Call stacks且勾选它们后,如果Unity有调用它们,则可以在Hierarchy或Raw Hierarchy右侧的搜索框中搜索到它们,这样就可以查看它们的性能了。GC.Alloc表示GC的内存分配情况。
UnsafeUtility,Malloc(Persistent)表示非托管内存的分配情况。JobHandle,Commplete表示Job的完成情况。这里的Job是指Unity的Job Svstem的一组特定的任务

GC.Alloc表示GC的内存分配情况。
UnsafeUtility.Malloc(Persistent)用于在内存中分配指定大小的未初始化内存块。这个方法会直接在堆上分配内存,并可以绕过自动内存管理功能,需要手动管理内存的生命周期和释放。一般情况下,只有在处理非托管内存的特定场景下才会使用UnsafeUtility.Maloc方法
JobHandle.Complete表示Job的完成情况。

这里的Job是指Unity的Job Systemm的一组特定的任务。

托管内存是由垃圾回收器自动管理的内存,当达到一定量时,会由垃圾回收器自动释放它们。
千管内存存放在扦管堆中。扦管堆是一种用干存储和管理扦管对象的内存区域。每当创建一个新的扦管对象时,托管堆就会分配内存空间给这个对象,并记录这个对象的信息。当托管对象不再被引用或不可达时,垃圾回收器会自动将其标记为垃圾,并在适当的时候回收其占用的内存空间。
非托管内存不会自动被回收,它们需要我们程序员写代码去管理和释放它们。
非托管内存并不固定存储在一个地方,它们往往分散存储在不同的地方,例操作系统的内存、临时缓冲区等。

下面是Job涉及到的知识点

DOTS(Data-Oriented Technology Stack)是Unity引擎中的一个新的编程模型和工具集。它旨在提供更高性能、更可扩展和更并行化的游戏开发体验。
DOTS中包含了三个主要部分:
ECS框架:ECS是一种用于组织和管理游戏对象的方式。它将游戏对象分解为实体(Entity)、组件(Ccomponent)和系统(Syster)这种模式更加适合于并行处理和优化,可以提高游戏性能。
2、JobSystem(作业系统):Jobsystem允许开发者将任务并行化,利用多核处理器的能力。它通过将任务划分为小的作业(iobs)并在多个线程上并发执行来提高性能。JobSvstem还可以与ECS结合使用,使得开发者可以更好地控制游戏的行为。
3、Burst Compiler(突发编译器):Burst compiler是一种高性能的C#编译器,可以将C#代码转换为高效的本机代码,以进一步提高游对的性能。
DOTS的目标是为游戏开发者提供更好的性能和可扩展性,并更好地利用现代硬件的并行能力。它适用于需要处理大量实体和需要高性能的游戏项目。

点击选择框中给出的方法,如果在程序运行过程中使用到了,Unity会在下方程序窗口中展示出来

image-20240924160313907