• Unity开发规范(综合)


    开发代码

    1. 编码(Unity 引擎相关)

      • 规范等级 S
        100. 禁止通过 new 的方式实例化 MonoBehaviour 的派生类, 否则无法得到引擎的有效管理.
        101. 禁止在 Update/FixedUpdate/LateUpdate/OnGUI 等频繁调用的逻辑中使用协程.
        102. 禁止使用 Resources.Load 加载资源, 个别情况除外.
        103. 禁止使用 LINQ 表达式.

      • 规范等级 A
        120. 禁止使用 Invoke("MethodA", 2) 来实现延时调用.
        121. 禁止逐帧使用 Find/GetComponent 等引擎接口调用, 如有此类需求, 应该将结果缓存供后续使用.
        122. 必须使用 GetInstanceID() 获得的 int 值代替 UnityEngine.Object应用进行比较或作为散列表数据类型.
        如 Dictionary 和 HashSet 的 key.
        123. 当设置 GameObject 对象之间的父子关系时, 如果仅关注逻辑上的层次关系而无需保持子对象的空间方位, 则应该使用SetParent(parent, false) 避免空间转换的性能消耗.
        124. 代码中需要访问到 Transform 组件的位置数据时, 尽可能使用 localPosition 代替对 position 属性的访问.
        125. 尽可能避免使用协程. Unity 的协程是使用迭代器实现的会分配堆内存.
        126. 尽可能避免使用 MeshCollider 组件. 如有此类需求也应尽可能减少网格碰撞体的面数. 或使用 Sphere/Box/Capsule 的组合来代替.
        127. 使用网格导航时, 应尽可能避免使用 Obstacle 模拟动态障碍物, 否则对 CPU 性能冲击很大. 如有此类需求建议使用碰撞体代替.

      • 规范等级 B
        140. 禁止使用接受字符串参数的 GetComponent 重载方法.
        141. 禁止在 MonoBehaviour 的派生类中存在被引擎高频调用的空方法, 如 Update里没有方法内容就应该删掉.
        142. 禁止在 MonoBehaviour 的派生类中存在 Awake/Start/OnEnable/OnDestory 等空方法.
        143. 必须使用 CompareTag 接口比较 GameObject的Tag.
        144. 尽可能减少 UnityEngine.Object null 比较.

      • 规范等级 C
        160. 建议合理使用 OnBecameVisible/OnBecameInvisible/OnWillRenderObject 类似的引擎回调以避免不必要的渲染和计算.

    2. 编码(引擎无关)

      • 规范等级 S
        200. 必须对可能造成功能失效, 影响流程的代码块添加异常捕获.
        201. 禁止高频的字符串拼接. 如无法避免, 必须使用 StringBuilder 代替 "+" 操作符进行字符串拼接.

      • 规范等级 A
        220. 尽可能将 CPU 占用高的逻辑代码分帧处理平摊 CPU 压力.
        221. 尽可能将计算量较大的运算放到子线程中进行, 避免阻塞主线程(如寻路等算法).
        222. Delegate 回调方法必须适时的解除注册, 否则回调方法所属的对象会一直有引用计数, 继而引起该对象所引用的资源无法得到释放.

      • 规范等级 B
        240. 尽量避免使用 Reflection(反射).
        241. 尽量避免使用可变参数(param object[] args), 避免装箱拆箱.
        242. 禁止没有计算需求的变量赋值或计算.
        243. 简单条件判断尽量使用三目运算符: b?x:y.
        244. 注意 List 等容器常用接口的复杂度, 尽量从尾部移除/批量移除(RemoveRange)等.
        245. 在频繁查询数据列表时, 建议使用 HashSet/HashTable 查找时间复杂度低的数据结构, 避免使用 List.
        246. 尽可能为快速产生和消灭的大量对象建立缓冲池.

      • 规范等级 C
        260. 使用可变长容器时, 建议根据预估容量进行初始化.
        261. 循环中寻找到符合条件后应该适时地使用 break 跳出循环.
        262. 尽可能将一些内存占用低但为数众多/功能简单的小对象定义为 struct(结构体) 而非 class(类).
        263. 尽可能减少函数调用栈, 如使用 x = (x > 0 ? x : -x); 代替 x = Mathf.Abs(x).
        264. 尽可能将类或函数声明为 sealed, IL2CPP 会对 sealed 的类或函数进行优化, 变虚函数调用为直接函数调用.

    3. UI

      • 规范等级 A
        320. 禁止非图集贴图资源不合理的留白. 会影响 UGUI 运行时自动合批.
        321. 资源设置 UI 的贴图资源禁止勾选 Generate Mip Maps.
        322. 禁止使用修改 Alpha 值的方式来隐藏界面.
        323. 尽可能降低 Release 版中图集留白, 提高贴图利用率.
        324. 尽可能将图集中大的图片改为底图加载.

      • 规范等级 B
        340. 建议同一 Canvas 中使用到的图集数量控制在三个以内.

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

    4. 渲染

      • 规范等级 S
        400. 禁止匿名 GrabPass. 如需使用到 GrabPass 必须命名并尽可能复用.

      • 规范等级 A
        420. Shader中尽可能减少多 Pass 渲染, 除非必须这么做.
        421. 尽可能降低 Release 版中 Shader 中的 Keyword 数量.
        422. 尽可能降低 SkinnedMeshRenderer 组件数量.

      • 规范等级 B
        440. 禁止逐帧直接使用名称对 Shader Uniform 量进行更新.
        441. 尽量避免在 Shader 中使用复杂的计算如: pow/sin/cos/tan/log 等.
        442. 建议在 Shader 中采用预混合或实时混合纹理的方式代替实时地多次纹理采样.
        443. 移动平台的 Shader 编码一定要考虑数据精度(float/half/fixed)的合理使用.
        444. 应尽可能减少每帧 Material.GetXX/Material.SetXX的次数, 比如把多个 uniform half 变量合并为 uniform half4.

    5. 动画

      • 规范等级 B
        540. 尽可能避免将 Animator 的 Culling Mode 属性设置为 Always, 对于不使用 RootMotion 的项目建议选择 CullCompletely.
    6. 物理

      • 规范等级 B
        640. 尽可能避免使用物理引擎. 建议自行编码模拟物理效果.
        641. 使用物理模块的游戏, 建议在 PhysicsManager 中设置矩阵, 会有较大的性能提升.
    7. 音频

      • 规范等级 A
        720. 如使用第三方音频插件, 需禁用 FMOD 模块(Edit -> Project Settings -> Audio -> Disable -> UnityAudio).

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

    8. 资源

      • 规范等级 A
        820. 音频格式: iOS平台一般使用 mp3, Android平台一般使用 ogg.
        821. 无需由逻辑代码访问的渲染资源禁止勾选 Read/Write Enabled, 如网格和图片.
        822. 导入蒙皮网格模型时建议勾选 Optimize GameObject 优化选项, 可极大地降低骨骼层次复杂度, 优化 CPU 性能.
        823. 无动作模型资源必须将 Animation Type 设置为 None, 否则会导致游戏对象挂在不必要的动画脚本, 大量的话会严重影响 CPU 性能.
        824. 导入的模型如果无需用到法线和切线, 必须将导入设置的 Normals 和 Tangents 选项设置为 None.
        825. 导入的模型如果无需参与Unity Lightmap 烘焙, 必须将导入设置的 Generate Lightmap UVs 选项设置为 None.
    9. 发包

      • 规范等级 S
        900. 禁止在 Release 版中存在任何 OnGUI 相关代码.
        901. 禁止在 Release 版中存在任何日常调试相关的 UnityEngine.DeBug 类日志输出.
        902. 禁止在 Release 版中开启 "Development Build" 和 "Script Debugging" 选项.
        903. 在发布时必须将游戏锁定至合适的帧率(建议 30/60 帧)

      • 规范等级 A
        921. 禁止在 Release 版中使用引擎提供的 SendMessage 方法.

  • 相关阅读:
    mongodb添加延时节点
    AFNetworking 遇到错误 Code=-1016 "Request failed: unacceptable content-type: text/plain"
    使用cocoa捕获dock栏中的“退出”事件,解决qt开发的应用程序退出异常的问题
    【Grails 代理Proxy设置】部署Grails遇到Error Resolve error obtaining dependencies:错误,及解决方法
    【转】MongoDB 3.0 正式版本即将发布,强力推荐
    求数组的一个最大子数组
    MergeSort 归并排序(java)
    java查询几个菜单下的所有下级菜单
    InsertionSort 直接插入排序(java)
    sublime3配置java开发环境
  • 原文地址:https://www.cnblogs.com/sweetXiaoma/p/12658230.html
Copyright © 2020-2023  润新知