Files
AppleHillsProduction/docs/lifecycle_technical_review.md
2025-11-07 13:53:11 +01:00

812 lines
29 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Lifecycle Management System - Technical Review & Recommendations
**Date:** November 3, 2025
**Reviewer:** System Architect
**Project:** AppleHills (6-month timeline)
**Status:** Awaiting Technical Review Approval
---
## Executive Summary
This document analyzes the proposed ManagedBehaviour lifecycle management system and provides a pragmatic recommendation for a 6-month project timeline. After analyzing the current codebase (20+ components using InitializePostBoot, 6+ ISaveParticipant implementations, 10+ IPausable implementations), I recommend implementing a **Streamlined ManagedBehaviour** approach that solves 80% of the problems with 20% of the complexity.
**Key Recommendation:** Implement core lifecycle management without the complex multi-phase system. Focus on boot lifecycle, auto-registration, and event cleanup. Estimated implementation: 2-3 days + 1-2 days migration.
---
## 1. Current System Analysis
### 1.1 Existing Lifecycle Patterns
The codebase currently uses **four different initialization patterns**:
#### Pattern A: Unity Standard (Awake → Start)
```csharp
void Awake() { /* Basic setup */ }
void Start() { /* Initialization */ }
```
#### Pattern B: Two-Phase Bootstrap (Awake → InitializePostBoot)
```csharp
void Awake()
{
_instance = this;
BootCompletionService.RegisterInitAction(InitializePostBoot, priority: 100);
}
private void InitializePostBoot()
{
// Setup after boot completes
}
```
**Usage:** 20+ components across the codebase
#### Pattern C: Manual Event Subscription
```csharp
void Awake()
{
BootCompletionService.RegisterInitAction(InitializePostBoot);
}
private void InitializePostBoot()
{
SceneManagerService.Instance.SceneLoadCompleted += OnSceneLoaded;
GameManager.Instance.OnGamePaused += OnPaused;
}
void OnDestroy()
{
// MUST remember to unsubscribe - memory leak risk!
SceneManagerService.Instance.SceneLoadCompleted -= OnSceneLoaded;
GameManager.Instance.OnGamePaused -= OnPaused;
}
```
#### Pattern D: Manual Registration (ISaveParticipant, IPausable)
```csharp
private void InitializePostBoot()
{
SaveLoadManager.Instance.RegisterParticipant(this);
GameManager.Instance.RegisterPausableComponent(this);
}
void OnDestroy()
{
SaveLoadManager.Instance.UnregisterParticipant(GetSaveId());
GameManager.Instance.UnregisterPausableComponent(this);
}
```
**Usage:** 6+ ISaveParticipant, 10+ IPausable implementations
### 1.2 Bootstrap Flow
```
CustomBoot.Initialise() [BeforeSplashScreen]
Load CustomBootSettings (Addressables)
Unity Awake() [All MonoBehaviours, unordered]
Unity Start()
CustomBoot completes
BootCompletionService.HandleBootCompleted()
Execute registered init actions (priority sorted: 0→1000)
OnBootComplete event fires
```
---
## 2. Problem Identification
### Critical Issues
#### 🔴 P0: Confusing Two-Phase Lifecycle
- Developers must remember to use `Awake()` + `InitializePostBoot()` pattern
- Priority is defined at registration site (not in component), making dependencies unclear
- Inconsistent naming: `InitializePostBoot()`, `Initialize()`, `Init()`, `PostBootInit()`
- No clear guidance on what belongs in which phase
#### 🔴 P0: Memory Leak Risk
- Manual event subscription requires matching unsubscription in OnDestroy()
- Easy to forget unsubscribe, especially during rapid development
- No automated cleanup mechanism
- Found 15+ manual subscription sites
#### 🟡 P1: Registration Burden
- ISaveParticipant components must manually call RegisterParticipant() and UnregisterParticipant()
- IPausable components must manually call RegisterPausableComponent() and UnregisterPausableComponent()
- Boilerplate code repeated across 16+ components
#### 🟡 P1: Late Registration Handling
- Components instantiated after boot must handle "already booted" case manually
- BootCompletionService handles this, but scene-specific services don't
- Inconsistent behavior across different managers
#### 🟢 P2: Priority System Fragmentation
- Boot priority defined at call site: `RegisterInitAction(method, priority: 50)`
- No centralized view of initialization order
- Hard to debug dependency issues
### Non-Issues (Working Well)
**Singleton Pattern:** Consistent `_instance` field + `Instance` property
**BootCompletionService:** Solid priority-based initialization
**Scene Management:** Event-based lifecycle works well
**Save/Load System:** ISaveParticipant interface is clean
**Pause System:** Counter-based pause with IPausable interface
---
## 3. Solution Options
### Option A: Minimal Enhancement (Conservative)
**Description:** Keep MonoBehaviour base, add helper utilities
**Changes:**
- Create `BootHelper` utility class for common patterns
- Add `ManagedEventSubscription` wrapper for auto-cleanup
- Extension methods for auto-registration
**Pros:**
- Minimal code changes (< 1 day implementation)
- Zero breaking changes
- Very safe
**Cons:**
- Doesn't solve core lifecycle confusion
- Still requires manual patterns
- Least impactful solution
**Effort:** 1 day implementation, 0 days migration
**Recommendation:** Not recommended - doesn't solve main problems
---
### Option B+: Streamlined ManagedBehaviour with Scene Orchestration (RECOMMENDED)
**Description:** Focused base class solving critical pain points + orchestrated scene transitions
**Core Features:**
1. **Deterministic Boot Lifecycle**
- `OnManagedAwake()` - Called after Unity Awake, priority-ordered
- `OnBootComplete()` - Called after boot completes, priority-ordered
- Properties: `ManagedAwakePriority`, `BootCompletePriority`
2. **Orchestrated Scene Lifecycle**
- `OnSceneUnloading()` - Called before scene unloads, reverse priority-ordered
- `OnSceneReady()` - Called after scene loads, priority-ordered
- Properties: `SceneUnloadingPriority`, `SceneReadyPriority`
- SceneManagerService.SwitchSceneAsync() orchestrates full flow
3. **Auto-Registration**
- Auto-register ISaveParticipant (opt-in via `AutoRegisterSaveParticipant` property)
- Auto-register IPausable (opt-in via `AutoRegisterPausable` property)
- Auto-unregister on destroy
4. **Managed Event Subscriptions**
- `RegisterManagedEvent(target, handler)` - Auto-cleanup on destroy
- Prevents memory leaks
- Simple, fail-safe pattern
5. **LifecycleManager**
- Central orchestrator (singleton in BootstrapScene)
- Maintains priority-sorted lists
- Broadcasts lifecycle events
- Integrates with BootCompletionService (temporarily)
- Tracks which scene each component belongs to
6. **Enhanced SceneManagerService**
- SwitchSceneAsync() includes full orchestration
- No separate orchestrator class needed
- Integrates with LifecycleManager for scene lifecycle callbacks
**NOT Included** (keeping it simple):
- OnManagedUpdate / OnManagedFixedUpdate - Performance overhead, rarely needed
- OnPaused / OnResumed - Implement IPausable interface directly instead
- Separate SceneTransitionOrchestrator - Logic integrated into SceneManagerService
**Example Usage:**
```csharp
public class GameManager : ManagedBehaviour
{
protected override int ManagedAwakePriority => 10; // Very early
protected override int BootCompletePriority => 10;
protected override void OnManagedAwake()
{
// Deterministic initialization, runs at priority 10
SetupSingleton();
}
protected override void OnBootComplete()
{
// Replaces InitializePostBoot()
InitializeSettings();
}
}
public class PuzzleManager : ManagedBehaviour, ISaveParticipant
{
protected override bool AutoRegisterSaveParticipant => true; // Auto-registers!
protected override int SceneReadyPriority => 100;
protected override int SceneUnloadingPriority => 100;
protected override LifecycleFlags ActiveLifecyclePhases =>
LifecycleFlags.BootComplete |
LifecycleFlags.SceneReady |
LifecycleFlags.SceneUnloading;
protected override void OnBootComplete()
{
// SaveLoadManager registration happens automatically
}
protected override void OnSceneReady()
{
// Scene fully loaded, discover puzzles in scene
DiscoverPuzzlesInScene();
}
protected override void OnSceneUnloading()
{
// Save transient state before scene unloads
CleanupPuzzles();
}
}
```
**Pros:**
- Solves main pain points (lifecycle confusion, memory leaks, registration burden)
- Orchestrated scene transitions with proper save/cleanup/restore flow
- Clear migration path (change base class, rename methods)
- Minimal performance overhead
- Can be extended incrementally
- Clean, intuitive API
- ~5-7 days total implementation + migration
**Cons:**
- Requires base class change (20+ files)
- Scene lifecycle adds some complexity (but solves critical orchestration need)
- BootCompletionService remains temporarily (deprecated over time)
**Effort:** 3-4 days implementation, 2-3 days migration, 1 day BootCompletionService removal
**Recommendation:** **RECOMMENDED** - Best balance for 6-month project with proper scene orchestration
---
### Option C: Full ManagedBehaviour (As Proposed)
**Description:** Complete 9-phase lifecycle system as documented
**All Features from Option B, PLUS:**
- OnSceneReady / OnSceneUnloading with automatic scene tracking
- OnManagedUpdate / OnManagedFixedUpdate with priority ordering
- OnPaused / OnResumed lifecycle hooks
- Per-phase priority properties (9 different priority settings)
- LifecycleFlags enum for opt-in per phase
- IsPersistent flag for scene persistence tracking
- Complex multi-list management in LifecycleManager
**Pros:**
- Most comprehensive solution
- Future-proof and extensible
- Complete control over execution order
**Cons:**
- High implementation complexity (5-7 days)
- Significant migration effort (3-5 days for 20+ files)
- Performance overhead (broadcasts every frame for OnManagedUpdate)
- Over-engineered for 6-month timeline
- Higher maintenance burden
- More opportunities for bugs in complex orchestration
**Effort:** 5-7 days implementation, 3-5 days migration, ongoing maintenance
**Recommendation:** Too complex for current project scope
---
## 4. Detailed Recommendation: Streamlined ManagedBehaviour with Orchestrated Scene Transitions (Option B+)
### 4.1 Architecture
```
┌─────────────────────────────────────────────────────────┐
│ CustomBoot (Unchanged) │
│ - Loads settings via Addressables │
│ - Triggers BootCompletionService │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ BootCompletionService (Thin Adapter - TO BE DEPRECATED)│
│ - Executes legacy RegisterInitAction callbacks │
│ - Fires OnBootComplete event │
│ - Triggers LifecycleManager.OnBootCompletionTriggered()│
│ - GOAL: Remove once all code migrated │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ LifecycleManager (Core Orchestrator) │
│ - Maintains sorted lists for each phase │
│ - BroadcastManagedAwake() │
│ - BroadcastBootComplete() │
│ - BroadcastSceneUnloading(sceneName) │
│ - BroadcastSceneReady(sceneName) │
│ - Tracks which scene each component belongs to │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ SceneManagerService (Enhanced - Scene Orchestration) │
│ - SwitchSceneAsync() orchestrates full transition: │
│ 1. Show loading screen │
│ 2. LifecycleManager.BroadcastSceneUnloading() │
│ 3. SaveLoadManager.Save() │
│ 4. UnloadSceneAsync() │
│ 5. LoadSceneAsync() │
│ 6. LifecycleManager.BroadcastSceneReady() │
│ 7. Hide loading screen │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ ManagedBehaviour (Base Class) │
│ - Auto-registers with LifecycleManager in Awake() │
│ - OnManagedAwake() / OnBootComplete() │
│ - OnSceneUnloading() / OnSceneReady() │
│ - Priority properties for all lifecycle hooks │
│ - Auto-registration for ISaveParticipant/IPausable │
│ - Managed event subscriptions with auto-cleanup │
└─────────────────────────────────────────────────────────┘
↓ uses
┌─────────────────────────────────────────────────────────┐
│ ManagedEventSubscription (Helper) │
│ - Stores event subscriptions │
│ - Auto-unsubscribes on destroy │
└─────────────────────────────────────────────────────────┘
```
### 4.2 Migration End Goal
**Target State:** Remove all legacy lifecycle services
- BootCompletionService - Completely removed
- Manual RegisterInitAction calls - Eliminated
- InitializePostBoot methods - Converted to OnBootComplete
- LifecycleManager - Single source of truth for all lifecycle
- ManagedBehaviour - Standard base class for all components
- SceneManagerService - Orchestrates scene transitions with lifecycle integration
### 4.2 Lifecycle Flow
```
Unity Awake() (All MonoBehaviours)
ManagedBehaviour.Awake()
└→ Registers with LifecycleManager
Unity Start()
CustomBoot completes
BootCompletionService.HandleBootCompleted()
LifecycleManager.BroadcastManagedAwake()
└→ Calls OnManagedAwake() in priority order (0→∞)
LifecycleManager.BroadcastBootComplete()
└→ Calls OnBootComplete() in priority order (0→∞)
└→ Auto-registers ISaveParticipant/IPausable if configured
[Game Loop]
ManagedBehaviour.OnDestroy()
└→ Auto-unregisters from LifecycleManager
└→ Auto-unsubscribes all managed events
└→ Auto-unregisters from SaveLoadManager/GameManager
```
### 4.3 Implementation Plan
#### Phase 1: Core Infrastructure (Day 1)
1. **Create LifecycleEnums.cs**
- `LifecyclePhase` enum (ManagedAwake, BootComplete)
2. **Create ManagedEventSubscription.cs**
- Internal struct to store subscription info
- ManagedEventManager for auto-cleanup
3. **Create ManagedBehaviour.cs**
- Base class extending MonoBehaviour
- Virtual properties: `ManagedAwakePriority`, `BootCompletePriority`, `AutoRegisterSaveParticipant`, `AutoRegisterPausable`
- Virtual methods: `OnManagedAwake()`, `OnBootComplete()`
- Auto-registration in Awake()
- Auto-cleanup in OnDestroy()
- `RegisterManagedEvent()` helper
4. **Create LifecycleManager.cs**
- Singleton in BootstrapScene
- Sorted lists for each phase
- Register/Unregister methods
- BroadcastManagedAwake/BootComplete methods
- Integration with BootCompletionService
#### Phase 2: Integration (Day 2)
5. **Modify BootCompletionService.cs**
- After existing init actions, call LifecycleManager broadcasts
6. **Extend SaveLoadManager.cs**
- Add `AutoRegisterParticipant(ISaveParticipant, ManagedBehaviour)` method
- Add `AutoUnregisterParticipant(ManagedBehaviour)` method
- Track auto-registrations
7. **Extend GameManager.cs**
- Add `AutoRegisterPausable(IPausable, ManagedBehaviour)` method
- Add `AutoUnregisterPausable(ManagedBehaviour)` method
- Track auto-registrations
#### Phase 3: Testing & Documentation (Day 3)
8. **Create Example Implementations**
- ExampleManagedSingleton.cs
- ExampleManagedComponent.cs
- ExampleManagedSaveParticipant.cs
9. **Write Migration Guide**
- Step-by-step conversion process
- Common patterns and gotchas
10. **Create Validation Tools** (Optional)
- Editor script to find components needing migration
- Automated conversion helper
#### Phase 4: Migration (Days 4-5)
11. **Migrate Core Systems** (Priority Order)
- GameManager (priority 10)
- SceneManagerService (priority 15)
- SaveLoadManager (priority 20)
- AudioManager (priority 25)
12. **Migrate UI Systems** (Priority 50-100)
- UIPageController
- LoadingScreenController
- PauseMenu
- CardSystemUI components
13. **Migrate Gameplay Systems** (Priority 100-200)
- PuzzleManager
- CardSystemManager
- FollowerController
- PlayerTouchController
- DialogueComponent
### 4.4 Migration Process (Per Component)
**Step 1:** Change base class
```csharp
// Before
public class GameManager : MonoBehaviour
// After
public class GameManager : ManagedBehaviour
```
**Step 2:** Set priorities
```csharp
protected override int ManagedAwakePriority => 10;
protected override int BootCompletePriority => 10;
```
**Step 3:** Move initialization
```csharp
// Before
void Awake()
{
_instance = this;
BootCompletionService.RegisterInitAction(InitializePostBoot);
}
private void InitializePostBoot() { /* ... */ }
// After
protected override void OnManagedAwake()
{
_instance = this;
}
protected override void OnBootComplete()
{
// Former InitializePostBoot() code
}
```
**Step 4:** Enable auto-registration (if applicable)
```csharp
// For ISaveParticipant
protected override bool AutoRegisterSaveParticipant => true;
// For IPausable
protected override bool AutoRegisterPausable => true;
// Remove manual registration code from InitializePostBoot/OnDestroy
```
**Step 5:** Convert event subscriptions
```csharp
// Before
private void InitializePostBoot()
{
SceneManagerService.Instance.SceneLoadCompleted += OnSceneLoaded;
}
void OnDestroy()
{
SceneManagerService.Instance.SceneLoadCompleted -= OnSceneLoaded;
}
// After
protected override void OnBootComplete()
{
RegisterManagedEvent(SceneManagerService.Instance,
nameof(SceneManagerService.SceneLoadCompleted), OnSceneLoaded);
}
// OnDestroy cleanup automatic!
```
**Step 6:** Test thoroughly
- Verify initialization order
- Check event subscriptions work
- Confirm save/load integration
- Test pause functionality
---
## 5. Risk Assessment
### Technical Risks
| Risk | Likelihood | Impact | Mitigation |
|------|-----------|--------|------------|
| Base class change breaks existing components | Medium | High | Incremental migration, thorough testing |
| Performance overhead from lifecycle broadcasts | Low | Medium | Profile in real scenarios, optimize if needed |
| Managed event system fails to unsubscribe | Low | High | Extensive unit tests, code review |
| LifecycleManager initialization order issues | Medium | High | Careful integration with BootCompletionService |
| Developers revert to old patterns | Medium | Low | Clear documentation, code review enforcement |
### Schedule Risks
| Risk | Likelihood | Impact | Mitigation |
|------|-----------|--------|------------|
| Implementation takes longer than estimated | Low | Medium | 3-day buffer built into 6-month timeline |
| Migration uncovers edge cases | Medium | Medium | Migrate critical systems first, iterate |
| Team resistance to new pattern | Low | Medium | Provide clear examples, migration support |
### Mitigation Strategy
1. **Implement core infrastructure first** - Validate approach before migration
2. **Migrate critical systems first** - GameManager, SaveLoadManager
3. **Incremental rollout** - Don't migrate everything at once
4. **Comprehensive testing** - Unit tests + integration tests
5. **Documentation-first** - Write migration guide before starting
6. **Code reviews** - Ensure proper usage patterns
---
## 6. Success Criteria
### Quantitative Metrics
- All 20+ components using InitializePostBoot migrated
- Zero memory leaks from event subscriptions (verified via profiler)
- < 5% performance overhead in worst-case scenarios
- 100% of ISaveParticipant/IPausable use auto-registration
### Qualitative Goals
- Clear, consistent lifecycle pattern across codebase
- Reduced boilerplate (no manual registration code)
- Easier onboarding for new developers
- Better debuggability (centralized lifecycle view)
---
## 7. Timeline Estimate
### Option B+: Streamlined ManagedBehaviour with Scene Orchestration (Recommended)
- **Phase 1 - Core Infrastructure:** 2 days
- Day 1: LifecycleEnums, ManagedEventSubscription, ManagedBehaviour structure
- Day 2: LifecycleManager implementation, prefab setup
- **Phase 2 - Integration:** 1 day
- BootCompletionService integration, SaveLoadManager/GameManager extensions, SceneManagerService prep
- **Phase 3 - Scene Orchestration:** 2 days
- Day 4: SceneManagerService.SwitchSceneAsync() orchestration, examples
- Day 5: Migration guide, testing & validation
- **Phase 4 - Migration & Cleanup:** 3 days
- Day 6: Core systems migration (GameManager, SceneManagerService, SaveLoadManager)
- Day 7: UI & gameplay systems migration (12+ files)
- Day 8: Final testing, BootCompletionService removal, documentation
- **Total:** 8 days (~1.5 weeks)
- **% of 6-month project:** 1.6%
### Full ManagedBehaviour (Not Recommended)
- **Implementation:** 5-7 days
- **Migration:** 3-5 days
- **Testing & Documentation:** 2 days
- **Ongoing Maintenance:** Higher
- **Total:** 10-14 days (~2-3 weeks)
- **% of 6-month project:** 3.5%
---
## 8. Alternative Approaches Considered
### 8.1 Unity ECS/DOTS
**Rejected Reason:** Too radical a change, incompatible with existing MonoBehaviour architecture
### 8.2 Dependency Injection Framework (Zenject/VContainer)
**Rejected Reason:** Solves different problems, adds external dependency, steeper learning curve
### 8.3 Event Bus System
**Rejected Reason:** Doesn't address lifecycle ordering, adds complexity without solving core issues
### 8.4 Unity's Initialization System (InitializeOnLoad)
**Rejected Reason:** Editor-only, doesn't solve runtime lifecycle ordering
---
## 9. Incremental Extension Path
If future needs arise, the Streamlined ManagedBehaviour can be extended:
**Phase 2 Additions** (if needed later):
- Add `OnSceneReady()` / `OnSceneUnloading()` hooks
- Automatic scene tracking based on GameObject.scene
- Priority-based scene lifecycle
**Phase 3 Additions** (if needed later):
- Add `OnManagedUpdate()` / `OnManagedFixedUpdate()`
- Opt-in via LifecycleFlags
- Performance profiling required
**Phase 4 Additions** (if needed later):
- Add `OnPaused()` / `OnResumed()` hooks
- Integrate with GameManager pause system
- Alternative to IPausable interface
**Key Principle:** Start simple, extend only when proven necessary
---
## 10. Recommendation Summary
### Primary Recommendation: ✅ APPROVE Option B+ (Streamlined ManagedBehaviour with Scene Orchestration)
**Rationale:**
1. **Solves critical problems** - Lifecycle confusion, memory leaks, registration burden, scene orchestration
2. **Appropriate scope** - 8 days for complete implementation, migration, and cleanup
3. **Low risk** - Incremental migration, clear patterns, well-tested approach
4. **Extensible** - Can add features later if needed
5. **Team-friendly** - Clear API, good examples, comprehensive migration guide
6. **End Goal Achievable** - Complete removal of BootCompletionService and legacy patterns
**Deliverables:**
- LifecycleManager (singleton in BootstrapScene)
- ManagedBehaviour base class with 4 lifecycle hooks
- ManagedEventSubscription system for auto-cleanup
- Enhanced SceneManagerService with orchestrated transitions
- Extended SaveLoadManager/GameManager with auto-registration
- Migration guide and examples
- 20+ components migrated
- BootCompletionService completely removed
**Deprecation Strategy:**
1. **Phase 1-2:** BootCompletionService triggers LifecycleManager (adapter pattern)
2. **Phase 3:** Scene orchestration integrated into SceneManagerService
3. **Phase 4:** All components migrated, BootCompletionService removed
4. **End State:** LifecycleManager as single source of truth
**Next Steps if Approved:**
1. Create feature branch `feature/managed-behaviour`
2. Implement core infrastructure (Days 1-2)
3. Integration with existing systems (Day 3)
4. Scene orchestration (Days 4-5)
5. Migration (Days 6-7)
6. Cleanup and BootCompletionService removal (Day 8)
7. Code review and testing
8. Merge to main
---
## 11. Questions for Technical Review
1. **Do you agree with the recommended scope?** (Streamlined vs Full)
2. **Should we migrate all 20+ components immediately or incrementally?**
3. **Any specific components that should NOT be migrated?**
4. **Should we create automated migration tools or manual migration?**
5. **Any additional lifecycle hooks needed for specific game systems?**
6. **Performance profiling required before or after implementation?**
---
## 12. References
- Original Proposal: `managed_bejavior.md`
- Bootstrap Documentation: `bootstrap_readme.md`
- Current BootCompletionService: `Assets/Scripts/Bootstrap/BootCompletionService.cs`
- Current GameManager: `Assets/Scripts/Core/GameManager.cs`
- Current SaveLoadManager: `Assets/Scripts/Core/SaveLoad/SaveLoadManager.cs`
- Current SceneManagerService: `Assets/Scripts/Core/SceneManagerService.cs`
---
## Appendix A: Code Impact Analysis
### Files Using InitializePostBoot Pattern (20 files)
```
UI/Core/UIPageController.cs
UI/LoadingScreenController.cs
UI/CardSystem/CardAlbumUI.cs
UI/CardSystem/CardSystemSceneVisibility.cs
UI/PauseMenu.cs
Dialogue/DialogueComponent.cs
Sound/AudioManager.cs
Movement/FollowerController.cs
PuzzleS/PuzzleManager.cs
Levels/MinigameSwitch.cs
Core/GameManager.cs
Core/SceneManagerService.cs
Core/SaveLoad/SaveLoadManager.cs
+ others
```
### Files Implementing ISaveParticipant (6 files)
```
PuzzleS/PuzzleManager.cs
Movement/FollowerController.cs
Input/PlayerTouchController.cs
Interactions/SaveableInteractable.cs
Data/CardSystem/CardSystemManager.cs
Core/SaveLoad/AppleMachine.cs
```
### Files Implementing IPausable (10+ files)
```
Sound/AudioManager.cs
Minigames/DivingForPictures/Player/PlayerController.cs
Minigames/DivingForPictures/DivingGameManager.cs
Minigames/DivingForPictures/Utilities/RockPauser.cs
Minigames/DivingForPictures/Tiles/TrenchTileSpawner.cs
+ others
```
**Total Estimated Migration:** ~25-30 files affected
---
## Appendix B: Performance Considerations
### Overhead Analysis (Streamlined ManagedBehaviour)
**Per-Component Cost:**
- Registration: One-time O(log n) insertion into sorted list (~microseconds)
- ManagedAwake broadcast: Once per component at boot (~milliseconds total)
- BootComplete broadcast: Once per component at boot (~milliseconds total)
- Event subscription tracking: Minimal memory overhead per subscription
- Unregistration: One-time O(n) removal (~microseconds)
**Total Overhead:** < 1% frame time at boot, zero overhead during game loop
**Full ManagedBehaviour Would Add:**
- OnManagedUpdate broadcast: Every frame, O(n) iteration
- OnManagedFixedUpdate broadcast: Every physics frame, O(n) iteration
- This is why we exclude it from the recommended approach
---
## Approval
**Awaiting Technical Review Team Decision**
Please review and approve/reject/request modifications for this proposal.
**Prepared by:** System Architect
**Review Requested:** November 3, 2025
**Decision Deadline:** [TBD]