658 lines
31 KiB
Markdown
658 lines
31 KiB
Markdown
[//]: # (Debug/TDD.md)
|
||
|
||
# Система Debug - Техническая Документация
|
||
|
||
## Обзор
|
||
Интегрированная система отладки для мониторинга производительности и параметров движения в реальном времени. Система обеспечивает многостраничный интерфейс с навигацией, автоматическим обновлением контента и визуальными инструментами отладки для разработчиков.
|
||
|
||
## Архитектурные принципы
|
||
- **Модульность:** Каждая страница отладки независима и может быть добавлена/удалена без влияния на систему
|
||
- **Производительность:** Контролируемая частота обновления для предотвращения падения FPS
|
||
- **Расширяемость:** Простое добавление новых страниц через DataTable конфигурацию
|
||
- **Интеграция:** Глубокая интеграция с Movement System и Toast notification system
|
||
|
||
## Компоненты системы
|
||
|
||
### AC_DebugHUD (Core Component)
|
||
**Ответственности:**
|
||
- Управление жизненным циклом debug страниц (регистрация, навигация, обновление)
|
||
- Контроль частоты обновления для оптимизации производительности
|
||
- Интеграция с Movement Component для получения данных в реальном времени
|
||
- Управление видимостью debug интерфейса и visual debug режима
|
||
|
||
**Ключевые функции:**
|
||
- `InitializeDebugHUD()` - Инициализация с регистрацией страниц и созданием виджета
|
||
- `UpdateHUD()` - Основной цикл обновления, вызываемый каждый кадр
|
||
- `NextPage()` / `PreviousPage()` - Навигация между страницами с циклическим переходом
|
||
- `ToggleDebugHUD()` - Переключение видимости debug интерфейса
|
||
- `ToggleVisualDebug()` - Включение/выключение визуальной отладки
|
||
|
||
### WBP_DebugHUD (UI Widget)
|
||
**Ответственности:**
|
||
- Отображение текущей debug информации в структурированном виде
|
||
- Управление тремя основными текстовыми элементами: заголовок, контент, навигация
|
||
- Автоматическое обновление отображения при изменении данных
|
||
- Интеграция с Movement Component для прямого доступа к данным
|
||
|
||
**Ключевые функции:**
|
||
- `SetHeaderText()` - Установка заголовка текущей страницы
|
||
- `SetContentText()` - Обновление основного контента страницы
|
||
- `SetNavigationText()` - Отображение информации о навигации и текущей позиции
|
||
|
||
### DT_DebugPages (DataTable Configuration)
|
||
**Ответственности:**
|
||
- Декларативное определение всех доступных debug страниц
|
||
- Конфигурация связи между страницами и функциями обновления
|
||
- Централизованное управление видимостью и метаданными страниц
|
||
|
||
## Система страниц отладки
|
||
|
||
### Типы страниц (E_DebugPageID)
|
||
```typescript
|
||
enum E_DebugPageID {
|
||
MovementInfo = 'MovementInfo', // Константы движения
|
||
SurfaceInfo = 'SurfaceInfo', // Классификация поверхностей
|
||
PerformanceInfo = 'PerformanceInfo' // Метрики производительности
|
||
}
|
||
```
|
||
|
||
### Функции обновления (E_DebugUpdateFunction)
|
||
```typescript
|
||
enum E_DebugUpdateFunction {
|
||
UpdateMovementPage = 'UpdateMovementPage', // Обновление страницы движения
|
||
UpdateSurfacePage = 'UpdateSurfacePage', // Обновление страницы поверхностей
|
||
UpdatePerformancePage = 'UpdatePerformancePage' // Обновление страницы производительности
|
||
}
|
||
```
|
||
|
||
### Конфигурация страниц
|
||
```typescript
|
||
// Movement Constants Page
|
||
{
|
||
PageID: E_DebugPageID.MovementInfo,
|
||
Title: 'Movement Constants',
|
||
Content: '', // Динамически обновляется
|
||
IsVisible: true,
|
||
UpdateFunction: E_DebugUpdateFunction.UpdateMovementPage
|
||
}
|
||
|
||
// Surface Classification Page
|
||
{
|
||
PageID: E_DebugPageID.SurfaceInfo,
|
||
Title: 'Surface Classification',
|
||
Content: '', // Динамически обновляется
|
||
IsVisible: true,
|
||
UpdateFunction: E_DebugUpdateFunction.UpdateSurfacePage
|
||
}
|
||
|
||
// Performance Metrics Page
|
||
{
|
||
PageID: E_DebugPageID.PerformanceInfo,
|
||
Title: 'Performance Metrics',
|
||
Content: '', // Динамически обновляется
|
||
IsVisible: true,
|
||
UpdateFunction: E_DebugUpdateFunction.UpdatePerformancePage
|
||
}
|
||
```
|
||
|
||
## Структуры данных
|
||
|
||
### S_DebugPage
|
||
```typescript
|
||
interface S_DebugPage {
|
||
PageID: E_DebugPageID; // Уникальный идентификатор страницы
|
||
Title: Text; // Заголовок для отображения
|
||
Content: Text; // Основное содержимое страницы
|
||
IsVisible: boolean; // Видимость в навигации
|
||
UpdateFunction: E_DebugUpdateFunction; // Функция обновления контента
|
||
}
|
||
```
|
||
|
||
### S_DebugSettings
|
||
```typescript
|
||
interface S_DebugSettings {
|
||
CurrentMode: ESlateVisibility; // Текущий режим видимости (Visible/Hidden)
|
||
CurrentPageIndex: Integer; // Индекс активной страницы (0-based)
|
||
ShowVisualDebug: boolean; // Включение визуальной отладки
|
||
UpdateFrequency: Float; // Частота обновления в Герцах (0 = каждый кадр)
|
||
}
|
||
```
|
||
|
||
## Контент страниц
|
||
|
||
### Movement Constants Page
|
||
```
|
||
Max Speed: 600.0
|
||
Acceleration: 2000.0
|
||
Friction: 8.0
|
||
Gravity: 980.0
|
||
```
|
||
|
||
### Surface Classification Page
|
||
```
|
||
Walkable: ≤50°
|
||
Steep Slope: 50°-85°
|
||
Wall: 85°-95°
|
||
Ceiling: >95°
|
||
```
|
||
|
||
### Performance Metrics Page
|
||
```
|
||
Frame: 1247
|
||
FPS: 60.2
|
||
Update Rate: Every Frame | 30 Hz
|
||
ActivePages: 3
|
||
```
|
||
|
||
## Система навигации
|
||
|
||
### Циклическая навигация
|
||
```typescript
|
||
// Переход к следующей странице с возвратом в начало
|
||
NextPage(): void {
|
||
currentIndex = (currentIndex + 1) % visiblePagesLength
|
||
}
|
||
|
||
// Переход к предыдущей странице с переходом в конец
|
||
PreviousPage(): void {
|
||
currentIndex = currentIndex - 1 < 0 ?
|
||
visiblePagesLength - 1 :
|
||
currentIndex - 1
|
||
}
|
||
```
|
||
|
||
### Управление видимостью
|
||
- **Page Up/Page Down** - Навигация между страницами
|
||
- **F1** - Переключение видимости debug HUD
|
||
- **F2** - Переключение визуальной отладки
|
||
|
||
### Индикация навигации
|
||
```
|
||
Page 1/3 | PageUp/PageDown - Navigate
|
||
Page 2/3 | PageUp/PageDown - Navigate
|
||
Page 3/3 | PageUp/PageDown - Navigate
|
||
```
|
||
|
||
## Система обновления
|
||
|
||
### Контроль частоты обновления
|
||
```typescript
|
||
// Проверка необходимости обновления
|
||
ShouldUpdateDebugHUD(CurrentTime: Float): boolean {
|
||
if (updateFrequency > 0) {
|
||
return currentTime - lastUpdateTime >= 1 / updateFrequency
|
||
} else {
|
||
return true // Обновление каждый кадр
|
||
}
|
||
}
|
||
```
|
||
|
||
### Режимы обновления
|
||
- **UpdateFrequency = 0:** Каждый кадр (максимальная отзывчивость)
|
||
- **UpdateFrequency = 30:** 30 раз в секунду (баланс производительности/отзывчивости)
|
||
- **UpdateFrequency = 10:** 10 раз в секунду (минимальное влияние на производительность)
|
||
|
||
### Цикл обновления
|
||
```typescript
|
||
UpdateHUD(CurrentTime: Float, DeltaTime: Float): void {
|
||
if (ShouldUpdateDebugHUD(CurrentTime)) {
|
||
FrameCounter++
|
||
FPS = 1 / DeltaTime
|
||
LastUpdateTime = CurrentTime
|
||
|
||
if (ShouldShowDebugHUD()) {
|
||
UpdateCurrentPage()
|
||
UpdateWidgetPage()
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
## Производительность
|
||
|
||
### Оптимизации
|
||
- **Контролируемая частота:** Программируемая частота обновления предотвращает избыточные расчеты
|
||
- **Ленивое обновление:** Обновление только видимых страниц
|
||
- **Кэширование FPS:** Расчет FPS только при обновлении
|
||
- **Условное отображение:** Пропуск обновления UI при скрытом HUD
|
||
|
||
### Benchmarks
|
||
- **Инициализация:** <0.5ms (создание виджета и регистрация страниц)
|
||
- **UpdateHUD (30Hz):** <0.1ms на обновление при включенном ограничении
|
||
- **UpdateHUD (каждый кадр):** <0.2ms на обновление без ограничений
|
||
- **Навигация:** <0.05ms на переключение страницы
|
||
- **Memory footprint:** ~1KB на debug HUD component
|
||
|
||
### Performance considerations
|
||
- **String concatenation:** Минимизировано использование + для Text объектов
|
||
- **Widget updates:** Обновление UI только при изменении данных
|
||
- **Conditional rendering:** Полное отключение обновлений при скрытом HUD
|
||
- **Memory allocations:** Переиспользование текстовых буферов
|
||
|
||
## Система тестирования
|
||
|
||
### FT_DebugSystem (Basic Functionality)
|
||
**Покрывает:**
|
||
- Успешность инициализации системы (`IsInitialized = true`)
|
||
- Соответствие количества страниц в DataTable и загруженных страниц
|
||
- Валидность компонентов Movement и DebugHUD
|
||
- Корректность загрузки конфигурации из DataTable
|
||
|
||
### FT_DebugNavigation (Navigation System)
|
||
**Покрывает:**
|
||
- Корректность индексации при навигации (`CurrentPageIndex` в допустимых пределах)
|
||
- Циклическое поведение при достижении границ списка страниц
|
||
- Валидность состояния после операций `NextPage()` и `PreviousPage()`
|
||
- Устойчивость индексов при многократных переходах
|
||
|
||
### FT_DebugPageContentGenerator (Content Generation)
|
||
**Покрывает:**
|
||
- Генерацию непустого контента для всех зарегистрированных страниц
|
||
- Корректность работы всех функций обновления (`UpdateMovementPage`, `UpdateSurfacePage`, `UpdatePerformancePage`)
|
||
- Обработку случаев отсутствия Movement Component
|
||
- Валидность сгенерированного контента
|
||
|
||
### Test Coverage
|
||
```typescript
|
||
// Тестируемые сценарии
|
||
TestScenarios = [
|
||
'Инициализация системы с корректными параметрами',
|
||
'Навигация через все страницы в прямом направлении',
|
||
'Навигация через все страницы в обратном направлении',
|
||
'Генерация контента при наличии Movement Component',
|
||
'Генерация контента при отсутствии Movement Component',
|
||
'Переключение видимости debug HUD',
|
||
'Переключение визуальной отладки',
|
||
'Обновление с различными частотами',
|
||
'Обработка пустого списка страниц',
|
||
'Восстановление после ошибок'
|
||
]
|
||
```
|
||
|
||
## Интеграция с системами
|
||
|
||
### С Movement System
|
||
```typescript
|
||
// Получение данных движения для отображения
|
||
UpdateMovementPage(Page: S_DebugPage): S_DebugPage {
|
||
if (SystemLibrary.IsValid(this.MovementComponent)) {
|
||
return {
|
||
...Page,
|
||
Content:
|
||
`Max Speed: ${this.MovementComponent.MovementConstants.MaxSpeed}\n` +
|
||
`Acceleration: ${this.MovementComponent.MovementConstants.Acceleration}\n` +
|
||
`Friction: ${this.MovementComponent.MovementConstants.Friction}\n` +
|
||
`Gravity: ${this.MovementComponent.MovementConstants.Gravity}`
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### С Toast System
|
||
```typescript
|
||
// Интеграция с уведомлениями
|
||
InitializeDebugHUD(MovementComponentRef, ToastComponentRef): void {
|
||
// ... инициализация ...
|
||
this.ToastComponent.ShowToast('Debug HUD Initialized', E_MessageType.Success)
|
||
}
|
||
|
||
ToggleVisualDebug(): void {
|
||
// ... переключение ...
|
||
this.ToastComponent.ShowToast(
|
||
`Visual Debug ${this.DebugSettings.ShowVisualDebug ? 'Enabled' : 'Disabled'}`
|
||
)
|
||
}
|
||
```
|
||
|
||
### С Input System
|
||
```typescript
|
||
// Привязка клавиш через Enhanced Input
|
||
IMC_Default.mapKey(IA_NextDebugMode, 'PageDown') // Следующая страница
|
||
IMC_Default.mapKey(IA_PrevDebugMode, 'PageUp') // Предыдущая страница
|
||
IMC_Default.mapKey(IA_ToggleHUD, 'F1') // Переключение HUD
|
||
IMC_Default.mapKey(IA_ToggleVisualDebug, 'F2') // Visual debug
|
||
```
|
||
|
||
## API Reference
|
||
|
||
### Публичные методы
|
||
|
||
#### InitializeDebugHUD()
|
||
```typescript
|
||
InitializeDebugHUD(MovementComponentRef: AC_Movement, ToastComponentRef: AC_ToastSystem): void
|
||
```
|
||
**Описание:** Инициализирует debug HUD систему с необходимыми компонентами
|
||
**Параметры:**
|
||
- `MovementComponentRef` - Ссылка на компонент движения для мониторинга
|
||
- `ToastComponentRef` - Ссылка на систему уведомлений
|
||
|
||
**Когда вызывать:** EventBeginPlay в главном персонаже после инициализации dependencies
|
||
**Эффекты:** Создает debug widget, регистрирует страницы, показывает success уведомление
|
||
|
||
#### UpdateHUD()
|
||
```typescript
|
||
UpdateHUD(CurrentTime: Float, DeltaTime: Float): void
|
||
```
|
||
**Параметры:**
|
||
- `CurrentTime` - Текущее игровое время в секундах
|
||
- `DeltaTime` - Время с последнего кадра в секундах
|
||
|
||
**Описание:** Основной цикл обновления debug информации
|
||
**Когда вызывать:** EventTick в главном персонаже
|
||
**Эффекты:** Обновляет счетчики, FPS, контент страниц
|
||
|
||
#### ToggleDebugHUD()
|
||
```typescript
|
||
ToggleDebugHUD(): void
|
||
```
|
||
**Описание:** Переключает видимость debug HUD между Visible и Hidden
|
||
**Эффекты:** Изменяет CurrentMode в DebugSettings, обновляет видимость виджета
|
||
|
||
#### NextPage() / PreviousPage()
|
||
```typescript
|
||
NextPage(): void
|
||
PreviousPage(): void
|
||
```
|
||
**Описание:** Навигация между debug страницами с циклическим переходом
|
||
**Требования:** Система должна быть инициализирована, наличие видимых страниц
|
||
**Эффекты:** Изменяет CurrentPageIndex, обновляет отображаемый контент
|
||
|
||
#### ToggleVisualDebug()
|
||
```typescript
|
||
ToggleVisualDebug(): void
|
||
```
|
||
**Описание:** Включает/выключает визуальную отладку (collision shapes, debug lines)
|
||
**Эффекты:** Изменяет ShowVisualDebug в DebugSettings, показывает toast уведомление
|
||
|
||
### Публичные свойства
|
||
|
||
#### DebugSettings (Instance Editable)
|
||
```typescript
|
||
DebugSettings: S_DebugSettings = {
|
||
CurrentMode: ESlateVisibility.Visible, // Режим видимости по умолчанию
|
||
CurrentPageIndex: 0, // Начальная страница
|
||
ShowVisualDebug: false, // Визуальная отладка отключена
|
||
UpdateFrequency: 0 // Обновление каждый кадр
|
||
}
|
||
```
|
||
|
||
#### ToastComponent (Public for Testing)
|
||
```typescript
|
||
ToastComponent: AC_ToastSystem | null = null
|
||
```
|
||
**Описание:** Публичная ссылка на Toast System для использования в тестах
|
||
**Use case:** Доступ к toast функциональности из test случаев
|
||
|
||
### Методы для тестирования
|
||
|
||
#### GetVisiblePages()
|
||
```typescript
|
||
GetVisiblePages(): UEArray<S_DebugPage>
|
||
```
|
||
**Описание:** Возвращает массив всех видимых debug страниц
|
||
**Use case:** Валидация навигации и подсчет доступных страниц в тестах
|
||
|
||
#### GetTestData()
|
||
```typescript
|
||
GetTestData(): {
|
||
IsInitialized: boolean,
|
||
DebugDataTable: DataTable<S_DebugPage>,
|
||
DebugPages: UEArray<S_DebugPage>
|
||
}
|
||
```
|
||
**Описание:** Предоставляет доступ к внутреннему состоянию для тестирования
|
||
**Use case:** Валидация инициализации и внутреннего состояния в автотестах
|
||
|
||
## Расширяемость
|
||
|
||
### Добавление новой debug страницы
|
||
1. **Расширить E_DebugPageID enum:**
|
||
```typescript
|
||
enum E_DebugPageID {
|
||
// ... existing pages
|
||
NetworkInfo = 'NetworkInfo' // Новая страница сетевой информации
|
||
}
|
||
```
|
||
|
||
2. **Добавить функцию обновления в E_DebugUpdateFunction:**
|
||
```typescript
|
||
enum E_DebugUpdateFunction {
|
||
// ... existing functions
|
||
UpdateNetworkPage = 'UpdateNetworkPage'
|
||
}
|
||
```
|
||
|
||
3. **Реализовать функцию обновления в AC_DebugHUD:**
|
||
```typescript
|
||
UpdateNetworkPage(Page: S_DebugPage): S_DebugPage {
|
||
return {
|
||
...Page,
|
||
Content:
|
||
`Ping: ${this.GetNetworkPing()}ms\n` +
|
||
`Packet Loss: ${this.GetPacketLoss()}%\n` +
|
||
`Bandwidth: ${this.GetBandwidth()} KB/s`
|
||
}
|
||
}
|
||
```
|
||
|
||
4. **Обновить switch в UpdateCurrentPage():**
|
||
```typescript
|
||
switch (CurrentPage.UpdateFunction) {
|
||
// ... existing cases
|
||
case E_DebugUpdateFunction.UpdateNetworkPage: {
|
||
CurrentPage = this.UpdateNetworkPage(CurrentPage)
|
||
break
|
||
}
|
||
}
|
||
```
|
||
|
||
5. **Добавить конфигурацию в DT_DebugPages:**
|
||
```typescript
|
||
{
|
||
Name: new Name('NetworkInfo'),
|
||
PageID: E_DebugPageID.NetworkInfo,
|
||
Title: 'Network Statistics',
|
||
Content: '',
|
||
IsVisible: true,
|
||
UpdateFunction: E_DebugUpdateFunction.UpdateNetworkPage
|
||
}
|
||
```
|
||
|
||
### Пример расширенной страницы производительности:
|
||
```typescript
|
||
UpdateAdvancedPerformancePage(Page: S_DebugPage): S_DebugPage {
|
||
return {
|
||
...Page,
|
||
Content:
|
||
`Frame: ${this.FrameCounter}\n` +
|
||
`FPS: ${this.FPS.toFixed(1)}\n` +
|
||
`Frame Time: ${(1000 / this.FPS).toFixed(2)}ms\n` +
|
||
`Memory: ${this.GetMemoryUsage()}MB\n` +
|
||
`Draw Calls: ${this.GetDrawCalls()}\n` +
|
||
`Triangles: ${this.GetTriangleCount()}\n` +
|
||
`Update Rate: ${this.GetUpdateRateDescription()}`
|
||
}
|
||
}
|
||
```
|
||
|
||
## Известные ограничения
|
||
|
||
### Текущие ограничения
|
||
1. **Статическая конфигурация страниц** - Страницы определяются в design-time через DataTable
|
||
2. **Фиксированный layout** - Трехсекционный layout (header, content, navigation) не настраивается
|
||
3. **Только текстовый контент** - Нет поддержки графиков, диаграмм, интерактивных элементов
|
||
4. **Однопоточное обновление** - Все страницы обновляются в main thread
|
||
|
||
### Архитектурные ограничения
|
||
1. **Линейная навигация** - Только последовательный переход между страницами
|
||
2. **Глобальная частота обновления** - Одна частота для всех страниц
|
||
3. **Зависимость от MovementComponent** - Большинство страниц требует Movement System
|
||
4. **UI thread blocking** - Сложные вычисления в update функциях могут блокировать UI
|
||
|
||
### Performance ограничения
|
||
1. **String concatenation** - Каждое обновление создает новые строки
|
||
2. **No data caching** - Данные пересчитываются при каждом обновлении
|
||
3. **Synchronous updates** - Все обновления выполняются синхронно в main thread
|
||
|
||
## Планы развития (Stage 3+)
|
||
|
||
### Краткосрочные улучшения
|
||
1. **Rich content support** - Поддержка графиков и визуальных элементов
|
||
2. **Configurable layouts** - Настраиваемые макеты для разных типов страниц
|
||
3. **Per-page update frequency** - Индивидуальная частота обновления для каждой страницы
|
||
4. **Data caching system** - Кэширование вычисляемых данных для оптимизации
|
||
|
||
### Средне срочные цели
|
||
1. **Interactive debug controls** - Слайдеры, чекбоксы для runtime настройки параметров
|
||
2. **Debug command console** - Консоль для выполнения debug команд
|
||
3. **Export/Import settings** - Сохранение и загрузка debug конфигураций
|
||
4. **Multi-monitor support** - Отображение debug информации на втором мониторе
|
||
|
||
### Долгосрочные цели
|
||
1. **Remote debug server** - Web-интерфейс для удаленной отладки
|
||
2. **Historical data tracking** - Сохранение и анализ исторических данных производительности
|
||
3. **AI-powered insights** - Автоматическое выявление проблем производительности
|
||
4. **Integration with profiling tools** - Связь с внешними профайлерами и аналитикой
|
||
|
||
## Интеграционные точки
|
||
|
||
### С Gameplay System
|
||
- **Game state monitoring:** Отслеживание состояния игровых объектов
|
||
- **Player statistics:** Мониторинг статистики игрока в реальном времени
|
||
- **Event logging:** Автоматическая запись важных игровых событий
|
||
|
||
### С Rendering System
|
||
- **Draw call monitoring:** Отслеживание количества draw calls
|
||
- **Texture memory usage:** Мониторинг использования видеопамяти
|
||
- **Shader performance:** Анализ производительности шейдеров
|
||
|
||
### С Audio System
|
||
- **Audio channel monitoring:** Отслеживание использования аудио каналов
|
||
- **3D audio debugging:** Визуализация 3D звуковых источников
|
||
- **Performance metrics:** Мониторинг производительности аудио подсистемы
|
||
|
||
## Файловая структура
|
||
|
||
```
|
||
Content/
|
||
├── Debug/
|
||
│ ├── Components/
|
||
│ │ └── AC_DebugHUD.ts # Core debug HUD logic
|
||
│ ├── Enums/
|
||
│ │ ├── E_DebugPageID.ts # Page identifier enum
|
||
│ │ └── E_DebugUpdateFunction.ts # Update function enum
|
||
│ ├── Structs/
|
||
│ │ ├── S_DebugPage.ts # Page data structure
|
||
│ │ └── S_DebugSettings.ts # Settings structure
|
||
│ ├── Tables/
|
||
│ │ └── DT_DebugPages.ts # Page configuration DataTable
|
||
│ ├── UI/
|
||
│ │ └── WBP_DebugHUD.ts # Debug HUD widget
|
||
│ └── Tests/
|
||
│ ├── FT_DebugSystem.ts # Basic functionality tests
|
||
│ ├── FT_DebugNavigation.ts # Navigation system tests
|
||
│ └── FT_DebugPageContentGenerator.ts # Content generation tests
|
||
├── Input/
|
||
│ └── IMC_Default.ts # Input mapping integration
|
||
└── Blueprints/
|
||
└── BP_MainCharacter.ts # Main integration point
|
||
```
|
||
|
||
## Best Practices
|
||
|
||
### Использование в коде
|
||
```typescript
|
||
// ✅ Хорошо - полная инициализация с зависимостями
|
||
this.DebugHUDComponent.InitializeDebugHUD(
|
||
this.MovementComponent,
|
||
this.ToastSystemComponent
|
||
)
|
||
|
||
// ✅ Хорошо - проверка инициализации перед использованием
|
||
if (this.DebugHUDComponent.GetTestData().IsInitialized) {
|
||
this.DebugHUDComponent.UpdateHUD(gameTime, deltaTime)
|
||
}
|
||
|
||
// ✅ Хорошо - контролируемая частота обновления для performance
|
||
this.DebugHUDComponent.DebugSettings.UpdateFrequency = 30 // 30 Hz
|
||
|
||
// ❌ Плохо - обновление без проверки инициализации
|
||
this.DebugHUDComponent.UpdateHUD(gameTime, deltaTime)
|
||
|
||
// ❌ Плохо - слишком высокая частота обновления
|
||
this.DebugHUDComponent.DebugSettings.UpdateFrequency = 120 // Избыточно
|
||
|
||
// ❌ Плохо - навигация без видимых страниц
|
||
if (this.DebugHUDComponent.GetVisiblePages().length === 0) {
|
||
this.DebugHUDComponent.NextPage() // Может привести к ошибке
|
||
}
|
||
```
|
||
|
||
### Рекомендации по созданию страниц
|
||
```typescript
|
||
// ✅ Хорошо - проверка валидности компонентов
|
||
UpdateCustomPage(Page: S_DebugPage): S_DebugPage {
|
||
if (SystemLibrary.IsValid(this.RequiredComponent)) {
|
||
return { ...Page, Content: 'Valid data' }
|
||
} else {
|
||
return { ...Page, Content: 'Component Not Found' }
|
||
}
|
||
}
|
||
|
||
// ✅ Хорошо - форматированный контент с единицами измерения
|
||
Content: `Temperature: ${temperature}°C\nPressure: ${pressure} kPa`
|
||
|
||
// ✅ Хорошо - использование fallback значений
|
||
const fps = this.FPS > 0 ? this.FPS.toFixed(1) : 'N/A'
|
||
|
||
// ❌ Плохо - отсутствие проверок валидности
|
||
UpdateBadPage(Page: S_DebugPage): S_DebugPage {
|
||
return { ...Page, Content: this.UndefinedComponent.SomeProperty } // Crash!
|
||
}
|
||
```
|
||
|
||
### Performance рекомендации
|
||
- **Используйте UpdateFrequency:** Установите разумную частоту обновления (10-30 Hz для большинства случаев)
|
||
- **Кэшируйте тяжелые вычисления:** Не пересчитывайте сложные метрики каждый кадр
|
||
- **Проверяйте видимость:** Обновляйте только видимые страницы
|
||
- **Ленивое форматирование:** Форматируйте строки только при изменении данных
|
||
|
||
### Отладка debug системы
|
||
```typescript
|
||
// Проверка состояния системы
|
||
console.log('Debug HUD State:', this.DebugHUDComponent.GetTestData())
|
||
|
||
// Валидация навигации
|
||
console.log('Visible Pages:', this.DebugHUDComponent.GetVisiblePages().length)
|
||
console.log('Current Index:', this.DebugHUDComponent.DebugSettings.CurrentPageIndex)
|
||
|
||
// Мониторинг производительности
|
||
console.log('Update Frequency:', this.DebugHUDComponent.DebugSettings.UpdateFrequency)
|
||
console.log('FPS Impact:', this.measureDebugOverhead())
|
||
```
|
||
|
||
## Заключение
|
||
|
||
Debug System представляет собой комплексную систему для мониторинга и отладки игровых систем в реальном времени. Система спроектирована с акцентом на расширяемость, производительность и удобство использования разработчиками.
|
||
|
||
**Ключевые достижения:**
|
||
- ✅ Многостраничный интерфейс с интуитивной навигацией
|
||
- ✅ Контролируемая частота обновления для оптимизации производительности
|
||
- ✅ Глубокая интеграция с Movement System для реального мониторинга
|
||
- ✅ Comprehensive система тестирования (3 автотеста покрывающих core функциональность)
|
||
- ✅ Расширяемая архитектура через DataTable конфигурацию
|
||
- ✅ Toast уведомления для feedback разработчику
|
||
|
||
**Готовность к production:**
|
||
- Все автотесты проходят успешно для основных сценариев использования
|
||
- Performance impact минимален при корректной настройке UpdateFrequency
|
||
- Система интегрирована с Enhanced Input для удобного управления
|
||
- Готова к добавлению новых страниц без изменения core логики
|
||
- Полная совместимость с существующими системами (Movement, Toast, Input)
|
||
|
||
**Архитектурные преимущества:**
|
||
- Четкое разделение между data (S_DebugPage), presentation (WBP_DebugHUD) и logic (AC_DebugHUD)
|
||
- Декларативная конфигурация через DataTable устраняет hard-coding
|
||
- Модульная система позволяет легко добавлять/удалять страницы
|
||
- Event-driven архитектура с минимальными coupling между компонентами
|