unity优化一些总结 (长期更新)

摘要:
unity优化一些总结UI:1:尽量不要使用动态文本2:使用更多画布拆分画布我开始使用3幅画布。也可以移除屏幕外,但问题是所有这些活动的UI元素仍然被计算并添加到绘制调用中,即使它们没有被看到。Unity提出了一些可以处理的方法,但是有一个非常简单的解决方案,在这种情况下没有提到,它本身做得很好,而且当与其他策略结合时甚至更好。在Unity5.2中引入,它是RectMask2D。

unity优化一些总结 (长期更新)

UI:

1:尽量不要使用动态文本

2: 使用更多画布 拆分画布

​ 我开始使用3幅画布。一个用于我的背景图像,一个用于我的主要UI元素,另一个用于需要放置在其他所有元素顶部的元素。

我了解到,每当画布中的某些内容发生变化时,整个画布都会被重新评估并重新绘制。因此,除了最简单的UI之外,将UI分成多个画布的好处可能非常重要。即使对于简单的HUD,将其拆分为用于静态元素的画布和用于动态元素的画布也可能要快得多。

缺点是每个画布都会增加绘制调用。因此,在决定拆分画布时,我们仍需要平衡速度以提高效率。

3: 禁用不可见的UI,擅长使用RectMask 2D

​ 我有很多UI屏幕移入和移出摄像机视图,所有这些都有助于绘制调用。有时我可以禁用游戏对象,但是同样会产生性能问题。也可以移除屏幕外,但问题是所有这些活动的UI元素仍然被计算并添加到绘制调用中,即使它们没有被看到。

Unity提出了一些可以处理的方法,但是有一个非常简单的解决方案,在这种情况下没有提到,它本身做得很好,而且当与其他策略结合时甚至更好。在Unity 5.2中引入,它是Rect Mask 2D

掩盖你的用户界面

将一个Rect Mask 2D组件放在主画布上。

4: 简化UI着色器

我了解到UI Default着色器非常灵活,但对于许多元素来说都是过度杀伤。UI Fast-Default当我们不需要花哨的东西时,在帖子中提供的着色器(由于某种原因而不是应用程序)是一个更快的使用。

Shader "UI/Fast-Default"
{
    Properties
    {
        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
        _Color ("Tint", Color) = (1,1,1,1)
    }

    SubShader
    {
        Tags
        { 
            "Queue"="Transparent" 
            "IgnoreProjector"="True" 
            "RenderType"="Transparent" 
            "PreviewType"="Plane"
            "CanUseSpriteAtlas"="True"
        }

        Cull Off
        Lighting Off
        ZWrite Off
        ZTest [unity_GUIZTestMode]
        Blend SrcAlpha OneMinusSrcAlpha

        Pass
        {
        CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            #include "UnityUI.cginc"
            
            struct appdata_t
            {
                float4 vertex   : POSITION;
                float4 color    : COLOR;
                float2 texcoord : TEXCOORD0;
            };

            struct v2f
            {
                float4 vertex   : SV_POSITION;
                fixed4 color    : COLOR;
                half2 texcoord  : TEXCOORD0;
                float4 worldPosition : TEXCOORD1;
            };
            
            fixed4 _Color;
            fixed4 _TextureSampleAdd;
            v2f vert(appdata_t IN)
            {
                v2f OUT;
                OUT.worldPosition = IN.vertex;
                OUT.vertex = mul(UNITY_MATRIX_MVP, OUT.worldPosition);

                OUT.texcoord = IN.texcoord;
                
                #ifdef UNITY_HALF_TEXEL_OFFSET
                OUT.vertex.xy += (_ScreenParams.zw-1.0)*float2(-1,1);
                #endif
                
                OUT.color = IN.color * _Color;
                return OUT;
            }

            sampler2D _MainTex;
            fixed4 frag(v2f IN) : SV_Target
            {
                return (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;
            }
        ENDCG
        }
    }
}

5: 不要使用默认的滚动视图

除了我关于UI着色器的问题之外,我一直在质疑默认UI对象的效率,特别是在了解了Rect Mask 2D比标准更好的情况之后UI Mask。为什么不是默认Scroll View使用Rect Mask 2D?这对其他默认UI对象意味着什么?

6: 屏幕遮罩处理,阻挡点击穿透,使用文本Text

我们在整个屏幕上处理触摸时做的第一件事(做弹出逻辑和/或阻止所有其他画布)是使用没有Sprite设置的图像,并且启用raycast。工作正常,但它造成的性能问题却是不可逃避的,而且还为所有屏幕渲染了一个大的空透明四边形,这在移动设备上非常糟糕。

我们的解决方案是更改为使用文本,也扩展到所有屏幕但没有字体或文本集。它不消耗渲染时间(在移动设备上测试)并按预期处理光线投射,我想这是因为它不生成网格(因为它没有文本或字体集)并且同时仍然有配置的光线投射的边界框。

6::Material/Animator/Shader属性访问

永远不要直接通过名字去访问,因为在引擎内部需要对字符串名字计算哈希得到一个整数id~错误做法
material.SetColor("_Color", Color.white);
animator.SetTrigger("attack");
正确做法是一开始启动的时候计算一次哈希,然后缓存下来…
static readonly int material_Color = Shader.PropertyToID("_Color");
static readonly int anim_Attack = Animator.StringToHash("attack");

material.SetColor(material_Color, Color.white);
animator.SetTrigger(anim_Attack);

免责声明:文章转载自《unity优化一些总结 (长期更新)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇前端模块化,AMD,CMD 面试总结VS2010-如何建立并运行多个含有main函数的文件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

利用Microsoft.Practices.Unity的拦截技术,实现.NET中的AOP

1、记住这个单词的意思:Interception(拦截) 2、首先说一下原理和背景   原理:所谓的AOP就是面向切面编程,这里不多说,百度搜索。   目的:个人认为是为了解耦,部分代码跟业务代码分离,业务代码里面不掺杂其它功能,比如:记录异常、记录操作日志。   背景:项目基本功能已完成,产品要求记录用户的操作日志,新增的时候记录某人在某时做了某事(包括...

unity Physics.BoxCast说明

public static bool BoxCast (Vector3 center, Vector3 halfExtents, Vector3 direction, Quaternion orientation= Quaternion.identity, float maxDistance= Mathf.Infinity, int layerMask=...

【Unity游戏开发】AssetBundle杂记--AssetBundle的二三事

一、简介   马三在公司大部分时间做的都是游戏业务逻辑和编辑器工具等相关工作,因此对Unity AssetBundle这块的知识点并不是很熟悉,自己也是有打算想了解并熟悉一下AssetBundle,掌握一下Unity资源管理方面的知识,因此有了这篇博客。   我会在博客中整理出一些自己学习时收集到的一些比较好的AssetBundle学习资料,并且结合现在正...

Unity 数字孪生笔记 工具介绍

流程思考 数字孪生本质上一种基于实际物理数据的可视化方案,通过对接实际数据,在三维界面中展示孪生结果。那么这个流程就很简单了。整个流程分为三块:数据来源-》数据分析-》数据展示 输入数据 首先我们需要考虑我们能拿到什么。第一,实际物体的三维数据从哪里来,第二,实际数据怎么获取到。 模型数据 工业上常常会用到CAD模型,CAD模型具有精确、统一的特点,但...

Unity3d Shader

Unity3d Shader 预览Surface Shader主要用来实现光照相关处理,可能更简洁。Vertex and Fragment Shader如果不与光照交互, 则可以用这个shader,更录活fixed function shaders固定shader主要用于老旧卡ShaderLab不管写哪种shader,最终通过shaderLab实现,其组织结...

Unity3D集成SVN进行版本控制

首先,AssetServer确实很好用,Unity内部集成的管理界面,操作很简单,提交冲突的后还可以进行文件比对。但学习使用过程中,发现文件体积较大的项目文件目录(600M),我提交不上去,会返回没有权限这样的异常信息,也许是因为未购买TeamLicense的原因吧 最近在尝试使用SVN进行项目管理,下面介绍一下我的做法,欢迎大家来讨论。 1、Unity编...