From b1a2d959c777e4b328b05591e235fa2fa3124f68 Mon Sep 17 00:00:00 2001 From: ninemine <1371605831@qq.com> Date: Tue, 2 Dec 2025 10:15:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=A4=B1=E8=B4=A5,=20?= =?UTF-8?q?=E8=AF=A5=E5=88=86=E6=94=AF=E5=B7=B2=E7=BB=8F=E5=BA=9F=E5=BC=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...1_1_performance_optimization_aggressive.md | 85 ++++++++++++++++++- .../Framework/GameContent/GameController.cs | 51 +++++++++-- Assets/Scripts/Framework/RootObject.cs | 15 +++- 3 files changed, 141 insertions(+), 10 deletions(-) diff --git a/.tasks/2025-12-01_1_performance_optimization_aggressive.md b/.tasks/2025-12-01_1_performance_optimization_aggressive.md index d5300f3..fe3feee 100644 --- a/.tasks/2025-12-01_1_performance_optimization_aggressive.md +++ b/.tasks/2025-12-01_1_performance_optimization_aggressive.md @@ -293,7 +293,7 @@ using (Profiler.BeginZone("BurstJob.Schedule")) 每个Phase完成后打tag,必要时可回滚 # 当前执行步骤: -"阶段3.5 - 阶段3整体测试" +"阶段4.8 - 阶段4整体测试" # 任务进度 @@ -460,6 +460,89 @@ using (Profiler.BeginZone("BurstJob.Schedule")) - 阻碍因素:无 - 状态:未确认 → 等待用户确认:成功/不成功? +## 阶段4:双轨运行和实际调用 + +### 4.1 GameController添加控制字段 +[2025-12-01 18:00:00] +- 已修改:GameController.cs (添加1个字段,Line 22) +- 更改:添加_enableSchedulerUpdate控制字段,默认false +- 原因:控制GameController使用新旧Update方式 +- 阻碍因素:无 +- 状态:未确认 + +### 4.2 修改GameController主Update循环 +[2025-12-01 18:02:15] +- 已修改:GameController.cs Update方法主循环 (修改8行,Line 318-329) +- 更改:添加新旧Update方式分支,支持调用FlatOptimizationUpdate或ScriptUpdate +- 原因:允许运行时切换Update方式进行对比 +- 阻碍因素:无 +- 状态:未确认 + +### 4.3 修改GameController滚动时间轴Update调用 +[2025-12-01 18:04:30] +- 已修改:GameController.cs Update方法滚动逻辑 (修改4行,Line 373-376) +- 更改:滚动时间轴也支持新旧方式切换 +- 原因:确保所有Update调用点一致 +- 阻碍因素:无 +- 状态:未确认 + +### 4.4 修改GameController滚动Reset逻辑 +[2025-12-01 18:05:45] +- 已修改:GameController.cs Update方法滚动Reset (修改10行,Line 378-388) +- 更改:滚动重置也支持新旧方式切换 +- 原因:确保Reset调用点一致 +- 阻碍因素:无 +- 状态:未确认 + +### 4.5 修改ForceScriptUpdate方法 +[2025-12-01 18:07:00] +- 已修改:GameController.cs ForceScriptUpdate方法 (修改5行,Line 294-299) +- 更改:强制更新也支持新旧方式切换 +- 原因:确保所有Update入口一致 +- 阻碍因素:无 +- 状态:未确认 + +### 4.6 修改Stop/Pause/Play方法 +[2025-12-01 18:08:15] +- 已修改:GameController.cs Stop/Pause/Play方法 (修改15行,Line 263-292) +- 更改:播放控制方法也支持新旧方式切换 +- 原因:确保播放控制的Update调用一致 +- 阻碍因素:无 +- 状态:未确认 + +### 4.7 RootObject.UpdateTicks调用调度器(关键) +[2025-12-01 18:10:30] +- 已修改:RootObject.cs UpdateTicks方法 (添加10行,Line 111-120) +- 更改:RootObject调用Scheduler.DoUpdate()进行扁平化Update,移除base.UpdateTicks()调用 +- 原因:这是关键步骤,让Scheduler实际被调用,建立完整调用链 +- 阻碍因素:无 +- 状态:未确认 + +### 4.7.1 修复崩溃问题 - 条件调用Scheduler +[2025-12-01 18:15:00] +- 已修改:RootObject.cs UpdateTicks方法 (修改逻辑,Line 112-124) +- 更改:添加条件判断,仅在Scheduler有注册对象时调用Scheduler,否则调用base.UpdateTicks()保持旧行为 +- 原因:修复旧方式下的崩溃问题,避免双重更新和冲突 +- 阻碍因素:无 +- 状态:未确认 + +### 4.8 阶段4整体测试 +[2025-12-01 18:12:00] +- 已修改:阶段4所有代码完成,等待测试 +- 更改:实现双轨Update,支持新旧方式切换(GameController 6处修改,RootObject 1处关键修改) +- 原因:验证新方式功能正确且性能提升,Scheduler实际被调用 +- 测试项目: + 1. 编译项目 - ✅ 已通过(无linter错误) + 2. 旧方式测试(_enableSchedulerUpdate=false) - 待测试 + 3. 新方式测试(_enableSchedulerUpdate=true,部分对象启用调度器) - 待测试 + 4. 功能验证(播放/暂停/停止/滚动时间轴) - 待测试 + 5. 性能对比(Tracy Profiler数据) - 待测试 +- 阻碍因素:无 +- 状态:未确认 → 等待用户确认:成功/不成功? +- 调用链验证: + * 旧方式:GameController → MainObject.ScriptUpdate() → 递归 + * 新方式:GameController → MainObject.FlatOptimizationUpdate() → RootObject.UpdateTicks() → Scheduler.DoUpdate() → 扁平化 + # 最终审查 [待完成] diff --git a/Assets/Scripts/Framework/GameContent/GameController.cs b/Assets/Scripts/Framework/GameContent/GameController.cs index 9428b27..4ba1f8e 100644 --- a/Assets/Scripts/Framework/GameContent/GameController.cs +++ b/Assets/Scripts/Framework/GameContent/GameController.cs @@ -17,6 +17,9 @@ namespace Demo.Game [Resources, SerializeField] public GlobalConfig MainConfig; [Content] private RootObject MainObject; + + [Content, SerializeField] + private bool _enableSchedulerUpdate = false; // 控制是否使用新的UpdateScheduler public string RootSourcePath { get; private set; } public Action SetupSongDuration { get; private set; } = (_, _) => { }; @@ -264,7 +267,10 @@ namespace Demo.Game { SetSongCurrentTime(SongOffset); } - MainObject.ScriptUpdate(SongOffset, Time.deltaTime, ScriptableObject.TickType.Reset); + if (_enableSchedulerUpdate) + MainObject.FlatOptimizationUpdate(SongOffset, Time.deltaTime, ScriptableObject.TickType.Reset); + else + MainObject.ScriptUpdate(SongOffset, Time.deltaTime, ScriptableObject.TickType.Reset); } public void Pause() @@ -274,7 +280,10 @@ namespace Demo.Game { SetSongCurrentTime(CurrentTime); } - MainObject.ScriptUpdate(CurrentTime, Time.deltaTime, ScriptableObject.TickType.Pause); + if (_enableSchedulerUpdate) + MainObject.FlatOptimizationUpdate(CurrentTime, Time.deltaTime, ScriptableObject.TickType.Pause); + else + MainObject.ScriptUpdate(CurrentTime, Time.deltaTime, ScriptableObject.TickType.Pause); } public void Play() @@ -285,12 +294,18 @@ namespace Demo.Game SetupSongDuration(SongOffset, MainAudio.CurrentClip.length + SongOffset); } SetSongCurrentTime(CurrentTime); - MainObject.ScriptUpdate(CurrentTime, Time.deltaTime, ScriptableObject.TickType.Start); + if (_enableSchedulerUpdate) + MainObject.FlatOptimizationUpdate(CurrentTime, Time.deltaTime, ScriptableObject.TickType.Start); + else + MainObject.ScriptUpdate(CurrentTime, Time.deltaTime, ScriptableObject.TickType.Start); } public void ForceScriptUpdate(ScriptableObject.TickType type = ScriptableObject.TickType.Update) { - MainObject.ScriptUpdate(CurrentTime, Time.deltaTime, type); + if (_enableSchedulerUpdate) + MainObject.FlatOptimizationUpdate(CurrentTime, Time.deltaTime, type); + else + MainObject.ScriptUpdate(CurrentTime, Time.deltaTime, type); } private bool IsScrollTimeline = false; @@ -314,7 +329,16 @@ namespace Demo.Game using (Profiler.BeginZone("GameController.ScriptUpdate")) { - MainObject.ScriptUpdate(CurrentTime, deltaTime, ScriptableObject.TickType.Update); + if (_enableSchedulerUpdate) + { + // 新方式:调用FlatOptimizationUpdate(会触发Scheduler) + MainObject.FlatOptimizationUpdate(CurrentTime, deltaTime, ScriptableObject.TickType.Update); + } + else + { + // 旧方式:递归调用 + MainObject.ScriptUpdate(CurrentTime, deltaTime, ScriptableObject.TickType.Update); + } } } if (IsMain == false) @@ -358,13 +382,24 @@ namespace Demo.Game { SetSongCurrentTime(CurrentTime); } - MainObject.ScriptUpdate(CurrentTime, deltaTime, ScriptableObject.TickType.Update); + if (_enableSchedulerUpdate) + MainObject.FlatOptimizationUpdate(CurrentTime, deltaTime, ScriptableObject.TickType.Update); + else + MainObject.ScriptUpdate(CurrentTime, deltaTime, ScriptableObject.TickType.Update); } else if (IsScrollTimeline == true) { IsScrollTimeline = false; - MainObject.ScriptUpdate(CurrentTime, deltaTime, ScriptableObject.TickType.Reset); - MainObject.ScriptUpdate(CurrentTime, deltaTime, ScriptableObject.TickType.Update); + if (_enableSchedulerUpdate) + { + MainObject.FlatOptimizationUpdate(CurrentTime, deltaTime, ScriptableObject.TickType.Reset); + MainObject.FlatOptimizationUpdate(CurrentTime, deltaTime, ScriptableObject.TickType.Update); + } + else + { + MainObject.ScriptUpdate(CurrentTime, deltaTime, ScriptableObject.TickType.Reset); + MainObject.ScriptUpdate(CurrentTime, deltaTime, ScriptableObject.TickType.Update); + } } } } diff --git a/Assets/Scripts/Framework/RootObject.cs b/Assets/Scripts/Framework/RootObject.cs index 47dbdee..36a1004 100644 --- a/Assets/Scripts/Framework/RootObject.cs +++ b/Assets/Scripts/Framework/RootObject.cs @@ -108,7 +108,20 @@ namespace Demo.Game Foo(); } - base.UpdateTicks(currentTime, deltaTime, tickType); + + // 调用调度器进行扁平化Update(仅当有对象注册时) + if (Scheduler != null && Scheduler.TotalRegistered > 0) + { + using (Profiler.BeginZone("RootObject.SchedulerUpdate")) + { + Scheduler.DoUpdate(currentTime, deltaTime, tickType); + } + } + else + { + // 旧方式:调用base.UpdateTicks()(保持向后兼容) + base.UpdateTicks(currentTime, deltaTime, tickType); + } } } }