Unity性能优化

本文从基础概念出发,详细介绍了Unity性能优化的重要性、常见误区和两大原则。通过Profiler工具进行性能评估,深入探讨脚本、数学计算、Object Pool、图形、文件等方面的优化策略,旨在帮助开发者建立自己的优化方法,提升游戏流畅性和市场适应性。

总结自麦子学院Unity性能优化教程。文末附幕布思维导图总结。

我们玩过的游戏中,神优化和渣优化的案例都不胜枚举,它们直接影响着玩家们的游戏体验。这篇文章将从最基础的概念开始,配合实例讲解各种优化的技巧,最终建立起一套属于自己的优化方法,完成对游戏项目的评估和优化工作。

1. 简介

1.什么是性能优化

1.常见的优化类型
  • 1.性能优化 运行效率空间占用

  • 2.流程优化 精简某个功能的流程

  • 3.体验优化 音乐的节奏,背景的渲染,剧情的跌宕起伏

2.性能优化目标
  • 1.游戏流畅运行

    1.多种帧数标准 30帧手游 端游60帧
    2.避免卡顿 加载大场景,玩家数量增多,怪物增多

  • 2.游戏符合市场需要
    1.硬件兼容性 取舍市场占有率小的机型
    2.安装包/数据包大小 平台渠道的安装包大小限制(60M)

3.优化常见的误区
  • 误区1:我的游戏很简单不需要优化 (性能黑点) 游戏简单是结构玩法简单,不代表不需要进行优化
  • 误区2:优化工作尽早进行 优化工作需要在后期进行,针对主要因素,避免为了5%的问题话费95%的时间
  • 误区3:性能优化=Debug 性能优化的前提是解决所有的代码错误
4.优化的两大原则
  • 1.不过早做优化
  • 2.用户不察觉

    玩家不一定能发现欠优化的地方 玩家感觉不出来的地方
    玩家不一定能发现优化欠佳的地方 优化后玩家也感觉不到差别的地方

5.所有游戏都需要优化吗?
  • 性能完美是我们追求的目标
  • 不同类型的游戏对优化的侧重点不一样
  • 优化工作会占生命周期非常大的一部分

2. Profiler

这里要多查看 官网的API 在Manual 里面搜索 Profiler
Unity3d-Window-Profiler 打开方式。
这个只能是性能评估工具,不是优化工具。
观察Profiler 窗口 测试代码:

using UnityEngine;
using System.Collections;

public class BadExampleProfiler : MonoBehaviour {

    public GameObject cube;

    // Update is called once per frame
    void Update () {

        Loop ();
    }

    void Loop()
    {
        for (int i = 0; i < 100; i++) {
            float x = Random.Range (0,360f);
            float y = Random.Range (0,360f);
            float z = Random.Range (0,360f);
            Vector3 randomVector = new Vector3 (x,y,z);
            Object.Instantiate (cube, randomVector, Quaternion.Euler(randomVector));
        }
    }
}

3.优化的组成部分

脚本

常见的性能黑点(正确的代码放到了错误的地方)底层!!!

1.常规循环   尽量少放在Update

2.变量的隐性调用  go.transform不推荐 (这是一种遍历查找组件的方式) 推荐GetComponent(Transform)(Markdown不支持应该是尖角括号)

3.Gmaeobject.Find 推荐使用Tag查找 保存变量 

4.多线程
协程处理,大量循环使用分携程执行,前边添加yield return设置执行顺序
    IEnumerator Work()
    {
        //线程不安全
        //StartCoroutine(MyIoWork1());
        //StartCoroutine(MyIoWork2());
        yield return StartCoroutine(MyIoWork1());
        yield return StartCoroutine(MyIoWork2());
    }

    IEnumerator MyIoWork1()
    {
        for (int i = 0; i < 1000; i++)
        {
            System.IO.File.Delete("c:\a.zip");
            yield return null;
        }

    }

    IEnumerator MyIoWork2()
    {
        for (int i = 0; i < 1000; i++)
        {
            System.IO.File.Delete("c:\a.zip");
            yield return null;
        }

    }
数学 合理降低计算的精度

这里写图片描述

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值