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.cppGetAndAssignInstantiatedMaterial
    在这里插入图片描述
结果对比
  • 合批前,每个怪物血液一次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)],把属性代码编译到调用处。
    在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Arcgis/GeoScene API for JavaScript 三维场景底图网格设为透明

项目场景&#xff1a; 有时候加载的地图服务白色区域会露底&#xff0c;导致在三维场景时&#xff0c;露出了三维网格&#xff0c;影响效果&#xff0c;自此&#xff0c;我们需要将三维场景的底图设为白色或透明。 问题描述 如图所示&#xff1a; 解决方案&#xff1a; 提示…

snort3.0-ubuntu18.04 64入侵检测安装与使用ailx10ailx10​​知乎知识会员

在日常生活中&#xff0c;很多人怀疑自己的手机、电脑被监控了&#xff0c;担心自己的隐私泄漏&#xff0c;实际上最佳的检测方式就是终端检测&#xff0c;也就是EDR&#xff0c;但是就是有那么多的人在网上大放厥词&#xff0c;说任何EDR杀毒软件都检测不到监控&#xff0c;毕…

AI语言模型的技术之争:DeepSeek与ChatGPT的架构与训练揭秘

云边有个稻草人-CSDN博客 目录 第一章&#xff1a;DeepSeek与ChatGPT的基础概述 1.1 DeepSeek简介 1.2 ChatGPT简介 第二章&#xff1a;模型架构对比 2.1 Transformer架构&#xff1a;核心相似性 2.2 模型规模与参数 第三章&#xff1a;训练方法与技术 3.1 预训练与微调…

AI赋能前端协作:效率提升与团队新动力

当前前端开发领域竞争激烈&#xff0c;项目交付周期紧迫&#xff0c;前端开发团队面临着诸多挑战。沟通成本高、代码规范不统一、开发效率低等问题&#xff0c;常常导致项目延期、质量下降&#xff0c;甚至团队士气低落。而AI代码生成器的出现&#xff0c;为解决这些问题带来了…

Django快速入门

1. 安装 在安装了python环境下&#xff0c;在命令行winr&#xff0c;录入 pip install django或者使用国内源下载 pip install -i https://pypi.douban.com/simple/ django安装完成后&#xff0c;在%python%/Scripts目录下会出现如下图的django-admin.exe的文件 以及django…

Windows可以永久暂停更新了

最终效果图&#xff1a; 第一步&#xff1a; winR组合键打开运行对话框&#xff0c;输入“regedit”&#xff0c;点击“确定”或回车&#xff1a; 第二步&#xff1a; 注册表定位到“\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings”&#xff0c;新建DWO…

在anaconda环境中构建flask项目的exe文件

一、创建并激活虚拟环境 conda create -n flask_env python3.9 # python版本根据项目需求安装 conda activate flask_env # 激活环境二、安装必要依赖 推荐使用conda&#xff0c;pip没尝试过&#xff0c;但是deepseek给出了命令 conda install flask …

C++ Primer 条件语句

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

微服务SpringCloud Alibaba组件nacos教程【详解naocs基础使用、服务中心配置、集群配置,附有案例+示例代码】

一.Nacos教程 文章目录 一.Nacos教程1.1 Nacos简介1.2 nacos基本使用直接下载打包服务源码方式启动 1.3 创建nacos客服端1.4 nacos集群配置1.5 nacos配置中心 1.1 Nacos简介 nacos是spring cloud alibaba生态中非常重要的一个组件&#xff0c;它有两个作用&#xff1a; 1:注册…

在 Navicat 17 中扩展 PostgreSQL 数据类型 - 范围类型

范围类型 PostgreSQL 是市场上最灵活的数据库之一&#xff0c;这已不是什么秘密。事实上&#xff0c;PostgreSQL 的可扩展性和丰富的功能集使 PostgreSQL 近期已超越 MySQL&#xff0c;成为最受开发人员推崇和最受欢迎的数据库系统。在这个使用 Navicat Premium 17 在 Postgre…

内容测试2

备注&#xff1a; 在7月10日记录之前遇到的问题及解决方法: 一&#xff1a;常见的访问问题&#xff1a; 403 Forbidden&#xff1a;&#xff08;未有请求权限&#xff09; 表示服务器理解请求但是拒绝执行它。这通常是由于服务器上的文件或资源没有正确的读、写或执行权限&…

安川伺服控制器MP系列优势特点及行业应用

在工业自动化领域&#xff0c;运动控制器的性能直接决定了设备的精度、效率和可靠性。作为全球领先的运动控制品牌&#xff0c;安川电机伺服控制器凭借其卓越的技术优势和广泛的应用场景&#xff0c;正在为智能制造注入强劲动力&#xff01; MP3100&#xff1a;主板型运动控制…

kafka生产端之架构及工作原理

文章目录 整体架构元数据更新 整体架构 消息在真正发往Kafka之前&#xff0c;有可能需要经历拦截器&#xff08;Interceptor&#xff09;、序列化器&#xff08;Serializer&#xff09;和分区器&#xff08;Partitioner&#xff09;等一系列的作用&#xff0c;那么在此之后又会…

二、交换机的vlan子设备接入

一、交换机的vlan设置-CSDN博客 二、交换机的vlan子设备接入-CSDN博客 接上篇的文章&#xff0c;本文接入了子设备 网络结构如下&#xff1a; 用路由器A和POE交换机B代替第一篇中的笔记本电脑&#xff0c;路由器A和交换机B都关闭DHCP服务&#xff0c;并分别接入一个IPC&#…

DedeBIZ系统审计小结

之前简单审计过DedeBIZ系统&#xff0c;网上还没有对这个系统的漏洞有过详尽的分析&#xff0c;于是重新审计并总结文章&#xff0c;记录下自己审计的过程。 https://github.com/DedeBIZ/DedeV6/archive/refs/tags/6.2.10.zip &#x1f4cc;DedeBIZ 系统并非基于 MVC 框架&…

C语言基本概念————讨论sqrt()和pow()函数与整数的关系

本文来源&#xff1a;C语言基本概念——讨论sqrt()和pow()函数与整数的关系. C语言基本概念——sqrt和pow函数与整数的关系 1. 使用sqrt()是否可以得到完全平方数的精确的整数平方根1.1 完全平方数的计算结果是否精确&#xff1f;1.2 为什么不会出现误差&#xff08;如 1.99999…

浏览器自动化与AI Agent结合项目browser-use初探

browser-use介绍 browser-use是将您的 AI 代理连接到浏览器的最简单方式。它通过提供一个强大且简单的接口来实现 AI 代理访问网站的自动化。 GitHub地址&#xff1a;https://github.com/browser-use/browser-use。目前已经获得了27.3k颗stars&#xff0c;2.7kforks&#xff…

阿里云 DeepSeek 模型部署与使用技术评测

引言 随着人工智能技术的不断发展&#xff0c;越来越多的企业和个人开始探索如何利用深度学习模型来提升业务效率和用户体验。阿里云推出的【零门槛、轻松部署您的专属 DeepSeek 模型】解决方案为用户提供了多种便捷的部署方式&#xff0c;包括基于百炼 API 调用满血版、基于人…

第二天:工具的使用

每天上午9点左右更新一到两篇文章到专栏《Python爬虫训练营》中&#xff0c;对于爬虫有兴趣的伙伴可以订阅专栏一起学习&#xff0c;完全免费。 键盘为桨&#xff0c;代码作帆。这趟为期30天左右的Python爬虫特训即将启航&#xff0c;每日解锁新海域&#xff1a;从Requests库的…

vue项目 Axios创建拦截器

Axios 1. Axios 和 Ajax 简介2. Axios 和 Ajax 的区别3. 从 按钮 到 Axios请求后端接口的 大致顺序 1. Axios 和 Ajax 简介 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09; 不是一种技术&#xff0c;而是一个编程技术概念&#xff0c;核心是通过 XMLHttpReques…