Files
tracy-for-unity/unity_examples/README.md

485 lines
10 KiB
Markdown
Raw Normal View History

2025-11-26 14:35:58 +08:00
# 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 分钟快速集成!
---
**祝你使用愉快!** 🚀
如有任何问题,欢迎查阅文档或在社区寻求帮助。