Unity游戏中的一些规范和优化建议

一.代码规范和建议

  1. 避免Update LateUpdate等函数内频繁的GC Alloc,避免在Update和LateUpdate内有以下操作:

  2. 调用GetComponet()

  3. 调用FindObjectsOfType()

  4. 使用GameObject.Tag和GameObject.Name

  5. 等等其他有堆内存分配的操作

  6. 避免频繁调用ToString()分配内存

  7. 避免OnGUI的调用

  8. 禁止使用Debug.Log打印log,用框架中的LogManager统一管理

  9. 避免使用枚举或struct做key进行字典查找(除非使用定制的comparer)他们的GetHashCode都有装箱操作,每次调用TryGetValue查找都会有内存分配.

  10. 在使用协程时尽量复用WaitXXX对象,而不是每次分配

  11. 频繁创建和更新的字符串尽量缓存,比如CD时间等

  12. 尽量避免dict.Values操作,直接遍历取Values即可

  13. 使用CompareTag代替GameObject.Tag

  14. 用RayCastNoAlloc替换RayCastAll

  15. 用yield return null 代替 yield reture 0

  16. 如果文件中不需要Update或Start函数等,删掉对应的空函数

  17. 尽量少用lambda,创建带upvalue的lambda对象会产生124B的GC,禁止在Update或for循环中使用

  18. 使用数组的数组,而不是多维数组。如int[i][j]的数组的数代替int[i,j]的多维数组

  19. 尽可能避免使用携程

  20. 禁止使用接受字符串参数的GetComponent等类似函数的重载方法,使用泛型类型的

  21. 代码中需要访问到 Transform 组件的位置数据时, 尽可能使用 localPosition 代替对 position 属性的访问. localPosition存储在transform中,访问该值时,Unity会直接将其返回,而position在每次访问时都会重新计算,如果要经常获取position,可以将其缓存起来。

  22. 避免使用LINQ表达式,部分功能无法在某些平台上使用,会分配大量GC Alloc。

  23. 禁止高频的字符串拼接. 如无法避免, 必须使用 StringBuilder 代替 "+" 操作符进行字符串拼接.

  24. Delegate 回调方法必须适时的解除注册, 否则回调方法所属的对象会一直有引用计数, 继而引起该对象所引用的资源无法得到释放.

  25. 尽量避免使用 Reflection(反射).

  26. 尽量避免使用可变参数(param object[] args), 避免装箱拆箱.

  27. 简单条件判断尽量使用三目运算符: b?x:y.

  28. 注意 List 等容器常用接口的复杂度, 尽量从尾部移除/批量移除(RemoveRange)等.

  29. 在频繁查询数据列表时, 建议使用 HashSet/HashTable 查找时间复杂度低的数据结构, 避免使用 List.

  30. 尽可能为快速产生和消灭的大量对象建立缓冲池.

  31. 尽可能将类或函数声明为 sealed, IL2CPP 会对 sealed 的类或函数进行优化, 变虚函数调用为直接函数调用.

  32. 尽量减少new的次数,预分配/成员变量替代临时new变量等.

  33. 最快的空串比较方法:最快的方法是str.Length == 0其次是str == String.Empty或str == "" 注:C#在编译时会将程序集中声明的所有字符串常量放到保留池中(intern pool),相同常量不会重复分配。(指的是这个"")

  34. 减少Find方法使用。Find()方法会遍历内存中的每个GameObject和组件,随着项目规模的扩张,它的开销将会越来越大。不要频繁的使用Find()和与其类似的方法,可以考虑在Inspector中设置对对象的引用,或者创建一个专门用于管理需要搜索的对象的引用的脚本。

  35. 避免使用Camera.main。 Camera.main 因此遭遇了和 Find() 一样的问题:在内存中搜索了所有的 GameObjects 和 Components,这个使用可能会消耗大。

  36. 尝试使用sqrMagnitude(即magnitude的平方)替代magnitude,减少开平方操作。

  37. 尽量少用模运算和除法运算,比如a/5f,要写成a*0.2f。

  38. 尽量避免在运行时为Transforms重新设置parent。Unity对于在同一个parent下的所有Transforms,内存排布是连续的类似动态数组,运行时重新设置parent可能会导致数组重新分配

  39. 变量和字段如果可以声明为const应该总是被声明为const,如果无法使用const,尝试使用readonly

二.其他规范和建议

  1. 禁止非图集贴图资源不合理的留白. 会影响 UGUI 运行时自动合批.

  2. 资源设置 UI 的贴图资源禁止勾选 Generate Mip Maps.

  3. 禁止使用修改 Alpha 值的方式来隐藏界面.

  4. 尽可能降低 Release 版中图集留白, 提高贴图利用率.

  5. 建议同一 Canvas 中使用到的图集数量控制在三个以内.

  6. 建立合理规划公共图集. 在内存占用/加载频度/引用复杂度之间确定合理的平衡点.

  7. 禁止匿名 GrabPass. 如需使用到 GrabPass 必须命名并尽可能复用.

  8. Shader中尽可能减少多 Pass 渲染, 除非必须这么做.

  9. 尽可能降低 Release 版中 Shader 中的 Keyword 数量.

  10. 尽可能降低 SkinnedMeshRenderer 组件数量.

  11. 禁止逐帧直接使用名称对 Shader Uniform 量进行更新

  12. 尽量避免在 Shader 中使用复杂的计算如: pow/sin/cos/tan/log 等.

  13. 建议在 Shader 中采用预混合或实时混合纹理的方式代替实时地多次纹理采样

  14. 移动平台的 Shader 编码一定要考虑数据精度(float/half/fixed)的合理使用.

  15. 应尽可能减少每帧 Material.GetXX/Material.SetXX的次数, 比如把多个 uniform half 变量合并为 uniform half4.

  16. 尽可能避免将 Animator 的 Culling Mode 属性设置为 Always, 对于不使用 RootMotion 的项目建议选择 CullCompletely.

  17. 尽可能避免使用物理引擎. 建议自行编码模拟物理效果

  18. 使用物理模块的游戏, 建议在 PhysicsManager 中设置矩阵, 会有较大的性能提升

  19. 如使用第三方音频插件, 需禁用 FMOD 模块(Edit -> Project Settings -> Audio -> Disable -> UnityAudio).

  20. 若不需要立体音效, 音频导入设置需勾选 Force to Mono(注: 制作音频时就应该制作单通道的.)

  21. 音频格式: iOS平台一般使用 mp3, Android平台一般使用 ogg.

  22. 无需由逻辑代码访问的渲染资源禁止勾选 Read/Write Enabled, 如网格和图片.

  23. 导入蒙皮网格模型时建议勾选 Optimize GameObject 优化选项, 可极大地降低骨骼层次复杂度, 优化 CPU 性能.

  24. 无动作模型资源必须将 Animation Type 设置为 None, 否则会导致游戏对象挂在不必要的动画脚本, 大量的话会严重影响 CPU 性能.

  25. 导入的模型如果无需用到法线和切线, 必须将导入设置的 Normals 和 Tangents 选项设置为 None.

  26. 导入的模型如果无需参与Unity Lightmap 烘焙, 必须将导入设置的 Generate Lightmap UVs 选项设置为 None.

  27. 禁止在 Release 版中存在任何 OnGUI 相关代码

  28. 禁止在 Release 版中存在任何日常调试相关的 UnityEngine.DeBug 类日志输出

  29. 禁止在 Release 版中开启 "Development Build" 和 "Script Debugging" 选项

  30. 在发布时必须将游戏锁定至合适的帧率(建议 30/60 帧)

  31. 禁止在 Release 版中使用引擎提供的 SendMessage 方法.

 

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

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

相关文章

vue如何获取年月日_BootstrapVue——Vue和Bootstrap的相结合,构建响应式应用更简单...

介绍BootStrap是世界上最受欢迎的构建响应式移动优先网站的框架,Vue是当前最流行的前端框架之一,BootstrapVue则是将两者相结合,使用BootstrapVue,可以使用Vue.js和前端CSS库--Bootstrap v4在Web上构建响应式,移动优先…

计算机图形学:光场

https://zhuanlan.zhihu.com/p/47492390 https://zhuanlan.zhihu.com/c_1035195596059222016

cpu队列长度太长解决方法_CPU中的调试算法对比

批处理系统中采用的调度算法重要指标(吞吐量,周转时间,CPU利用率,公平平衡)非抢占式的先来先服务算法(FCFS):按照进程就绪的先后顺序使用CPU特点:公平,实现简单,但是长进程后面的短进程需要等待…

Mono,CLR,.net,Net Framework之间的关系

先粗略看下各自的意义: .Net:以下这些技术的统称。是一个平台,而.NET平台有一个实现标准,叫做.Net Standard;.Net Framework/.Net Core/Mono:实现了这个标准,其选择的组件不一定相同CLR&#x…

c++矩阵类_数据结构-JavaScript矩阵类的设计与实现

矩阵是线性代数课学习的重点内容之一,也是线性代数常见工具之一,在应用数学、统计分析、计算机科学、计算机图像处理级物理等多学科中均有应用。矩阵主要是指数据的行列排列的形式,由行row与列col所组成,在数学中M*N矩阵是指具有M…

GPU Skin

转自:http://geekfaner.com/unity/blog4_GPUSkin.html GPU Skin这门技术在端游时代属于标配,特别是MMO游戏,但是手游时代就要case by case了,因为手机的GPU资源还是很珍贵的(后处理之类的)。作为技术人员&…

button按钮onclick触发不了_单按钮启停:测试模拟脉冲发生器的动作

灯闪烁所模拟是PLC单方面向控件输出信号的过程,控件也可以向模拟PLC输出信号。做一个带反馈灯的按钮,被按下后点亮,再按一下熄灭,且使按钮自保需要一定的接触时间。对应的PLC程序需要一个脉冲发生器(假设地址为L602) 把按钮触点信…

图形学教程Lecture 2: Review of Linear Algebra知识点总结

视频链接:https://www.bilibili.com/video/BV1X7411F744?p2 课程主页链接:http://games-cn.org/intro-graphics/ 课件PPT链接:http://games-cn.org/graphics-intro-ppt-video/ 1. 点乘 2. 点乘应用 获得两个向量的夹角:衡量两…

code换取微信openid_「干货」微信支付前后端流程整理(Vue+Node)

作者:河畔一角转发链接:https://mp.weixin.qq.com/s/ANLjtieWELr39zhgRAeF1w前言最近有不少同学希望我能够把微信支付的前后端流程整理一下,"虽然买了课程,依然看的比较晕"。实际上,我在2019年下半年出了一篇…

Games101现代图形学入门Lecture 3: Transformation知识点总结

视频链接:https://www.bilibili.com/video/BV1X7411F744?p3 课程主页链接:http://games-cn.org/intro-graphics/ 课件PPT链接:http://games-cn.org/graphics-intro-ppt-video/ 1. 缩放矩阵 2. 反射矩阵 3. 切变矩阵 4. 旋转矩阵 5. 线性…

pytorch forward_pytorch使用hook打印中间特征图、计算网络算力等

0、参考https://oldpan.me/archives/pytorch-autograd-hookhttps://pytorch.org/docs/stable/search.html?qhook&check_keywordsyes&areadefaulthttps://github.com/pytorch/pytorch/issues/598https://github.com/sksq96/pytorch-summaryhttps://github.com/allensll…

Games101现代图形学入门Lecture 4: Transformation Cont知识点总结

视频链接:https://www.bilibili.com/video/BV1X7411F744?p4 课程主页链接:http://games-cn.org/intro-graphics/ 课件PPT链接:http://games-cn.org/graphics-intro-ppt-video/ 1. 3D变换 缩放和平移矩阵 旋转矩阵 欧拉角:rol…

python3 for_Python3: for 表达式

#1.在控制台输入一个成绩score #2.判断成绩, #*如果成绩小于60输出不及格 #60到70 及格 #70到80 中等 #80到90 良好 #90 100 优秀 def level(score_list): # score input("请输入成绩:") # while score!"stop": for sc in score_li…

Hash和红黑树以及其在C#中的应用

参考资料&#xff1a; .Net 中HashTable&#xff0c;HashMap 和 Dictionary<key,value> 和List<T>和DataTable的比较 - 王若伊_恩赐解脱 - 博客园 c#HashSet源码解析_fdyshlk的博客-CSDN博客_c# hashset 红黑树和哈希表的区别 - 安全技术 - 亿速云 一、基本概念…

networkx 标签_networkx绘制BA无标度网络

step1: 导入networkx复杂网络库、matplotlib.pyplot、pandasimport networkx as nximport matplotlib.pyplot as pltimport pandas as pdstep2: 绘制BA无标度网络Gnx.barabasi_albert_graph(1000,1) #generate BA networkposnx.spring_layout(G) #set layoutnodecolorG.degree(…

Unity URP中的多Pass Shader和Planer shadow

一 .Unity移动端软阴影技术总结&#xff1a; https://blog.csdn.net/jxw167/article/details/82422891 二. 平面阴影的原理 https://zhuanlan.zhihu.com/p/42781261 https://zhuanlan.zhihu.com/p/31504088 王者荣耀游戏使用的就是该方法&#xff0c;已经有上线产品验证过…

java连接mongodb_第78天: Python 操作 MongoDB 数据库介绍

MongoDB 是一款面向文档型的 NoSQL 数据库&#xff0c;是一个基于分布式文件存储的开源的非关系型数据库系统&#xff0c;其内容是以 K/V 形式存储&#xff0c;结构不固定&#xff0c;它的字段值可以包含其他文档、数组和文档数组等。其采用的 BSON(二进制 JSON )的数据结构&am…

URP中的2D Light光照在移动端不生效的问题

最近在尝试用URP推出的还在preview阶段的2D Render系统&#xff0c;发现2D光照在打成APK后失效&#xff0c;尝试了些方法后发现把2d光照用到的shader放进设置中的built in shader后可以解决问题&#xff1a;

大连开发区取暖费能微信支付吗_下半年教资报考人数增加,那到底能不能异地报考呢?...

想要每周获取两篇群文件快扫码进群吧~因为教师资格证认定的问题&#xff0c;最近教师资格证备考又被广大考生提上了日程&#xff0c;由于“先上岗&#xff0c;后考证”政策&#xff0c;小编预测下一年教师资格证考试的通过率肯定没有以前那么高了&#xff0c;不少人就想选择异地…

python3项目源代码下载_2019年最值得关注的34个Python开源项目——Let's go!

踏着人工智能、区块链的东风&#xff0c;近年来一路“横冲直撞”的 Python 在实现了从小众语言到主流的完美转身后&#xff0c;一头扎进了 2019&#xff0c;依旧没有透出丝毫停下来的架势&#xff0c;反倒有些越烧越热的味道。本文将为你介绍 2019 年最值得关注的 34 个 Python…