在某个背景上有个按钮,要将按钮绘制在背景上,这个就是Overdraw,Overdraw无法避免,只能优化降低
主要原因是使用了Outline,Outline实现方式是将Text的四个顶点传过去复制四份,设置四份偏移量实现效果,将偏移量设置很大之后,可以看到一个Text周围有四个相同的Text
//Outline源码 public class Outline : Shadow { protected Outline() {} public override void ModifyVertices(List<UIVertex> verts) { if (!IsActive()) return; var start = 0; var end = verts.Count; ApplyShadow(verts, effectColor, start, verts.Count, effectDistance.x, effectDistance.y); start = end; end = verts.Count; ApplyShadow(verts, effectColor, start, verts.Count, effectDistance.x, -effectDistance.y); start = end; end = verts.Count; ApplyShadow(verts, effectColor, start, verts.Count, -effectDistance.x, effectDistance.y); start = end; end = verts.Count; ApplyShadow(verts, effectColor, start, verts.Count, -effectDistance.x, -effectDistance.y); } } //ApplyShadow源码 protected void ApplyShadow(List<UIVertex> verts, Color32 color, int start, int end, float x, float y) { UIVertex vt; var neededCpacity = verts.Count * 2; if (verts.Capacity < neededCpacity) verts.Capacity = neededCpacity; for (int i = start; i < end; ++i) { vt = verts[i]; verts.Add(vt); Vector3 v = vt.position; v.x += x; v.y += y; vt.position = v; var newColor = color; if (m_UseGraphicAlpha) newColor.a = (byte)((newColor.a * verts[i].color.a) / 255); vt.color = newColor; verts[i] = vt; } }解决方案: 1.不使用或者使用Shadow(Shadow通过为图像或者文字的Mesh添加顶点实现阴影效果,Outline继承Shadow,在对象四个角上各添加一个Shadow) 2.使用Textmesh Pro(Unity5.5)需要制作相应的字体文件,对于动态生成的文字效果不好,固定字体很好 (https://blog.csdn.net/dark00800/article/details/73011343?utm_source=itdadao&utm_medium=referral) 3.修改Mesh的UV坐标,提取文字原始UV坐标,扩大文字绘图区域,对文字纹理周围像素点采样,新旧颜色融合 (http://gad.qq.com/article/detail/29266)
适配的需要加了层背景,不是iPhoneX失活就可以
裁剪小一点更好
图1改.pngUnity的Mask组件会增加一层Overdraw,还会多增加4个DrawCall 解决: 1.使用RectMask2D代替,缺点是只能用于矩形 2.对于多边形,用MeshMask,红色为UnityMask,蓝色是MeshMask,UnityMask消耗15个DrawCall,Overdraw2次,MeshMask消耗1个DrawCall,1层OverDraw(https://www.cnblogs.com/leoin2012/p/6822859.html)
image.png image.png对于slide九宫格图片,可以看情况取消fill center属性,那样中心区域会不渲染,中心区域也就镂空,重合面积也会小
图2改.png少量的panel或者单纯的空父物体身上加着image,虽然没有给图片,但是还是会渲染
粒子效果薄弱的可以使用序列帧动画实现
图3改1)三层大底图,一个纯黑底,还有两层楼梯背景(可以纯黑底图合并到两层) 2)楼梯前底图可以小一点不和最底下图标重叠
image.png 图4改1)粒子效果
1.slide九宫格图片,取消fill center,中心镂空 2.mask尽量不用,可以用rect mask2D 代替 3.不用UI/Effect,包括Shadow,Outline,Position As UV1 4.不用Image的Tiled类型 5.不用Pixel Perfect 6.动静分离,动态的在父物体上加个Canvas 7.尽量active,不要destroy,也不要设置Alpha=0这样还是会渲染 8.不用BestFit(代价高,Unity会为该元素用到的所有字号生成图元保存在Altlas中,增加额外生成时间,还会使得字体对应的atlas变大) 9.特效粒子