Unity项目优化方案2023

news2025/7/22 18:32:24

每年整个新活,每年出个手游项目。又到了项目收尾的季节,也是最掉头发的时候。这两周开启漫漫的优化之路。

老方法,先按住Ctrl+7,打开profiler性能分析工具,找到性能占用的大头。不用看也能猜到,Batches是优化的重头戏。

一,降低Batches

完成这一步,其实已经做了70%以上的优化工作。但说起来简单,模型、ui、特效七七八八的算下来,都是疑难杂症的点。我们来一个个解决。

1,合理使用静态合批,降低场景模型的batches

在某些场景中,我们的背景,只需要一个模型即可。这里最好的做法,是美术将其合并为一个整的模型;或者像某些游戏一样,用一张超大的背景图作为背景。

但我们美术是外包的,公司的美术人少又比较忙,所以这个工作暂时只能由自己来做了。对于这些场景,由于不是常驻的,所以采用空间换时间的策略,勾选静态static属性。优化结果示例如下:

由上图可见,在某些重复元素比较多的场景中,静态合批无疑是很划算的。

但对于某些重复元素比较少的场景,静态合批的效果就没那么明显,这时候反而会多占用内存。所以我们要分情况合理的使用。

2,合理使用Animation Instancing 技术合并动作模型

由于战斗场景中存在大量的、重复模型的敌人,上限甚至能达到几百个。这个时候不合批肯定会卡死,所以我们需要采用Animation Instancing技术来合并批次。

在理解这项技术之前,我们先来补充点关于模型合批的基础知识,unity基本所有的模型合批都绕不开GPU instancing,它属于unity官方提供的一种合批方案。由于这种方案不支持skinned mesh renderer皮肤网格渲染器,而animation instancing大致原理也是将动画模型转为固定的mesh renderer(此处如果理解有误,请在评论区指出)。

当然我们项目用的是公司优化方案,也是大致思路,将皮肤网格转化为面片,优化结果如下:

3,合理的使用UGUI的图集

对于场景中存在大量重复UI图素的情况下,通常UI会给你自动合批;但当中间被插入图素的时候,就会打断该次合批。

这是的做法有三种,其一为将这些图素合为一张大图并放到一个父节点下面;其二是老版图集或者第三方合图工具(比如TexturePackerGUI);其三是使用UGUI自带的图集功能。我这里使用的是第三种,先打开设置:

然后点击右键创建图集,这里有个问题是新版unity插件都是独立的,所以找不到创建图集的话就先去package中导入相应的插件:

1,相同功能的合为一个图集,通用的合为一个图集;

2,中间插了图素的单独分为上下两个图集

测试方法:

1,空场景观察合并图集前后批次变化

2,综上所述,游戏中观察

4,合理使用面片来代替大批量重复的粒子特效

在我们游戏后期,子弹的射速是非常快的,相对来说子弹的量级也是翻倍增长。这个时候再用粒子就有些不划算了,因为通过测试半透明粒子不会合批,而半透明面片会自动合批。

面片合批效果如下,这是100个面片炮弹自动合批的情况,再多就会生成新的批次。不过总体来说,面片的批次=种类;而粒子特效的批次=数量*种类。

当然面片的效果不如粒子,如果非得用粒子的话,可以参考这个帖子,写shader自己合批。

5,动态合批

这个不需要我们去设置,但要想尽可能的利用动态合批,基本条件为重复物体并且中间不会被插入别的物体。比如4中的特效合批,不过建议还是自己写shader。

二,代码优化

同样是使用profiler性能分析工具,其中可以通过曲线来分析代码占用,通过Memory来检查内存占用。

1,内存泄漏问题

这个也是大致分为资源和代码两个方面去定位。

资源泄漏比较好定位,直接观察场景中的物体变化即可观察到,通常导致资源内存泄漏的原因都是对象池回收不对导致的,多注意这方面的变化即可。

代码泄漏查找起来比较麻烦,目前我只能一步步分析。

而且这种问题一般长时间挂机才能发现,算是比较痛苦的过程,当然解决问题的那一刻必然是喜悦的。

2,代码占用问题

我们可以通过观察内存CPU的占用情况,找到性能占用比较厉害的桢。比如下图中占用忽然几十倍增长,明显是不正常的。

        UnityEngine.Profiling.Profiler.BeginSample("001Script");
        #region 中间是需要分析的代码段,注意不能有return,否则可能会定位问题有误

        #endregion
        UnityEngine.Profiling.Profiler.EndSample();

加上分析代码之后,我们可以点开分析器,找到我们写的脚本,从而具体定位到CPU占用比较厉害的代码段,想办法挪到别的地方或者直接优化掉。

3,其它优化

比如说多用加减乘来代替除法、合理使用数值类型和引用类型等,都是些日常用到的小技巧,就不再一一总结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/395017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaEE简单示例——MyBatis的二级缓存机制

简单介绍: 在之前,我们介绍了关于MyBatis的一级缓存机制,之前我们说过,一级缓存是基于SqlSession的对同一条SQL语句多次查询的时候,会将第一次查询的结果缓存到内存中,之后的所有的相同的查询会直接从内存…

修改redis改key值不改过期时间

今天在做图片验证码的时候遇到一个问题。用redis的生命周期来存放,用户输入错误次数。 三十秒内输错三次就,等待三十分钟。 那么问题来了,如果说第一次输入错误,应该是 key为用户用,value 为 次数2 ex就为30秒 &…

[数据结构]:13-插入排序(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 插入排序实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SortCommon.cpp 05-SortFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容,除其中使用到C引用外,全为C语言代…

M2E2: Cross-media Structured Common Space for Multimedia Event Extraction 论文解读

Cross-media Structured Common Space for Multimedia Event Extraction 论文:multimediaspace2020.pdf (illinois.edu) 代码:limanling/m2e2: Cross-media Structured Common Space for Multimedia Event Extraction (ACL2020) (github.com) 期刊/会议…

【3D点云】目标检测总结(持续汇总)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…

Java Spring 中 Resources 路径若干问题

ant-style资源路径通配符 ANT通配符有三种: 最长匹配规则(has more characters),即越精确的模式越会被优先匹配到。例如,URL请求/app/dir/file.jsp,现在存在两个路径匹配模式/**/*.jsp 和 /app/dir/*.js…

C++回顾(九)——多继承

9.1 多继承 9.1.1 概念 一个类有多个直接基类的继承关系称为多继承(多个父类)多继承声明语法 class 派生类名 : 访问控制 基类名1 , 访问控制 基类名2 , … , 访问控制 基类名n {数据成员和成员函数声明 };类 C 可以根据访问控制同时…

Git在某个节点切出新分支

操作前,必须先备份分支,避免丢失代码!!!! 操作前,必须先备份分支,避免丢失代码!!!! 操作前,必须先备份分支,避…

Mr. Cappuccino的第46杯咖啡——Maven多模块项目可插拔式打包部署方案

Maven多模块项目可插拔式打包部署方案需求调研前准备项目结构模块之间的依赖关系项目pom文件项目代码代码运行效果方案调研需要实现的效果解决方案代码实现打包运行效果完整打包测试插拔式打包测试最佳实践项目结构测试运行效果完整打包测试插拔式打包测试需求 早期的【train-h…

吐血整理,自动化测试pytest测试框架,资深测试带你少走弯路......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 Pytest框架详解 py…

ledcode----丢失的数字

目录 题目截图: 题目接口: 第一种解法: 思路: 第二种解法:差值法 思路: 第三种解法:位运算异或法 关于异或操作符的预备知识: 思路: 例子:输入数组[0…

海思3531a pjsip交叉编译

学习文档: PJSUA2 Documentation — PJSUA2 Documentation 1.0-alpha documentationhttps://www.pjsip.org/docs/book-latest/html/index.html ./configure --prefix/opensource/pjproject-2.12/build3531a \ --host/opt/hisi-linux/x86-arm/arm-hisi…

MySQL全解[集群篇]

目录日志错误日志二进制日志格式查看删除查询日志慢查询日志主从复制原理docker搭建分库分表拆分策略垂直拆分垂直分库垂直分表水平拆分水平分库水平分表实现技术MyCat2mysql2对比mycat1.xdocker运行mycat2日志 错误日志 错误日志是 MySQL 中最重要的日志之一,它记…

NYUv2生成边界GT(2)

由NYUv2生成边界GT(1)可知,我们每张GT图片都生成一个对应的.bin文件。存放在D:\datasets\data_proc\train\edge_labels_40文件夹下,下一步我们需要生成.png文件,即需要使用convert_bin_to_png.py。 # -*- coding: utf-8 -*- import numpy as…

【Azure 架构师学习笔记】-Azure Storage Account(1)- Queue Storage

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Storage Account】系列。 接上文 【Azure 架构师学习笔记】-Azure Storage Account(1)-类型简介 前言 Azure Storage Queues 是一个专门用来处理基于云环境队列的Azure 服务。每个队列都维护着…

Netty之ChannelHandler初解

目录 目标 Netty版本 Netty官方API 实战 Netty服务器 入栈ChannelHandler读入数据顺序案例 出栈ChannelHandler写出数据顺序案例 ChannelHandlerContext和NioSocketChannel写入数据时有什么不同 Pipeline添加多个ChannelHandler有什么意义 目标 掌握ChannelHandler基…

海康工业相机使用教程

工业相机使用一、硬件连接1、准备材料2、相机供电(1)区分电源适配器正负极(2)连接相机电源线缆(3)连接完成后,相机蓝色灯常亮则成功3、软件连接(1)MVS客户端下载地址&…

你真的会在阳光下拍照片么?

你好,我是小麥。 上节课我们讲了如何通过影子判断光的质量,也就是光的软硬,这节课我们来接着说一说光的方向和环境光的实际运用。 虽然在现实生活里,我们可能没有从软硬的角度观察过光线,但我相信你在拍照片的时候一…

第九章:Java集合

第九章:Java集合 9.1:Java集合框架概述 数组、集合都是对多个数据进行存储(内存层面,不涉及持久化)操作的结构,简称Java容器。 数组存储多个数据方面的特点 一旦初始化以后,其长度就确定了。数组一旦定义好&#xff…

计算机操作系统:实验三存储管理程序设计

一、目的和要求 目的 存储管理的主要功能之一是合理地分配主存空间。请求页式管理是一种常用的虚拟存储管理技术。 本实验的目的是通过请求页式存储管理中页面置换算法的模拟设计,来了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。 要求…