Unity2020以上版本如何获取Profiler页面上的数据
了解UnityProfiler
如果你是熟悉使用Unity的人员,可以跳过此介绍。
Unity Profiler是Unity引擎提供的一个内置工具,用于分析和优化游戏或应用程序的性能。它可以帮助开发人员找出性能瓶颈、内存占用和GPU使用等方面的问题,并提供有关如何改进性能的指导。
Unity Profiler提供了多个视图和功能来监视应用程序的性能情况,包括:
性能摘要(Summary):显示总体的性能统计信息,如帧率、CPU时间、GPU时间等。
帧调用(Frame Call):展示每一帧中函数的调用次数和耗时,帮助定位性能瓶颈。
内存(Memory):用于检查应用程序的内存使用情况,包括堆内存、资源内存和Native内存。
GPU:提供了GPU性能相关的统计信息,如渲染时间、绘制调用等。
深入分析(Deep Profiling):用于查看特定函数的详细性能数据,以便精确分析和优化。
通过使用Unity Profiler,开发人员可以确定哪些部分消耗较多的CPU时间、内存或GPU资源,并针对这些问题进行优化。可以在编辑器中直接使用Unity Profiler进行实时监视,也可以将其连接到目标设备上进行远程分析。
Unity Profiler是一个强大的性能分析工具,对于开发人员来说非常有用,可以帮助他们优化游戏或应用程序的性能,提供更好的用户体验。
获取内存数据
内存数据具体用法在此就不详细说了,可参考官方文档。
那么我们如果想要将红框里边的数据提取出来用来做分析或者平台化的话该怎么办呢?Unity自己其实提供了一些接口的。可以使用UnityEditor.CoreModule中的RawFrameDataView类来提取。参考文档。
下面是我的实现方法,直接上代码:
代码
private static long GetContextValue(FrameDataView frameData, string name)
{
int markerId = frameData.GetMarkerId(name);
return markerId == -1 ? -1L : frameData.GetCounterValueAsLong(markerId);
}
private void GetSimpleMemoryData(string filename)
{
RawFrameDataView rawFrameDataView = ProfilerDriver.GetRawFrameDataView(2, 0);
if (rawFrameDataView != null && rawFrameDataView.valid)
{
//获取的原始数据long是Byte,除1024等于KB,除1024等于MB,除1024等于GB
long systemusedMemory = GetContextValue(rawFrameDataView, "System Used Memory");
long totalusedMemory = GetContextValue(rawFrameDataView, "Total Used Memory");
long totalreservedMemory = GetContextValue(rawFrameDataView, "Total Reserved Memory");
long untrackedMemory = systemusedMemory - totalreservedMemory;
long ManagedUsedHeap = GetContextValue(rawFrameDataView, "GC Used Memory"); //转为了Managed Heap中
long ManagedReservedHeap = GetContextValue(rawFrameDataView, "GC Reserved Memory"); //转为了Managed Heap中
long GraphicsUsedGD = GetContextValue(rawFrameDataView, "Gfx Used Memory");
long audioUsed = GetContextValue(rawFrameDataView, "Audio Reserved Memory");
long videoUsed = GetContextValue(rawFrameDataView, "Video Reserved Memory");
long profilerUsed = GetContextValue(rawFrameDataView, "Profiler Used Memory");
long profilerReserved = GetContextValue(rawFrameDataView, "Profiler Reserved Memory");
long otherReserved = systemusedMemory - untrackedMemory - ManagedReservedHeap - GraphicsUsedGD - audioUsed - videoUsed - profilerReserved;
long otherUsed = totalusedMemory - ManagedUsedHeap - GraphicsUsedGD - audioUsed - videoUsed - profilerUsed;
}
}
运行
这里输出的是字节Byte,要转换成GB的话除一下;如System Memory:9817817088 / 1024 / 1024 / 1024 = 9.14GB。
讲解
- 主要其实是Unity的接口,然后再封装获取一下。
- 这里面untrackedMemory和other Memory是没有固定标记名字的;需要借助其他值来减一下。
- System Used Memory这些标记名是旧版本界面上有的,但后来Unity升级版本之后就变成了现有界面,有可能是Unity改了前端名字;但是我们还是能通过这个标记名来拿到对应的值。