一、引擎核心特性测试(区别于普通应用)
常见bug
- 多个场景切换后,资源未清理,叠加显示;
- 多个场景切换后,资源不显示,为空;
- 多个场景切换后,App卡死;
- 多个场景切换后,内存泄漏,App崩溃;
- 进入某个场景,内存泄漏,App崩溃;
- 进入某个场景,App卡死;
- 进入某个场景,停留(场景有动态),App卡死;
- 进入某个场景,操作某个动作后,App卡死;
- 穿模;
- 不同画质下测试;
- 渲染顺序;
- app启动后,加载不出(资源下载卡死)——更新为资源下载完毕后,进入app
- 热更失败。
这些是 U3D 项目最容易出问题的地方,也是测试的重点。
| 测试维度 | 关键测试点 & 注意事项 |
|---|---|
| 1. 场景管理与加载 | • 场景切换:测试场景切换时的加载时间、进度条是否准确、是否有卡顿。 • 场景异步加载:在加载过程中,测试玩家是否能进行一些交互(如查看提示、取消加载)。 • 内存管理:重点关注场景切换时是否存在内存泄漏。使用 Profiler 观察,确保上一个场景的资源被正确卸载。 |
| 2. 物理系统 | • 碰撞检测:测试所有碰撞体(BoxCollider, SphereCollider等)的触发和碰撞事件是否准确。特别注意 MeshCollider 的性能消耗。 • 物理材质:测试摩擦力、弹性等物理材质参数是否符合预期表现。 • 刚体运动:测试物体运动是否符合物理规律,特别是在高速移动时是否会“穿墙”( tunneling 效应,需启用 Continuous Detection)。 |
| 3. 动画系统 | • 动画状态机:测试各个动画状态之间的切换条件是否正确、过渡是否平滑自然。 • 动画事件:测试在动画特定帧触发的事件(如脚步声、攻击判定)是否准时、准确。 • 根运动:如果使用根运动,测试角色移动是否与动画同步,且不会与物理系统或导航系统冲突。 |
| 4. UI 系统 (uGUI) | • 多分辨率适配:在不同屏幕比例和分辨率下,测试 UI 元素是否按锚点设置正确显示,是否会错位或被裁剪。 • 输入交互:测试 UI 按钮的点击、长按、拖动等操作是否灵敏,特别是在移动设备上。 • 渲染顺序:测试 UI 与 3D 世界的渲染顺序是否正确(如世界空间的 UI 是否被场景物体错误遮挡)。 |
二、内容与资源管理
资源是 U3D 项目的基石,管理不善会导致各种诡异问题。
| 测试维度 | 关键测试点 & 注意事项 |
|---|---|
| 1. 资源加载与卸载 | • AssetBundle:测试 AssetBundle 的加载、依赖关系、热更新和卸载。重点检查资源引用计数,防止卸载后仍被引用导致崩溃。 • Resources 文件夹:避免滥用,了解其内存占用情况。 |
| 2. 音视频播放 | • 格式兼容性:测试不同格式(.mp3, .wav, .ogg等)在不同平台上的播放是否正常。 • 混音与优先级:测试多个音源同时播放时的混音效果,以及音效优先级设置是否正确(如背景音乐不会被 UI 音效切断)。 |
三、平台相关测试
U3D 的“一次编写,多平台发布”特性,使得平台测试至关重要。
| 测试维度 | 关键测试点 & 注意事项 |
|---|---|
| 1. 输入设备 | • PC:测试键盘、鼠标、游戏手柄的输入映射是否正确。 • 移动端:测试触屏手势(单点、多点触控、滑动、缩放)的响应是否准确和流畅。 • 主机/VR:测试特定控制器的输入和体感功能。 |
| 2. 平台特性与限制 | • iOS:关注内存限制、热更新政策(不能使用 C# 脚本热更)、应用后台/前台切换时的行为(如游戏暂停、音频中断)。 • Android:关注设备碎片化(不同芯片、系统版本)、存储权限、应用切入后台后的生命周期。 |
四、性能与底层测试
这部分需要与开发紧密合作,使用专业工具。
| 测试维度 | 关键测试点 & 注意事项 |
|---|---|
| 1. 性能分析 | • Unity Profiler:这是最重要的工具。必须学会看 CPU(主线程、渲染线程)、GPU、内存、物理、动画等模块的性能开销。定位性能瓶颈(如 Draw Call 过高、GC 频繁)。 • 图形渲染:测试不同画质等级下的帧率表现,检查是否有 Overdraw(过度绘制)。 |
| 2. 底层与框架 | • 单例与管理器:测试游戏内各种管理器(如音频、场景、事件管理器)的生命周期,确保它们在场景切换时不会被意外销毁或重复创建。 • 事件系统:测试自定义事件系统的监听和派发是否正确,特别注意事件监听者的注册与注销,避免内存泄漏。 |
总结:U3D功能测试核心思维
-
“引擎思维”:不要只把自己当成黑盒测试员。要理解 GameObject、Component、Scene、Prefab 等核心概念,这样才能预判问题所在。
-
“性能意识”:功能正确只是第一步,性能达标才能称为“可发布”。任何功能改动后,都要跑一遍 Profiler 看看性能曲线。
-
“平台视野”:在 PC 上完美运行不代表在目标平台(尤其是手机)上也能完美。尽早、频繁地在目标真机上进行测试。
-
“工具驱动”:熟练掌握 Unity Editor、Profiler、Frame Debugger 等工具,它们是发现和定位 U3D 特有问题的“火眼金睛”。
五 工具
Unity Editor、Profiler 和 Frame Debugger 是 Unity 开发中非常重要的工具,它们各有专长,能帮助我们解决不同类型的问题。下面这个表格能帮你快速了解它们的核心区别:
| 工具名称 | 主要测试/分析范畴 | 核心功能与定位 |
|---|---|---|
| Unity Editor | 综合开发与基础测试 | 核心集成开发环境,用于场景构建、脚本编写、基础功能验证和简单性能观察。 |
| Profiler | 运行时性能深度分析 | 强大的性能分析工具,用于定位CPU、GPU、内存、渲染等性能瓶颈和内存泄漏。 |
| Frame Debugger | 渲染管线逐帧调试 | 用于分解和审查一帧画面的具体渲染过程,查看每个绘制调用及其他渲染事件。 |
🔍 如何用Profiler探查内存泄漏
内存泄漏的本质是程序不再需要的内存未能被及时释放。在Unity中,这通常表现为某些对象(如纹理、网格、GameObject)数量异常持续增加,或总体内存占用不断攀升。你可以通过以下步骤来观察和定位:
-
开启Profiler与录制
-
在Unity Editor中,通过顶部菜单 Window > Analysis > Profiler 打开Profiler窗口。
-
确保窗口顶部的 Record (录制) 按钮处于开启状态,然后运行你的游戏或场景,让Profiler开始收集数据。
-
-
观察内存趋势
-
在Profiler窗口顶部区域,选择 Memory 模块。
-
重点关注图表中 Total Allocated Memory (总分配内存) 和 GC Used Memory (垃圾回收器使用的内存) 的变化趋势。如果看到这些数值在游戏运行过程中(尤其是在应该释放内存的操作后)持续上升,且没有回落,这就可能是内存泄漏的迹象。
-
-
捕获详细快照
-
对于更深入的分析,可以使用 Memory Profiler包 (一个独立的、功能更强的内存分析工具)。它允许你捕获和比较内存快照。
-
捕获不同时间点(例如,加载某个场景前和加载后,再卸载后)的内存快照。
-
对比这些快照,查找哪些对象的数量异常增加或未被释放,这往往是内存泄漏的源头。
-
-
分析具体对象分配
-
在Profiler的 Memory 模块详细信息面板中,可以查看 Detailed 视图。这里会列出已加载的对象,例如纹理、材质和游戏对象。
-
特别留意 Object Count (对象计数),如果这个数字随时间推移而上升,可能意味着游戏创建了一些永不销毁的对象。
-
🛠️ 应对与避免内存泄漏
探查到问题后,预防和解决同样重要:
-
管理对象生命周期:确保适时销毁(Destroy)不再需要的UnityEngine.Object,特别是动态生成的GameObject。
-
警惕事件与委托:记得将监听的事件和委托在适当时候取消注册,防止意外引用导致对象无法被回收。
-
善用对象池:对于需要频繁创建和销毁的对象(如子弹、敌人),使用对象池(Object Pooling) 进行重用,能有效减少内存分配和垃圾回收压力。
-
审慎使用AssetBundle:加载AssetBundle后,务必按照正确流程进行卸载,避免资源残留和重复加载。
浙公网安备 33010602011771号