Я створюю компонентну систему ігрових об'єктів . Деякі поради:
GameObjectце просто списокComponents.- Є
GameSubsystems. Наприклад, візуалізація, фізика тощо. КоженGameSubsystemмістить вказівники на деякі зComponents.GameSubsystemце дуже потужна і гнучка абстракція: вона представляє будь-який фрагмент (або аспект) ігрового світу.
Існує потреба в механізмі реєстрації Componentsв GameSubsystems(коли GameObjectстворюється і складається). Існує 4 підходи :
- 1: Схема ланцюжка відповідальності . Кожному
Componentпропонується коженGameSubsystem.GameSubsystemприймає рішення, якіComponentsреєструвати (і як їх організувати). Наприклад, GameSubsystemRender може реєструвати передавальні компоненти.
профі. Componentsнічого не знаю про те, як вони використовуються. Низька муфта. A. Ми можемо додати нове GameSubsystem. Наприклад, додамо GameSubsystemTitles, який реєструє всі ComponentTitle і гарантує, що кожен заголовок є унікальним і забезпечує інтерфейс до запитуючих об'єктів за заголовком. Звичайно, ComponentTitle в цьому випадку не слід переписувати чи успадковувати. В. Ми можемо реорганізувати існуючі GameSubsystems. Наприклад, GameSubsystemAudio, GameSubsystemRender, GameSubsystemParticleEmmiter можна об'єднати в GameSubsystemSpatial (розмістити все аудіо, випромінювач, візуалізувати Componentsв одній ієрархії та використовувати перетворення, пов'язані з батьками).
кон. Кожна перевірка. Дуже неефективно.
кон. Subsystemsзнати про Components.
- 2: Кожен
SubsystemпошукComponentsконкретних типів.
профі. Кращі показники, ніж у Approach 1.
кон. Subsystemsдосі знаю про Components.
- 3:
Componentреєструється вGameSubsystem(s). Ми знаємо, що під час компіляції існує GameSubsystemRenderer, тому давайте ComponentImageRender буде називати щось на зразок GameSubsystemRenderer :: register (ComponentRenderBase *).
профі. Продуктивність. Немає зайвих перевірок, як у Approach 1.
кон. Componentsпогано поєднуються GameSubsystems.
- 4: Шаблон посередника .
GameState(що міститьGameSubsystems) може реалізувати registerComponent (Компонент *).
профі. Componentsі GameSubystemsнічого не знають один про одного.
кон. У C ++ це виглядало б як потворне і повільне типу-перемикача.
Запитання:
Який підхід краще і в основному застосовується в компонентному дизайні? Що говорить практика? Будь-які пропозиції щодо впровадження Approach 4?
Дякую.
Componentsв GameObjectsвиходить за рамки мого питання. Читайте статті про компонентний підхід або задайте собі запитання на цьому веб-сайті, якщо вас це цікавить. Те, про що ви думаєте GameSubsystem, абсолютно неправильно.