赞
踩
查看unity编辑器下的debug信息,看有没有发生错误
Unity prints some things on the devices as well; Logcat console for Android and Xcode gdb console on iOS devices
Xcode有内置工具. Xcode 4有一个用于调试崩溃的非常好的GUI, Xcode 3少一些.
Full gdb(UNIX及UNIX-like下的调试工具) stack - thread backtrace all
Enable soft-null-check: Enable development build
and script debugging. Now uncaught null ref exceptions will be printed to the Xcode console with the appropriate managed call stack.
关闭 “fast script call” 和 code stripping . 它可以阻止一些随机的崩溃,比如使用一些罕见的.net函数或反射造成的崩溃。
Unity 依赖 CPU (对其SIMD部分进行了大量优化,比如x86上的SSE或ARM上的NEON)对 皮肤、批处理、物理、用户脚本、粒子等进行处理。
The GPU 用来对 shaders, drawcalls, image effects进行处理.
大多数问题(80%)是由几个关键原因(20%)造成的. 您可以使用Editor profiler来识别处理器最密集的函数调用并首先进行优化. 通常,优化几个关键函数可以显著提高总体执行速度。
您应该确保只在真正需要时才执行函数. 例如,可以使用OnBecameVisible和OnBecameInvisible这样的事件来检测何时看不到对象,并避免更新它. 协同程序可以是一个有用的方式来调用代码,需要定期更新,但不需要运行每一帧:-
- // Do some stuff every frame:
- void Update () {
- }
-
- //Do some stuff every 0.2 seconds:
- IEnumerator SlowUpdate () {
- while (true) {
- //do something
- yield return new WaitForSeconds (0.2f);
- }
- }
-
-
你可以使用.NET System.Threading.Thread类来在单独的线程上运行繁重的计算.这允许你在多核上运行,但注意Unity API不是线程安全的-你需要缓冲输入和结果,并在主线程上读取和分配它们,以便使用Unity API调用。
并不是所有的代码都显示在 Profiler. 你可以使用 Profiler.BeginSample 和 Profiler.EndSample 把需要分析的代码显示在profiler中
Unity Editor profiler 目前不能显示 GPU 数据.
PowerVR是基于平铺的延迟渲染器,所以不可能获得GPU每帧画面调用的的时间。然而,你可以使用Unity的内置分析器(一个将结果打印到Xcode输出的分析器)获得整个场景的GPU时间。.苹果的工具目前只能告诉你GPU及其部件有多忙,但不会给出以毫秒为单位的时间。
PVRUniSCo 给出整个着色器的周期,以及着色器代码中每一行的近似周期。Windows & Mac! 但无论如何,它都无法与苹果的驱动程序完全匹配。不过,这是一个不错的大致衡量标准。
在Tegra上,NVIDIA提供了出色的性能工具,可以做您想做的任何事情- 每一个 draw call所花费的GPU时间, shader循环一次的时间, Force 2x2纹理,空视图矩形,运行在Windows, OSX, Linux。PerfHUD ES不易与消费者设备兼容,你需要NVIDIA
高通提供优秀的Adreno Profiler (Windows only),和消费者设备兼容,它的特点是时间轴图形,帧捕获,帧调试,API调用,着色分析仪,实时编辑。
The internal profiler gives a good overview per module:
Ports that the Unity profiler uses:
They should be accessible from within the network node. That is, the devices that you’re trying to profile on should be able to see these ports on the machine with the Unity Editor with the Profiler on.
有两种类型的内存, Mono memory 和 Unity memory.
Mono memory 处理脚本对象,unity对象的封装 (game objects, assets, components, etc). 当没有足够的可用内存分配时,Garbage Collector会清理掉这部分内存,或者当调用 System.GC.Collect() 方法时
内存以堆块的形式分配。 如果不能将数据放入分配的块中,则可以分配更多的数据. 堆块将保持在Mono,直到应用程序关闭.换句话说,Mono不会释放任何内存给操作系统 (Unity 3.x). 旦你分配了一定数量的内存,它就会被保留给mono,而不是OS. 即使你释放了这部分内存,它也只能在Mono内部使用,而不能用于操作系统。 在 Profiler中堆内存只增不减
如果系统不能将新数据放入分配的堆块中, t Mono 叫做 “GC” and 可以分配一个新的内存空间(for example, due to fragmentation).
“Too many heap sections” 意味着你已经用完了Mono memory (应为fragmentation or heavy usage).
使用 System.GC.GetTotalMemory
:以获得总的使用Mono内存。
T一般的建议是,尽量少用一点。
Unity memory处理Asset data (Textures, Meshes, Audio, Animation, etc), Game objects, Engine internals (Rendering, Particles, Physics, etc). Use Profiler.usedHeapSize
获得总的Unity memory.
No tools yet but you can use the following.
You can also make your own tool using Unity API calls:-
FindObjectsOfTypeAll (type : Type) : Object[]
FindObjectsOfType (type : Type): Object[]
GetRuntimeMemorySize (o : Object) : int
GetMonoHeapSize
GetMonoUsedSize
Profiler.BeginSample/EndSample
- 分析自己的代码UnloadUnusedAssets () : AsyncOperation
System.GC.GetTotalMemory/Profiler.usedHeapSize
References to the loaded objects - There is no way to figure this out. A workaround is to “Find references in scene” for public variables.
System.GC.Collect()
当出现小问题时,可以使用这个. net函数。在某些情况下,一个游戏可能会因为“内存不足”而崩溃,尽管从理论上讲它应该可以很好地适应.当这种情况发生时,比较一下你的正常游戏内存占用和崩溃时分配的内存大小.如果数字不相似,就会出现内存峰值。这可能是由于:
优化包括以下方面:
图形性能受填充率、像素和几何复杂度(顶点数)的限制. 如果你能找到一种方法来剔除更多渲染器,这三个都可以减少. Occlusion culling可以减少在视角内渲染的图形
在手机上,主要受 fillrate bound 的影响(fillrate = screen pixels * shader complexity * overdraw), 太复杂的shaders是主要原因,所以尽可能的使用简单的shader.
在Quality 设置里面降低图片的质量 如果能使游戏运行的更快的话,说明你可能受带宽的影响,所以应该压缩图片,使用mipmaps来降低图片的大小
使用 LOD (Level of Detail) -
移动设备的 GPUs 受产生的温度,耗电量以及产生的噪声影响. ,所以比pc有更小的带宽,低ALU性能和变形能力. :gpu的架构也被调整为使用尽可能少的带宽和功率。
Unity针对OpenGL ES 2.0进行了优化,它使用GLSL ES(类似于HLSL)着色语言. 内置的着色器通常是用HLSL(也称为Cg)编写的。. 这是交叉编译到GLSL ES的移动平台.如果你愿意,你也可以直接写GLSL,但是这样做会限制你只能写类似opengl的平台(比如移动+ Mac),因为目前还没有GLSL->HLSL翻译工具.当您在HLSL中使用float/half/fixed类型时,它们最终会在GLSL ES中使用highp/mediump/lowp精度限定符。
下是良好实践的清单:
- void Update (){
- // flip between meshes
- bufferMesh = on ? meshA : meshB;
- on = !on;
- bufferMesh.vertices = vertices; // modification to mesh
- meshFilter.sharedMesh = bufferMesh;
- }
检查你是否被填充率(屏幕的分辨率)限制很简单:如果你降低了显示分辨率,游戏是否运行得更快?如果是,你会受到填充率的限制。
尝试通过以下方法来降低着色器的复杂性:
通常情况下,游戏被GPU限制在像素处理上. 因此,它们最终会有未使用的CPU,特别是在多核移动CPU上.因此,通常明智的做法是把一些工作从GPU转到CPU上(unity可以这么做):比如: mesh skinning, 批处理一些小地对象,更新粒子图形.
这些应该谨慎使用,而不是盲目使用,如果你不顾及draw calls,烘焙其实要更费性能, 因为它使剔除效率更低,使更多的对象受光的影响!
Physics 可以严重影响CPU的性能. 它可以通过 Editor profiler检测到,如果Physics占用太多CPU时间:
这些是流行的移动架构. 这既不同于PC/控制台领域的硬件供应商,也不同于“普通”GPU的GPU架构。
Spend some time looking into different rendering approaches and design your game accordingly. Pay especial attention to sorting. Define the lowest end supported devices early in the dev cycle. Test on them with the profiler on as you design your game.
Use platform specific texture compression
Only PowerVR architecture (tile based deferred) to be concerned about.
This means:
And cons:
:在iOS上同时下载Assetbundle的次数有限制吗?(e。g我们能否同时下载超过10个资产包(或每一帧)? )
下载是通过OS提供的异步API实现的,所以OS决定需要为下载创建多少线程. 当启动多个并发下载时,您应该记住它可以支持的设备总带宽和可用内存的数量. 每个并发下载都分配自己的临时缓冲区,因此您应该小心不要耗尽内存。
Sometimes there’s nothing in the console, just a random crash
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。