搜索Unity

Unity中不能做什么:要避免的最常见错误

上次更新时间:2018年12月

本页内容简介:您在整个开发过程中需要参考的指南。遵循Unity技术支持工程师Valentin Simonov的重要提示,这将有助于您建立一个智能,高效的开发流程,并最终发布更好,更高性能的内容。

计划

任何软件开发项目中最重要的部分,因为在此阶段做出的决策在开发周期的后期将很难改变。

在开始项目之前缺乏研究

  • 检查所有计划的功能是否确实适用于所有目标平台。

未指定项目的最低支持设备

  • 定义内容的最低支持设备。
  • 将它们提供给您的开发和QA团队。
  • 这样,您将能够设定实际的性能和帧预算。

在早期阶段没有设定帧和资源预算。

  • 定义以下各项的预算:
    • 模型 — 目标设备能够渲染多少个顶点?
    • 资源 — 模型和纹理应该有多详细?
    • 脚本和渲染 — 您对逻辑、渲染、特效和其他子系统拥有的帧的百分比是多少?

更多技巧:

优化图形性能

对角色建模以实现最佳性能

在早期阶段没有设定场景和预制件分解。

... 或者(换言之)每个人都在同一个场景中工作。

  • 将关卡拆分成(附加加载)场景。
  • 将单独的对象移动到预制件并在单独的场景中进行编辑。
  • 针对主场景锁定机制达成一致。

资源管线过程计划不周

此过程即根据美术师对项目的规范获取所有资源。

  • 如果可能,请从一开始就让技术美术师参与制定此过程。
  • 定义有关资源格式和规范的明确指南。
  • 添加导入时间测试。

更多技巧:

艺术资源最佳实践指南

Unity资源导入

您没有排队的Build和QA过程

  • 设置构建机器,或者开启并设置Unity Teams
  • 如何将功能发布到发布版本?
  • 如何测试新版本?
  • 这些测试是否自动执行?
  • 是否记录统计数据?

Unity设置Cloud Build

在建立初始原型之后没有重新开始项目

在构建原型并获得管理层批准后,强烈建议从头开始考虑。

  • 在制作原型过程中做出的决策通常有利于速度。
  • 将游戏置于一堆黑客中对任何项目来说都不是一个好的开始。

Unity最佳实践:规划

开发

开发过程中的不良做法和错误都会降低团队的开发速度并降低最终产品的质量。

版本控制设置不正确

  • 使用文本序列化(Unity中的默认设置)。
  • 设置内置YAML合并工具。有关此处的更多信息,请单击
  • 设置提交挂钩。有关更多信息,请单击在这里

未使用缓存服务器

静态数据存储在JSON或XML文件中

  • 这导致加载缓慢。
  • 解析会产生垃圾。
  • 相反,对于内置静态数据,将ScriptableObjects与自定义编辑器工具结合使用。

项目包含未使用的资源、插件和重复的库

项目中未使用的资源很可能会内置到游戏中。确保不要在项目中留下垃圾 — 如果设置了版本控制系统,应该很容易恢复文件。

  • 检查Asset Store中有哪些依赖性资源拖入了项目。您可能会惊讶地发现项目中有5个不同的JSON库。
  • 早期制作原型的过时资源和脚本。
  • 将旧资源移动到"removed"文件夹的做法仍会导致将资源和脚本内置到游戏中。

重复性操作需要手动处理

  • 对于任何重复性任务,都应该使用脚本自动执行。
  • 确保您可以从任何场景中"运行"游戏或制作交互内容。
  • 自动执行构建过程的所有步骤,以便可以使用云构建构建应用程序或通过按下按钮在本地构建应用程序。

仅在Editor中对项目进行性能分析

  • 始终在目标设备上对内容进行性能分析;如果仅在Editor中进行性能分析,可能会留下实际的性能瓶颈。

Unity Profiler

不使用内置和平台特定性能分析和调试工具

更多技巧:

一般性能优化

着色器性能分析和优化技巧

Unity帧调试器

在开发周期中进行性能分析和优化为时已晚

  • 等待进行性能分析的时间越长,性能成本就会越高。
  • 在早期阶段开始性能分析,以便确保项目符合帧、内存和磁盘大小预算。

优化不基于测试数据

  • 确保正在优化实际瓶颈。
  • 使用上面指定的工具收集正确的数据。

对目标平台的知识掌握不够

  • 确保拥有足够的相关目标平台知识。
  • 桌面、移动端和游戏主机平台有截然不同的瓶颈。

Unity最佳实践:开发

资源设置

资源(模型、纹理、声音)占据游戏的大部分大小。只要项目中有一个错误的网格,就可能让开发工程师执行的所有优化变成无用功。

未正确设置精灵图集

  • 使用第三方工具(如Texture Packer)在Unity中同时构建图集或组精灵。这将减少游戏中的绘制调用次数。

未正确设置纹理设置

  • 确保知道目标平台的正确纹理设置:
    • 平台支持何种压缩?
    • 纹理是否需要Mipmap?
  • 设置一种自动执行方式,使用AssetPostprocessor API为新纹理应用这些设置,如如此项目所示所示
  • 防止美术师使用错误的设置提交纹理。

Unity资源导入设置

资源包包含重复的纹理

  • 设置资源包构建系统很容易出错。如需获取正确的指导,请单击在这里。对于重复的纹理来说尤其糟糕。
  • 使用资源包浏览器可跟踪依赖关系。

Unity最佳实践:资源设置

编程

代码架构和开发中的不良做法和错误导致效率降低。

代码非常抽象,难以跟进

  • 抽象Enterprise版代码很可能不合理。
  • 它使代码更难以理解。
  • 运行缓慢,并且IL2CPP必须生成更多代码。

未定义建筑惯例或记录不完整:

  • 避免编写代码,以便使用不同的方法完成相同的任务,例如使用不同的:
    • 配置格式(文件、属性、资源)。
    • 事件(Unity事件、C#事件、SendMessage)。
  • 哪个管理器负责哪些对象?

没有透彻理解Unity帧循环

  • 当调用Awake、OnEnable、Update和其他方法时。
  • 当更新协同程序时。
  • 如何执行FixedUpdate。

脚本初始化逻辑依赖Unity执行顺序

  • "它只能以这种方式工作"或滥用Script Execution Order。

脚本逻辑或动画未考虑帧率

  • 将Time.deltaTime用于FPS独立脚本。

更多技巧:

使用Scriptable Objects进行构建的三种有效方法

拥有更好的脚本编写体验

Unity最佳实践:编程

CPU性能

高CPU使用率导致"滞后"的游戏玩法体验并且会使电池消耗更快。

Unity CPU Profiler

太多脚本使用了Update()方法

  • Native > Managed调用有一些开销。请参阅此博客文章,了解更多详细信息。
  • 使用自定义管理器。

所有自定义行为都从定义Update/Awake/Start方法的抽象类继承

  • 现在,所有脚本都使用了Update()方法。

所有游戏系统的每一帧都会更新

  • 定义更新游戏/内容中不同系统的频率,例如:
    • 移动对象。
    • AI和路径查找。
    • 记录并保存游戏状态。
    • 其他"重型"系统。

不缓存经常需要的对象的数据和引用

经常需要缓存数据:

  • 反射
  • Find()
  • Camera.main
  • GetComponent()

没有合并经常实例化的对象

  • 初始化对象很慢。
  • 在游戏开始时创建对象池。
  • 重用对象而不是创建新对象。

每帧都分配内存

  • 即使为每帧分配很小的内存也迟早会导致出现GC峰值。
  • 尝试消除所有分配。

使用API分配内存,而不是非分配替代方案

  • LINQ。
  • 字符串连接。
  • Unity API返回数组:
    • Physics.RaycastAll、Mesh.vertices、GetComponents等。

更多技巧:

使用C#数据结构和Unity API进行最佳工作

Unity最佳实践:CPU性能

GPU性能

高GPU使用率导致低帧率、电池消耗更快且游戏/内容"运行缓慢"。

Unity GPU Profiler

对于移动端:项目过度绘制太多

  • 移动端GPU每秒只能绘制一定数量的像素。
  • 过度绘制是移动端的最大性能瓶颈之一。
  • 不要绘制不必要的透明图像。
  • 使用多个复杂的网格裁剪完全透明的区域。

对于移动端:着色器太复杂

  • 请勿在移动端使用标准着色器。
  • 创建自定义专用着色器。
  • 使用简化版本或对低端设备关闭一些特效。

前向渲染使用太多动态光照

  • 每个光照为每个被照亮的对象添加渲染通道。

项目中的错误设置会中断动态批处理

  • 只有"相似"的对象才能进行动态批处理。
  • 帧调试器显示未批处理某些对象的原因。

未使用或未正确设置LOD

  • LOD能让渲染更多的对象占用更少的资源

更多技巧:

为什么没有批处理绘制调用

移动端优化最佳实践

Unity最佳实践:GPU性能

UI性能

Unity UI是一个非常适合美术师使用的工具,但很容易出现设置错误,从而消耗大量CPU和GPU资源。

Unity UI

未考虑不同的分辨率和宽高比

  • 在分辨率和宽高比不同的设备上测试UI
  • 有时,最好为不同的设备创建不同的UI屏幕

动画元素在同一个画布中

  • 当元素改变时,画布必须创建新的组合网格
  • 对于复杂的画布,这可能会消耗很多资源
  • 将动画元素移动到单独的画布中

未优化"打开"新窗口

  • 创建新窗口或大量UI时,游戏体验明显会出现滞后。您应该尽量减少这种影响。
  • 降低UI窗口复杂性。
  • 拆分部分UI。
  • 缓存窗口。

列表包含大量项目

  • 动态重用列表项目,而不是一次性创建所有列表项目。
  • 在列表中创建嵌套的画布。
  • 使用开源实现,例如此例

请参阅:

Unity UI优化技巧

Unity最佳实践:UI性能

更多资源

您喜欢本文吗?请告诉我们!

喜欢。继续发送 还行。有待改进

Unity Buffbot让您的工作更轻松

注册接收Unity专家每周提供的技术与创意知识。

订阅
明白了

我们使用Cookie来确保在我们的网站上为您提供最佳体验。有关更多信息,请访问我们的Cookie政策页面