# Tracy Unity 集成示例 本目录包含将 Tracy 性能分析器集成到 Unity 项目的完整示例和工具。 ## 📁 文件结构 ``` unity_examples/ ├── README.md # 本文件 - 项目概述 ├── QUICKSTART.md # 5分钟快速开始指南 ⭐ 从这里开始! ├── CMakeLists.txt # CMake 构建配置 ├── SimplifiedPlugin.cpp # Tracy Unity Plugin C++ 实现 ├── TracyWrapper.cs # Tracy C# API 封装 ├── TracyManager.cs # Tracy 管理器组件 └── TracyExamples.cs # 使用示例和最佳实践 ``` ## 🚀 快速开始 ### 新手用户 如果你是第一次使用,请按以下顺序阅读: 1. **[QUICKSTART.md](QUICKSTART.md)** - 5分钟快速集成指南 2. **[TracyExamples.cs](TracyExamples.cs)** - 查看代码示例 3. **[../UNITY_INTEGRATION_GUIDE.md](../UNITY_INTEGRATION_GUIDE.md)** - 完整的集成文档 ### 有经验的用户 快速集成步骤: ```bash # 1. 编译 Plugin mkdir build && cd build cmake .. -DTRACY_ROOT="/path/to/tracy" -DCMAKE_BUILD_TYPE=Release cmake --build . --config Release # 2. 复制文件到 Unity 项目 cp build/Unity/Plugins/* YourUnityProject/Assets/Plugins/ cp *.cs YourUnityProject/Assets/Scripts/Tracy/ # 3. 在 Unity 场景中添加 TracyManager 组件 # 4. 运行 Tracy Profiler 并连接 ``` ## 📦 文件说明 ### C++ Plugin 相关 #### `SimplifiedPlugin.cpp` Tracy Unity Native Plugin 的 C++ 实现。 **主要功能**: - 初始化/关闭 Tracy - 创建性能追踪 Zone - 绘制实时数值 - 发送消息和日志 - 线程命名 **导出函数**: ```cpp TracyInit() // 初始化 TracyShutdown() // 关闭 TracyFrameMark() // 标记帧边界 TracyZoneBegin(name) // 开始 Zone TracyZoneEnd() // 结束 Zone TracyPlotValue(name, v) // 绘制数值 TracyMessage(msg) // 发送消息 TracySetThreadName(name) // 设置线程名 ``` **编译要求**: - C++17 - Tracy 源代码 - Windows: Visual Studio 2019+ - macOS: Xcode 12+ - Linux: GCC 9+ 或 Clang 10+ #### `CMakeLists.txt` 跨平台 CMake 构建配置。 **支持平台**: - ✅ Windows (x64) - ✅ macOS (Intel/Apple Silicon) - ✅ Linux (x64) - ✅ Android (armeabi-v7a, arm64-v8a) - ✅ iOS (arm64) **配置选项**: ```cmake -DTRACY_ENABLE=ON # 启用 Tracy -DTRACY_ON_DEMAND=ON # 按需分析模式 -DTRACY_ROOT=path # Tracy 根目录 ``` ### C# 脚本相关 #### `TracyWrapper.cs` Tracy 的 C# API 封装,提供简洁易用的接口。 **核心 API**: ```csharp // 初始化 Tracy.Initialize() // 性能追踪 (推荐使用 using 语句) using (Tracy.Zone("FunctionName")) { // 要追踪的代码 } // 手动管理 Zone Tracy.BeginZone("CustomZone") // ... 代码 ... Tracy.EndZone() // 绘制实时数值 Tracy.Plot("FPS", fps) Tracy.Plot("Memory", memoryMB) // 发送消息 Tracy.Message("重要事件发生") // 设置线程名 Tracy.SetThreadName("Worker Thread") // 标记帧边界 Tracy.MarkFrame() ``` **特性**: - 使用 `IDisposable` 自动管理 Zone 生命周期 - 条件编译支持(`TRACY_ENABLE`) - 零开销(禁用时) - 线程安全 #### `TracyManager.cs` Unity 组件,负责 Tracy 的初始化和自动化监控。 **功能**: - 自动初始化 Tracy - 每帧自动标记帧边界 - 自动监控系统指标: - 帧率 (FPS) - 帧时间 - 内存使用 - 渲染统计 - 物理对象数量 **使用方法**: 1. 在场景中创建空 GameObject 2. 添加 `TracyManager` 组件 3. 配置 Inspector 中的选项 4. 运行游戏 **Inspector 选项**: - `Enable On Start`: 启动时自动初始化 - `Mark Frames`: 每帧自动标记 - `Monitor Frame Rate`: 监控帧率 - `Monitor Memory`: 监控内存 - `Monitor Rendering`: 监控渲染 - `Monitor Physics`: 监控物理 #### `TracyExamples.cs` 完整的使用示例和最佳实践。 **包含示例**: 1. ✅ 基础 Zone 使用 2. ✅ 计算密集型操作追踪 3. ✅ 重度计算测试 4. ✅ 对象池管理 5. ✅ 协程性能追踪 6. ✅ 自定义数据绘制 7. ✅ 条件性能追踪 **交互功能**: - 按 `Space` 键: 执行重度计算 - 按 `R` 键: 重置对象池 - 按 `T` 键: 运行性能测试 ## 🎯 使用场景 ### 1. 游戏开发性能优化 ```csharp public class GameController : MonoBehaviour { void Update() { using (Tracy.Zone("GameController.Update")) { using (Tracy.Zone("Update AI")) { UpdateAI(); } using (Tracy.Zone("Update Physics")) { UpdatePhysics(); } using (Tracy.Zone("Update Rendering")) { UpdateRendering(); } } } } ``` ### 2. 资源加载分析 ```csharp IEnumerator LoadScene() { using (Tracy.Zone("Load Scene")) { using (Tracy.Zone("Load Assets")) { yield return LoadAssets(); } using (Tracy.Zone("Initialize Scene")) { InitializeScene(); } Tracy.Message("Scene loaded successfully"); } } ``` ### 3. AI 系统性能追踪 ```csharp public class AIManager : MonoBehaviour { void Update() { using (Tracy.Zone("AI Manager")) { foreach (var agent in agents) { using (Tracy.Zone($"AI Agent {agent.id}")) { agent.UpdateBehavior(); } } Tracy.Plot("Active AI Agents", agents.Count); } } } ``` ### 4. 网络同步分析 ```csharp void OnNetworkUpdate() { using (Tracy.Zone("Network Update")) { using (Tracy.Zone("Receive Packets")) { ReceivePackets(); } using (Tracy.Zone("Process Messages")) { ProcessMessages(); } using (Tracy.Zone("Send Updates")) { SendUpdates(); } Tracy.Plot("Network Latency (ms)", latency); Tracy.Plot("Packet Loss (%)", packetLoss); } } ``` ### 5. 渲染管线优化 ```csharp void OnPreRender() { using (Tracy.Zone("Pre-Render")) { using (Tracy.Zone("Culling")) { PerformCulling(); } using (Tracy.Zone("Sort Render Queue")) { SortRenderQueue(); } Tracy.Plot("Visible Objects", visibleCount); Tracy.Plot("Draw Calls", drawCalls); } } ``` ## 🔧 平台特定说明 ### Windows **依赖**: - Visual Studio 2019 或更高版本 - Windows SDK - vcruntime140.dll (Visual C++ Redistributable) **编译**: ```powershell cmake -B build -G "Visual Studio 17 2022" -A x64 cmake --build build --config Release ``` **输出**: `build/Unity/Plugins/x86_64/UnityTracyPlugin.dll` ### macOS **依赖**: - Xcode Command Line Tools - CMake 3.15+ **编译**: ```bash cmake -B build -DCMAKE_BUILD_TYPE=Release cmake --build build ``` **输出**: `build/Unity/Plugins/macOS/UnityTracyPlugin.dylib` **注意**: Apple Silicon (M1/M2) 和 Intel 需要分别编译 ### Linux **依赖**: - GCC 9+ 或 Clang 10+ - pthread, dl **编译**: ```bash cmake -B build -DCMAKE_BUILD_TYPE=Release cmake --build build ``` **输出**: `build/Unity/Plugins/Linux/x86_64/UnityTracyPlugin.so` ### Android **依赖**: - Android NDK r21+ - CMake 3.15+ **编译**: ```bash # ARM64 cmake -B build-android-arm64 \ -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=arm64-v8a \ -DANDROID_PLATFORM=android-21 # ARMv7 cmake -B build-android-armv7 \ -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=armeabi-v7a \ -DANDROID_PLATFORM=android-21 ``` ### iOS **依赖**: - Xcode 12+ - iOS SDK **编译**: ```bash cmake -B build-ios \ -DCMAKE_SYSTEM_NAME=iOS \ -DCMAKE_OSX_ARCHITECTURES=arm64 \ -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 ``` **注意**: iOS 需要静态库(.a)而不是动态库 ## 📊 性能影响 ### Tracy 开销 | 配置 | 每 Zone 开销 | 内存开销 | 网络带宽 | |------|-------------|---------|---------| | 禁用 (Release) | 0 ns | 0 MB | 0 | | 启用 (On-Demand, 未连接) | ~20 ns | ~1 MB | 0 | | 启用 (已连接) | ~50 ns | ~10 MB | ~1 Mbps | ### 建议 - ✅ 在 Debug/Development 构建中启用 - ✅ 追踪主要逻辑块(毫秒级) - ⚠️ 避免追踪微小操作(微秒级) - ⚠️ 避免在紧密循环中创建 Zone - ❌ 不建议在 Release 构建中启用细粒度追踪 ## 🐛 故障排除 ### 常见问题 详细的故障排除指南请参考 [QUICKSTART.md](QUICKSTART.md#常见问题排查) **快速检查清单**: - [ ] DLL 文件在正确的 Plugins 目录 - [ ] Plugin Import Settings 配置正确 - [ ] Tracy Profiler 正在运行 - [ ] 防火墙允许端口 8086 - [ ] `Tracy.Initialize()` 已被调用 - [ ] Unity Console 显示初始化消息 - [ ] 代码中使用了 `Tracy.Zone()` 或 `ZoneScoped` - [ ] `TracyManager` 组件已添加到场景 ### 获取帮助 如果遇到问题: 1. 查看 [QUICKSTART.md](QUICKSTART.md) 的故障排除章节 2. 查看 [完整集成指南](../UNITY_INTEGRATION_GUIDE.md) 3. 查看 [Tracy 官方文档](https://github.com/wolfpld/tracy) 4. 检查 Unity Console 的错误消息 ## 📚 相关资源 ### 文档 - [快速开始指南](QUICKSTART.md) - 5分钟集成 - [完整集成指南](../UNITY_INTEGRATION_GUIDE.md) - 详细文档 - [Tracy 官方手册](https://github.com/wolfpld/tracy/releases/latest/download/tracy.pdf) - PDF ### 链接 - [Tracy GitHub](https://github.com/wolfpld/tracy) - 官方仓库 - [Tracy 演示视频](https://www.youtube.com/watch?v=fB5B46lbapc) - YouTube - [Unity Native Plugins](https://docs.unity3d.com/Manual/NativePlugins.html) - 官方文档 ### 示例项目 本目录中的示例展示了: - 基本的 Zone 使用 - 性能数据绘制 - 协程追踪 - 多线程支持 - 最佳实践 ## 🤝 贡献 欢迎改进和建议! 如果你有更好的实现方式或发现了问题,请: 1. 修改代码 2. 测试你的更改 3. 分享你的改进 ## 📄 许可证 - Tracy: BSD 3-Clause License - 本示例代码: MIT License ## 🎉 开始使用 现在你已经了解了整体结构,可以开始集成了! **下一步**: 打开 [QUICKSTART.md](QUICKSTART.md) 开始 5 分钟快速集成! --- **祝你使用愉快!** 🚀 如有任何问题,欢迎查阅文档或在社区寻求帮助。