Unity 代码优化记录

Unity性能优化 - 脚本篇 Unity性能优化 - 脚本篇。本文主要介绍了什么是脚本性能优化,都有哪些常见的优化方案和一些优化方案细节,以及一些优化方案的优缺点 阅读详情

文档

unity 代码优化分析:https://docs.unity3d.com/Manual/analysis.html

Unity 修复性能问题:https://learn.unity.com/tutorial/fixing-performance-problems-2019-3?courseId=5c87de35edbc2a091bdae346#604586d7edbc2a5b4345d249

实例

具体枚举转Enum类型会有20B的GC

  • 考虑判断原来一致不重复赋值

  • 考虑使用整形存储代替枚举
    在这里插入图片描述


减少使用Enum.TryParse

  • 频繁调用考虑用字典存起来
    在这里插入图片描述

避免频繁调用匿名函数

GC 闭包和匿名方法

  • 减少闭包和匿名函数使用频率。
  • 在这里插入图片描述

在这里插入图片描述


Shader属性用ID代替字符串

Shader.PropertyToID

  • 动画key 和 材质属性考虑初始化先转成对应ID,调用时使用ID。

在这里插入图片描述


减少字符串拼接

Repeated string concatenation

  • 重复的拼接,提前初始化,考虑static,所有组件公用。
    在这里插入图片描述

减少GameObject.Find使用

Find 和 FindObjectOfType
在这里插入图片描述


干掉高耗时,但没有实际影响的物理计算

  • 因为demo中物理引擎只用计算网格相交,不需要重力,受力,速度等参数,所以不需要计算速度约束和位置约束等。考虑增加开关控制。

在这里插入图片描述
在这里插入图片描述


减少查表频率和提前初始化List

  • 常量List避免每次计算new

  • 读表避免频繁调用原始接口重复查找

在这里插入图片描述

在这里插入图片描述


减少 int32.tostring()

  • 避免循环里重复调用相同耗时操作
    在这里插入图片描述

用GPU Instance 减少DrawCall

GPU Instance 深入浅出 知乎

https://docs.unity.cn/cn/current/Manual/GPUInstancing.html

  • demo中血条搞了个类似液体晃动,怪物很多,没用GUP Instance的话,每个怪物都要调一次DrawCall,相同材质和网格的怪物可以合并成一次DrawCall,需要调整shader和C#代码。
shader修改

在这里插入图片描述

C#修改
  • Renderer.GetMaterial() 可以查看源码GraphicesScriptBindings.cpp中GetAndAssignInstantiatedMaterial
    在这里插入图片描述
结果对比
  • 合批前,每个怪物血液一次DrawCall,合并后所有怪物一次DrawCall。
    在这里插入图片描述

公共只读字段改为静态

公共只读字段,用const或static readonly
在这里插入图片描述

在这里插入图片描述


HashSet代替List循环查找、或判断

在这里插入图片描述


字典等容器复用

为尽量减少容器new带来的gc以及碎片化内存,部分场景可以循环利用容器。

需注意容器复用应尽量在相同使用场景复用,不同使用场景需求的容器大小不同可能造成容器频繁Resize或产生冗余分配。

当然在容量大小确定的情况下使用Native容器作为替代方案也是可以的。
在这里插入图片描述


怪物创建峰波耗时处理

对于短时间内进行大量对象的创建等耗时逻辑,采取的优化方案一般是:分线程处理和分帧处理。

比如短时间内创建大量怪物,采取了分帧处理,限制了每帧最大创建怪物数量。
在这里插入图片描述


字典Key 用int代替String

  • 提前计算String.GetHashCode(),并作为字典key。需要注意可能存在哈希冲突,在分配key时需要处理冲突。
    在这里插入图片描述

用数组代替字典

  • 快个三四倍。

  • GetCom<T>()实体组件原来是传Type类型,底下是Dictionary<Type, XXX>,这个RuntimeType.GetHashCode() 也比较耗时。因为组件数量有限,所以直接分配一个数组,每个组件占一个索引,取得时候用int索引取组件GetCom<T>(int TypeID)。

  • 下图红色框。
    在这里插入图片描述


字典字缓存成员变量

  • 频繁取的,但又修改少的,比如怪物移动速度,自己缓存个成员变量。下图绿色框。
    在这里插入图片描述

属性改用成员变量

  • 上图白框。

  • 通常不考虑极端性能时还是推荐用属性。属性编译后实际成了方法,多一层调用堆栈。
    在这里插入图片描述

  • 也可以使用内敛方式[MethodImpl(MethodImplOptions.AggressiveInlining)],把属性代码编译到调用处。
    在这里插入图片描述


Unity 优化记录 2021/01/26 一、代码中只要get了material就会产生material instance 解决方案: 使用MaterialPropertyBlock 阅读详情

相关推荐

Unity 中的 10个代码优化小技巧

Unity 中的 10个代码优化小技巧 又到了开学导员开会的时候。满屋子的学生听着比讲课还无聊空洞的东西,于是整齐地打开了手机。于是就在知乎看到了 默然的这篇文章: Unite Talk 让INSIDE实现稳定60帧的工具,技巧和技术 该文翻译了 Unite 2016 《INSIDE》开发人员的演讲。其中介绍了 10 个 Unity 代码优化技巧。我觉得非常有意思和有启发性,但里面有些地方我持存疑态度,所以写篇文章进行记录,和验证。 1、通过合理的计算顺序来减少矢量操作次数 来看下面这几行代码: Vecto

白菊花瓣的博客 1531

unity中TryParse的用法

功能:将age转化为int类型,若转化成功,将值赋给ageTemp,并将返回true,若转化失败,返回false。showmessage = "年龄范围必须为1-100";showmessage = "年龄必须输入数字\n";

m0_51889842的博客 704

【Unity 优化篇】 | 优化专栏《导航帖》,全面学习Unity优化技巧,让我们的Unity技术上升一个档次

游戏引擎 是游戏开发中最基础也是最重要的开发工具,而Unity3D则是众多引擎中的佼佼者。 成为一名优秀的游戏客户端开发者,不仅需要常年的实践积累和思考,更需要结实的基础做支撑。 也就是所谓的“基础不牢,地动山摇”。 而优化 则是老生常谈的一个话题了,在任何项目里都扮演着重要角色。 所以本系列专栏是 小Y 参考几本Unity优化书籍、网上的优质优化系列教程 以及 自身的经验整理而成。

努力前行,总会成为自己心中的那道光 8万+

Unity优化策略(常用优化手段)

浅谈Uniy中的常用优化手段

qq_51613678的博客 4564

【unity实战】随机地下城生成1——随机生成地下城初稿(含源码)

如何生成随机地下城? 开始房间?最终房间如何定义?

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1570

unity实战开发之代码优化和常用功能

推荐阅读:  我的优快云  我的博客园  QQ群:704621321  我的个人博客       做某件事的开心之处大概就来源于成就感吧,能带来成就感的事大家是都愿意去做的                      &..

爱上游戏开发 1821

[Unity3D游戏开发] Unity和C# 代码优化

一些基础的关于代码优化提高性能的理论和代码。

m0_62197239的博客 1601

拆解大疆Osmo Pocket:聊聊微型云台里那几根比头发丝还细的线,以及它为啥一开机就‘摇头晃脑’

本文深入拆解大疆Osmo Pocket微型云台的精密硬件结构,揭秘其开机自检时‘摇头晃脑’的奥秘。通过分析无刷电机、霍尔传感器和46AWG同轴线等核心组件,展现了大疆在微型云台设计中的工程智慧与创新技术,特别是FOC控制和陀螺仪的应用,实现了0.1°级的姿态控制精度。

weixin_27869497的博客 670

项目实训(5)——Unity的WebGL部署嵌入Web

智能体部分最终需要嵌入到Web中运行,由于此前没有过WebGL打包的相关经验,所以在完成了基础功能版本之后,我觉得应该首先把测试版本嵌入到Web中以验证可行性,防止后期出现其他问题,因此本部分是关于Unity的WebGL打包相关记录。

m0_73196766的博客 675

基于Dify Agent构建智能客服:攻克知识库查询、多轮对话、安全鉴权与人机协同

基于Dify Agent构建智能客服,并将知识库等核心能力工具化,再通过Chatflow进行流程编排,是一种强大且灵活的策略。它不仅解决了当前AI客服面临的诸多核心挑战,也为未来的功能扩展和智能化升级打下了坚实的基础。希望本文能为您在构建高效、智能的AI客服系统之路上提供有益的参考!dify实验室基于LLMOps平台-Dify的一站式学习平台。包含不限于:Dify工作流案例、DSL文件分享、模型接入、Dify交流讨论等各类资源分享。关注我,获取Dify相关资源(DSL、token、交流群等)。

同名公众号:dify实验室 3742

深度解读扫地机器人的导航原理

科技改变生活,不可否认科技的进步的确为我们的生活带来许多便捷,以智能家电为例,智能电饭煲、智能洗碗机、智能扫地机等产品已逐渐成为家庭的一分子,其中以扫地机表现最为抢眼。能做到智能规划清扫,收割了不少家庭主妇及科技爱好者的芳心。但扫地机并非一开始就这么智能,最初的扫地机只能做到随机式清扫,会频繁出现碰撞现象。 近年来,通过业界的不断努力,目前,扫地机器人已告别乱碰乱撞现象,能做到自主路径...

qq_38403231的博客 6506

Unity2D | 初学笔记

第一次接触Unity,并且跟着视频资料做出了第一款2D像素游戏,因为还有很多不懂的地方,以及在学习过程中感觉有待优化的地方,所以想要通过这篇文章对自己进行一个总结,内容其实都是写给以后的自己。???? 在学习过程中呢,有收获,也遇到问题,这些呢,有可以分为编写代码类,和Unity使用类的 学到就是赚到收获wuhu~Unity使用C#代码 收获wuhu~ 毕竟是初学,感觉还是收获满满的,在这里会选出个人感觉很实用很关键的方法,或者是在之后Unity学习过程中重复使用的方面,所以大多是很基本的知识,以扎实的过程

qq_43389930的博客 2596

汽车测试工程师工作准则

希望这份综合的工作规范能帮助你更好地规划职业发展。如果你对某个特定领域,比如自动驾驶测试或智能座舱测试,有进一步的兴趣,我很乐意提供更具体的信息。

qq_40844444的博客 453

Unity常见的优化解决方案

记录一下,在项目中和学习别人优化的一些优化方案,这些优化方法也不是完全绝对的,很多项目都是需要根据自己的项目情况进行优化的,主要以美术和性能之间找平衡点,时间换空间,空间换时间,关于代码方面的优化不是很多,后期会补上去,欢迎各位大佬评论指出错误。

qq_40558087的博客 4171

SAP会计凭证导入ABAP开发模板+注意点—附带源码

开发并不仅仅只要考虑实现的功能,只实现功能的是程序,考虑到使用场景的是工程。使用bapi校验创建会计凭证的数据,报错和参数和正式创建一致。用途,防止产生错误的凭证,即使财务凭证可以冲销。正式创建会计凭证。隐藏的坑。

小九啥也不会 1232

服务器取证——服务器基础知识

服务器基础知识

记录并分享学习安全的知识点.. 2482

Unity-业余2D游戏制作笔记01-Dialogue System for Unity使用

Dialogue System for Unity-对话UI添加动画

solitaryheart的博客 1071

【数据集】中国区域地面气象要素驱动数据集(CMFD)2.0

中国区域地面气象要素驱动数据集(CMFD)2.0

WW、forever的博客 2982

《麦田物语》项目学习笔记

本文旨在记录我在学习《麦田物语》这个项目时,觉得有趣且有用的知识点,希望以后的我不要忘了下面这些知识哈哈把删除,可以提高整个项目的流畅度可以保存图片设置的预设,方便执行多图片重复的设置配置,而更改的场景部分就是地图场景。而切换地图的原理就:将所有场景添加至一起,将不需要的地图场景卸载,只保留需要的地图场景(而不是原来的使用SceneManager来直接Load)可以更改来单独观察特定的图层,防止瓦片地图绘制到错误的图层上可以用unity自带的来绘制随机瓦片如果是像素游戏,则可以来使得像素更加清晰。

Mikey99的博客 1993

AI Agent在智能广告投放中的应用

随着互联网的快速发展,广告投放市场变得越来越复杂和竞争激烈。传统的广告投放方式往往难以精准地触达目标受众,导致广告资源的浪费。AI Agent作为一种智能的自动化程序,能够在复杂的环境中自主学习、决策和执行任务。本文章的目的在于深入探讨AI Agent在智能广告投放中的应用,研究如何利用AI Agent提高广告投放的精准度、效率和效果,降低成本。范围涵盖了AI Agent的基本原理、相关算法、在广告投放中的具体应用场景以及实际案例分析等方面。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 618

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Unity 自定义日志保存

前言 之前unity5.x在代码中写了debug.log…等等,打包之后在当前程序文件夹下会有个对应的"outlog.txt",2017之后这个文件被移到C盘用户Appdata/LocalLow/公司名 文件夹下面。觉得不方便就自己写了个 代码 using UnityEngine; using System.IO; using System; using System.Diagnostics; using Debug = UnityEngine.Debug; public class DebugTr

weixin_46341003的博客 168

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Alpha冲刺随笔-DAY9-橘色肥猫

今天大家在食堂召开最后阶段的冲刺会议,场面融洽无困难,明天继续完成上次剩下的一些细枝末节。心得体会:今天根据游戏剧情进一步完成了第六部分游戏场景的切换流程,进展顺利。昨天站立式会议到现在的进展:随机化小游戏的生成,保证绝大部分时候有解。今天到明天会议的安排:开发新的解密游戏,使人物与ai博弈。昨天站立式会议到现在的进展:完成了剧情图片的修正和处理。今天到明天会议的安排:继续完成第二幕游戏场景的切换顺序。今天到明天会议的安排:继续完成第二幕游戏场景的切换流程。今天到明天会议的安排:新的章节模型建立。

Legend_secret的博客 214

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Peekaboo—站立式会议+alpha冲刺:Day2冲刺随笔

​ 这个作业属于哪个课程 软件工程实践2022年春-F班 这个作业要求在哪里 团队作业——站立式会议+alpha冲刺 这个作业的目标 站立式会议+Alpha冲刺的汇总 其他参考文献 优快云、博客园 会议照片 燃尽图 今日总结 221900324 安排:个人中心,对战记录界面功能实现 进展:个人中心功能基本实现,对战记录界面列表插入尚有BUG 遇到的难题:Unity UI列表制作 解决方法:网络学习 心得体会:学会Unity UI列表制作 221900311 任务安排:编写部

qq_58130094的博客 1128

运用Unity结合PolicyInjection实现拦截器[结合操作日志实例]

上一篇文章我们通过Unity自身Unity.InterceptionExtension.IInterceptionBehavior实现一个有系统关异常日志记录;解决代码中到处充满的异常记录的代码; 本文则是通过Unity.InterceptionExtension.ICallHandler实现一个操作日志记录功能;在相应操作方法上通过特性Attribute把操作日志进行统一处理;若想了解Unit...

weixin_34037173的博客 234

text显示下标的字体 unity_Unity 中的 10个代码优化小技巧

Unity 中的 10个代码优化小技巧又到了开学导员开会的时候。满屋子的学生听着比讲课还无聊空洞的东西,于是整齐地打开了手机。于是就在知乎看到了 默然的这篇文章:https://zhuanlan.zhihu.com/p/208634789该文翻译了 Unite 2016 《INSIDE》开发人员的演讲。其中介绍了 10 个 Unity 代码优化技巧。我觉得非常有意思和有启发性,但里面有些地方我持存...

weixin_39588084的博客 321

Unity项目 - 捡苹果 Apple Picker

项目展示 Github项目地址:Apple Picker 涉及知识 正投视图 3D场景内树与苹果的图层 记录最高分到本地 准备工作 模型制作: 基本模型创建 树叶:sphere 拉伸为椭圆形,绿色材质球 树干:cylinde 修改为合适尺寸,棕色材质球 苹果:sphere 附加深红金属光泽球 篮筐:cube 修改为合适尺寸,黄色材质球 位置、层级关系 调整树叶树干的位置搭配...

weixin_30851409的博客 395
上一篇: Unity URP的2D光照简介
下一篇: Unity 增量打包AssetBundle
ChiLi_Lin
博客等级 码龄12年 760粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值