Unity 优化总结

2017-03-10 | 发布 大海明月  zengfeng75@qq.com  | 分类 Unity  | 标签 Unity  优化

相关文档

UGUI 降低填充率技巧两则

UWA直播回顾| UGUI性能优化技巧

UGUI需要注意的点

1.UI叠加问题

如果叠加层有另外的calldraw夹着,会使本来该合并的calldraw独立。从而让calldraw上升

2.UI Mask遮罩

(1)mask先往缓存里画一个区域,产生一个calldraw

(2)mask里面的物体与外面的calldraw独立,越复杂产生的calldraw越多

3.UI布局时,尽量吧Text放一个层里去

原理同1,Text可能会分割其他图片的calldraw。 好处是可以把相同字体的text合并calldraw

4.UI的 overdraw

(1)叠加层数越多,overdraw显示的颜色越红。同一个像素在同一帧绘制的次数越多

(2)如果Image是Sliced类型,中间区域是完全透明(相当于9宫格的边框),那么尽量将 Fill Center的勾去掉

(3)如果是只要点击区域,不要显示内容的。可以把空白透明Image替换成qiankanglai提供的Empty4Raycast (http://blog.uwa4d.com/archives/fillrate.htmlhttp://blog.uwa4d.com/archives/fillrate.html)。只接收事件,清空顶点绘制。

01.using UnityEngine;
02.using System.Collections;
03. 
04.namespace UnityEngine.UI
05.{
06.public class Empty4Raycast : MaskableGraphic
07.{
08.protected Empty4Raycast()
09.{
10.useLegacyMeshGeneration = false;
11.}
12. 
13.protected override void OnPopulateMesh(VertexHelper toFill)
14.{
15.toFill.Clear();
16.}
17.}
18.}

(4)和第(2)类似,如果一张图片有很多区域是空白的,默认情况下fill rate是矩形区域。用下下面qiankanglai提供的PolygonImage。可以减少透明区域的fill。

01.using System.Collections.Generic;
02. 
03.namespace UnityEngine.UI
04.{
05.[AddComponentMenu("UI/Effects/PolygonImage", 16)]
06.[RequireComponent(typeof(Image))]
07.public class PolygonImage : BaseMeshEffect
08.{
09.protected PolygonImage()
10.{ }
11. 
12.// GC Friendly
13.private static Vector3[] fourCorners = new Vector3[4];
14.private static UIVertex vertice = new UIVertex();
15.private RectTransform rectTransform = null;
16.private Image image = null;
17.public override void ModifyMesh(VertexHelper vh)
18.{
19.if (!isActiveAndEnabled) return;
20. 
21.if (rectTransform == null)
22.{
23.rectTransform = GetComponent<RectTransform>();
24.}
25.if (image == null)
26.{
27.image = GetComponent<Image>();
28.}
29.if (image.type != Image.Type.Simple)
30.{
31.return;
32.}
33.Sprite sprite = image.overrideSprite;
34.if (sprite == null || sprite.triangles.Length == 6)
35.{
36.// only 2 triangles
37.return;
38.}
39. 
40.// Kanglai: at first I copy codes from Image.GetDrawingDimensions
41.// to calculate Image's dimensions. But now for easy to read, I just take usage of corners.
42.if (vh.currentVertCount != 4)
43.{
44.return;
45.}
46. 
47.rectTransform.GetLocalCorners(fourCorners);
48. 
49.// Kanglai: recalculate vertices from Sprite!
50.int len = sprite.vertices.Length;
51.var vertices = new List<UIVertex>(len);
52.Vector2 Center = sprite.bounds.center;
53.Vector2 invExtend = new Vector2(1 / sprite.bounds.size.x, 1 / sprite.bounds.size.y);
54.for (int i = 0; i < len; i++)
55.{
56.// normalize
57.float x = (sprite.vertices[i].x - Center.x) * invExtend.x + 0.5f;
58.float y = (sprite.vertices[i].y - Center.y) * invExtend.y + 0.5f;
59.// lerp to position
60.vertice.position = new Vector2(Mathf.Lerp(fourCorners[0].x, fourCorners[2].x, x), Mathf.Lerp(fourCorners[0].y, fourCorners[2].y, y));
61.vertice.color = image.color;
62.vertice.uv0 = sprite.uv[i];
63.vertices.Add(vertice);
64.}
65. 
66.len = sprite.triangles.Length;
67.var triangles = new List<int>(len);
68.for (int i = 0; i < len; i++)
69.{
70.triangles.Add(sprite.triangles[i]);
71.}
72. 
73.vh.Clear();
74.vh.AddUIVertexStream(vertices, triangles);
75.}
76.}
77.}

5.UI的 没必要的Raycast Target勾去掉

UGUI的 Text、Image两个组件有这个参数,主要用来事件监听的。如果不需要接受事件监听就去掉。因为在触摸屏幕的时候,Raycast Target勾选的会参与检测。数量多了就会耗时。

6.UI的 Mesh重建,动静分离

(1)先看看界面中不操作情况下,有哪些元素是会变化的。如果层级不是很耦合,那么可以把这些动的元素放到新的Canvas。如果大多数变化的在一个层级下,就在变化的最上游节点添加一个Canvas组件。

(2)如个是选中状态有变化的元素。可以用代码动态给他添加Canvas组件。

(3)如果Image、Text在动态改变Color的,做渐变动画之类的。也可以单独设置材质球用脚本修改材质球颜色。多1个calldraw。减少整体Mesh重建。直接修改Color是在修改他们的顶点颜色,所以Mesh会重建。

7.Text描边

Text调用Outline等组件会多加很多的Mesh(三角数翻5倍)。可以自己创建字体,字体里的文字描好边。

(转载)Unity 优化总结的更多相关文章

  1. [转载]unity优化1

    官方优化文档--优化图像性能http://docs.unity3d.com/Documentation/Manual/OptimizingGraphicsPerformance.html Unity3 ...

  2. 【Unity优化】构建一个拒绝GC的List

    版权声明:本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 上篇文章<[Unity优化]Unity中究竟能不能使用foreach?> ...

  3. [Unity优化] Unity CPU性能优化

    前段时间本人转战unity手游,由于作者(Chwen)之前参与端游开发,有些端游的经验可以直接移植到手游,比如项目框架架构.代码设计.部分性能分析,而对于移动终端而言,CPU.内存.显卡甚至电池等硬件 ...

  4. 再议Unity优化

    0x00 前言 在很长一段时间里,Unity项目的开发者的优化指南上基本都会有一条关于使用GetCompnent方法获取组件的条目(例如14年我的这篇博客<深入浅出聊Unity3D项目优化:从D ...

  5. UNITY 优化之带Animator的Go.SetActive耗时问题,在手机上,这个问题似乎并不存在,因为优化了后手机上运行帧率并未明显提升

    UNITY 优化之带Animator的Go.SetActive耗时问题,在手机上,这个问题似乎并不存在,因为优化了后手机上运行帧率并未明显提升 经确认,这个问题在手机上依然存在,不过占的比例非常小.因 ...

  6. 面向英特尔® x86 平台的 Unity* 优化指南: 第 1 部分

    原文地址 目录 工具 Unity 分析器 GPA 系统分析器 GPA 帧分析器 如要充分发挥 x86 平台的作用,您可以在项目中进行多种性能优化,以最大限度地提升性能. 在本指南中,我们将展示 Uni ...

  7. [转载]机器学习优化方法总结:SGD,Momentum,AdaGrad,RMSProp,Adam

    [转载]机器学习优化方法总结:SGD,Momentum,AdaGrad,RMSProp,Adam https://blog.csdn.net/u010089444/article/details/76 ...

  8. 【Unity优化】Unity优化技巧进阶开篇

    版权声明:本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 做游戏好多年了,关于游戏优化一直是令开发者头疼的一个问题.因为优化牵扯的内容很多, ...

  9. 【Unity优化】如何实现Unity编辑器中的协程

    Unity编辑器中何时需要协程 当我们定制Unity编辑器的时候,往往需要启动额外的协程或者线程进行处理.比如当执行一些界面更新的时候,需要大量计算,如果用户在不断修正一个参数,比如从1变化到2,这种 ...

随机推荐

  1. 精选Java面试题

    什么是隐式类型转换?什么是显示类型转换? 当将占位数少的类型赋值给占位数多的类型时,Java自动使用隐式类型转换(如int型转为long型).当把在级别高的变量的值赋给级别底变量时,必须使用显示类型转 ...

  2. System.exit(0);和finish();,push原理

    今天师姐问我安卓后台的问题,想起几年前做进制转换的时候特意研究了一下怎么才能「不驻留内存地退出」.虽然Android不推荐用户手动关闭进程,但是在那个内存捉襟见肘的年代,不得不考虑内存. 首先直接按b ...

  3. Linux vSphere SDK for Perl 执行脚本报错

      本人在gentoo系统上安装完vSphere for Perl之后,执行/usr/lib/vmware-viperl/app/vm/vminfo.pl脚本. 提示错误如下: Server vers ...

  4. hadoop应用场景

    大数据量存储:分布式存储 日志处理: Hadoop擅长这个 海量计算: 并行计算 ETL:数据抽取到oracle.mysql.DB2.mongdb及主流数据库 使用HBase做数据分析: 用扩展性应对 ...

  5. Junit单元测试类

    /*package zxdc.web; import static org.junit.Assert.*; import java.io.IOException; import javax.servl ...

  6. ubuntu 16.04 apt-get 出现The package 'xxx' needs to be reinstalled, but I can't find an archive for it.

    参考网址:http://www.ihaveapc.com/2011/10/fix-annoying-the-package-needs-to-be-reinstalled-but-i-cant-fin ...

  7. javascript闭包和闭包的几种写法和用法

    什么是闭包 闭包,官方的解释是:一个拥有需要许多变量和绑定了这=这些变量的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1 作为一个函数变量的引用,当函数返回时,其处于激活 ...

  8. webpack 小demo

    1 安装node.js 2 安装cnpm 3 安装webpack cnpm install --save-dev webpack 对于大多数项目,我们建议本地安装.这可以使我们在引入破坏式变更的依赖时 ...

  9. Linux下使用《du》命令查看某文件及目录的大小

    du -ah --max-depth=1     这个是我想要的结果  a表示显示目录下所有的文件和文件夹(不含子目录),h表示以人类能看懂的方式,max-depth表示目录的深度. du -sh 目 ...

  10. JQuery扩展插件Validate—5添加自定义验证方法

    从前面的示例中不难看出validate中自带的验证方法足以满足一般的要求,对于特别的要求可以使用addMethod(name,method,message)添加自定义的验证规则,下面的示例中添加了一个 ...