Які схеми дизайну програмування корисні при розробці ігор? [зачинено]


129

У мене є кілька книжок про шаблони дизайну, і я прочитав деякі статті, але не можу інтуїтивно зрозуміти, які схеми дизайну програмування будуть корисні при розробці ігор.

Наприклад, у мене є книга під назвою ActionScript 3 з шаблонами дизайну, в якій детально описано кілька моделей дизайну, таких як контролер перегляду моделі, Singleton, Factory, Command тощо.

Як хтось новий у цьому, я не можу зрозуміти, що з них було б корисним, чи насправді, якщо будь-який із них є моделями дизайну, які я повинен вивчати та намагатися використовувати. Можливо, є й інші, більш ігрові схеми дизайну, про які я навіть не знаю?

Якщо у вас є досвід використання певного шаблону дизайну в розробці ігор, я б хотів це почути. Обґрунтування того, чому він використовувався, зразки коду чи Інтернет-ресурси, також були б дуже корисними, якщо у вас є. На даний момент я найбільше зацікавлений у впровадженні ActionScript 3 та C ++, але, безумовно, міг би скористатися досвідом та прикладами з будь-якої мови.

Дякую!


"Можливо, є й інші, більш ігрові схеми дизайну, про які я навіть не знаю?" - ні, ці зразки є загальними, і більше стосуються розширення можливостей мови, якою ви користуєтесь. Вони не мають нічого спільного з предметом вашої заяви.
Кілотан

3
@Kylotan З моєї обмеженої точки зору, здається, що оскільки кожна модель дизайну призначена для ефективного вирішення певної проблеми, за своєю природою деякі дизайнерські зразки були б кориснішими, ніж інші з огляду на певну проблему, а саме в цьому випадку, ці проблеми задаються унікальними для розробки ігор. Напевно, є якісь вказівки чи виходячи з вашого досвіду, конкретних моделей дизайну, які ви часто використовуєте, ніж інші?
jcurrie33

Перш ніж хтось піде і вивчить 1000 різних моделей дизайну, будь ласка, прочитайте це та це
BlueRaja - Danny Pflughoeft

@ BlueRaja-DannyPflughoeft Посилання недійсне. Можете надіслати його
Емадпрес

Відповіді:


163

Тепер для менш легкої відповіді, з деякими пропозиціями. Не сприймайте це як рекомендації щодо впровадження, а більше як приклади можливого використання.

  • Builder: налаштуйте об'єкт на основі компонентів по одному компоненту за раз на основі даних
  • Фабричний метод: створити віджети NPC або GUI на основі рядка, прочитаного з файлу
  • Прототип: зберігайте один загальний символ 'Elf' з початковими властивостями та створюйте екземпляри Elf, клонуючи його.
  • Синглтон: цей простір навмисно залишився порожнім.
  • Адаптер: включіть додаткову бібліотеку сторонніх виробників, загорнувши її в шар, схожий на існуючий код. Дуже корисно з DLL.
  • Композит: складіть графік сцени з зображуваних об'єктів або створіть графічний інтерфейс із дерева віджетів
  • Фасад: спростіть складні сторонні бібліотеки, надавши більш простий інтерфейс, щоб згодом полегшити ваше життя.
  • Легка вага: зберігайте спільні аспекти NPC (наприклад, моделі, текстури, анімації) окремо від окремих аспектів (наприклад, положення, здоров'я) переважно прозорим способом
  • Проксі: Створіть невеликі класи на клієнті, які представляють великі, складніші класи на сервері, і переадресація запитів через мережу.
  • Ланцюг відповідальності: обробляти введення як ланцюжок обробників, наприклад. глобальні клавіші (наприклад, для знімків екрана), потім графічний інтерфейс (наприклад, якщо текстове поле зосереджене або меню вгору), то гра (наприклад, для переміщення персонажа)
  • Команда: інкапсулюйте функціонал гри як команди, які можна вводити в консоль, зберігати та відтворювати або навіть сценарій, щоб допомогти перевірити гру
  • Посередник: реалізовуйте ігрові сутності як невеликий посередницький клас, який працює на різних компонентах (наприклад, читання з компонента здоров’я для передачі даних в компонент AI)
  • Спостерігач: пропонуйте зображувальне зображення персонажа слухати події з логічного подання, щоб змінити візуальну презентацію, коли це необхідно, без логіки гри, нічого необхідного знати про код візуалізації
  • Держава: зберігайте NPI AI як один із кількох станів, наприклад. Напади, блукання, втечі. Кожен може мати власний метод update () та будь-які інші необхідні йому дані (наприклад, зберігання того, якого персонажа атакує чи втікає з нього, області, в якій він блукає тощо).
  • Стратегія: переключіться між різною евристикою для пошуку A *, залежно від того, на якій місцевості ви перебуваєте, або, можливо, навіть використовувати один і той же A * фреймворк, щоб зробити як обхід маршрутів, так і більш загальне планування
  • Метод шаблону: встановіть загальний порядок «бойових дій» з різними функціями гака для обробки кожного кроку, наприклад. зменшення боєприпасів, обчислення шансу удару, вирішення удару або пропуску, обчислення шкоди, і кожен тип навичок атаки реалізує методи по-своєму.

Деякі зразки залишилися через відсутність натхнення.


Дуже просвічуючу дискусію про синглів можна знайти тут: misko.hevery.com/2008/08/25/root- why-of-singletons
Andrew Wang

+1 для моделі стратегії. Я використовував це для вказаної вище мети (підключення різних евристик A *).
Майк Стробель

1
спасибі за цю відповідь, ті звучать більше як шаблон дизайну, ніж звичайний "одиночний", я чую всюди ...
jokoon

Чудовий список прикладів. Незважаючи на хронічне зловживання однотонною схемою (глобальна держава в маскуванні), існують законні способи використання: Коли він представляє ресурс, який ви насправді маєте лише (або хочете). Це може бути щось на кшталт обгортання апаратного забезпечення (наприклад, клавіатури / миші) або загортання бібліотеки, яка не є ретентом (це буває, і не всі мови мають магічні ключові слова синхронізації).
чарстар

11
Я все одно не використовую одиночні кнопки для апаратних ресурсів - предмети, на які ви думаєте, що у вас буде колись схильний до розмноження пізніше, як і відеокарти та монітори, як робили роки. Так само під деякими API потрібно прочитати 2 джойстика, щоб зрозуміти 1 геймпад. Тож я б сказав, якщо вам потрібна лише одна річ, просто інстанціюйте одну, не застосовуйте довільних обмежень, які, ймовірно, не потрібні.
Kylotan

59

Я написав книгу саме на цю тему: Шаблони ігрового програмування . Розділи, які там є, можуть бути корисними для вас.


2
+1 Я сподівався, що хтось пов’язав це, і я бачу, що автор має! Опис шаблону компонентів там був дуже корисним, і мені подобається, що ви намагаєтесь використовувати цілісні приклади коду для демонстрації.
CodexArcanum

2
Так, я пам'ятаю, як читав ваше посилання кілька років тому. Ви повинні закінчити ці статті!
onedayitwillmake

2
Зараз книга закінчена :)
Дусан

1
Дивовижний ресурс, який допоміг мені перекласти наявні знання з програмування в програмування для ігор. Дякуємо, що написали це!

Це пояснення моделей ігрового програмування насправді допомогло мені зрозуміти «шаблони дизайну» таким чином, що жодна книга дизайну програмного забезпечення дійсно не робила! Це частково сила розвитку гри (конкретні приклади мовою, яка розмовляє зі мною і дозволяє мені покращити загальний розвиток), але більшою частиною тому, що написання настільки відмінне.
Kzqai

19

Одне, що Брендон Ейх мав гарний сенс виховувати в програмі Coders на роботі, - це те, що шаблони - це хакі та обхідні шляхи: [Шаблони] показують певний дефект мови. Ці візерунки не є безкоштовними. Безкоштовного обіду немає. Тож нам слід шукати еволюцію в мові, яка додає правильних шматочків.

Як ігрові програмісти, а не дизайнери-компілятори, ми рідко отримуємо можливість розвивати мови, якими ми користуємось, але можемо навчитися розвивати власний стиль, щоб краще відповідати нашій мові та вимогам. Шаблони є деяким із цього, але не використання шаблонів є іншою частиною, тим більше, що, як каже Брендон, шаблони рідко обходяться без помітних витрат на продуктивність чи пам'ять чи коди. MVC просто не чудовий зразок для багатьох речей в іграх. Singleton - це вирішення для кульгавих правил статичної ініціалізації C ++, і ви, мабуть, не повинні цього робити. Фабрика спрощує створення складних об'єктів - можливо, ваші об'єкти повинні бути просто простішими для початку. Популярні зразки - це інструменти, до яких можна вдатися, коли вони нам потрібні щоб керувати чимось складним, а не інструментами, які нам слід прагнути використати, щоб побудувати щось складне на початку.

Хороший (ігровий) код може використовувати шаблони, а може і ні. Якщо він використовує шаблони, добре - вони чудовий комунікаційний інструмент для пояснення структури коду іншим програмістам на високому, незалежному від мови рівні. Якщо ви вважаєте, що код краще без використання шаблону, не перебивайте його над цим - це, мабуть, так.


4
Так, одна з речей, що було зрозуміло в оригінальній книзі (але часто не помічається), це те, що якби вона була написана для C, а не для C ++ / Smalltalk, вони, можливо, включили б шаблон "Спадкування" і, таким же чином, деякі мови може містити деякі з вже вбудованих моделей GoF.
Kylotan

13
Інша річ, яку часто не помічають в оригінальній книзі (оригінальна оригінальна книга Олександра, а не GoF), - це те, що шаблони - це інструмент спілкування , а не реалізація . Вони дозволяють дизайнерам повідомляти про впровадження на більш високому рівні та визначаються тому, що вони повторюються, а не обов'язково тому, що їх слід використовувати, коли це можливо.

1
Однак просто наявність термінології може допомогти вам розібратися в проблемі і визнати, коли такий підхід є хорошим рішенням. Найкращі зразки, як правило, вдосконалювались з часом кваліфікованими та досвідченими працівниками, і менш кваліфіковані працівники самі не відкривали б ті самі моделі, не існуючи цих кодифікованих прикладів.
Кілотан

Я погоджуюся, що володіти термінологією - це чудово, і частина визначення шаблону полягає в тому, що це хороше повторюване рішення якоїсь проблеми. На жаль, менш кваліфіковані працівники, як правило, знаходять синглтон, і застосовують його до кожної проблеми, навіть коли ще немає проблеми.

Дякую за цю відповідь; Я почуваю полегшення читати, що модель дизайну створена для вирішення проблем, створених дизайном програмного забезпечення. Я думаю, що слід розглянути структуру цілого великого програмного забезпечення від початку до кінця, перш ніж насправді починати щось кодувати. Ви не завжди можете реалізовувати функціонали один раз за часом, колись вам доведеться продумати кожну конкретну функцію та перевірити, чи вона не зіпсується із глобальною структурою програмного забезпечення або просто перешкоджає тому, як це програмне забезпечення призначене поводитись Поділ завдань на декількох програмістів може колись створити суперечності ...
jokoon

7

Звичайно, як говорили інші, всі моделі корисні в правильних обставинах, і частина навчання, як ними користуватися, - це навчання, коли ними користуватися. Однак у чудовій книзі Основні методи та алгоритми ігрового програмування Даніеля Санчеса-Креспо Далама перелічено шість моделей програмування та шість моделей зручності використання, як особливо корисні в програмуванні ігор.

Програмування:

  • Сінглтон: Я не ненавиджу цього, як це роблять багато людей; його можна використовувати для таких речей, як плеєр для одного гравця або зчитувач клавіатури.
  • Фабрика: Дозволяє ефективно створювати та знищувати об'єкти.
  • Стратегія: Дозволяє елегантно змінювати стратегії AI.
  • Просторовий індекс: допомагає виконувати запити на наборах просторових даних.
  • Композит: Встановлює корисну ієрархію об'єкта.
  • Легкий вага: звільняє пам’ять, генеруючи речі, як ідентичні вороги.

Корисність:

  • Щит: захищає від випадкового активізації драматичних дій.
  • Стан: Візуальний підказки світу / статус інтерфейсу користувача.
  • Скасування автоматичного режиму: Робить гру більш наочною.
  • Магнетизм: Автонаправлення та простий вибір блоку.
  • Фокус: Усунення відволікаючих елементів інтерфейсу користувача
  • Хід роботи: Універсально корисний.

Книга, звичайно, детальніше описується щодо кожного з них.


Дякую за вклад! Мені не було відомо про цю книгу, але я розгляну її зараз як результат вашого допису. Знову дякую!
jcurrie33

2
Синглтон для зчитувача клавіатури - це саме та ситуація, коли я мушу запитати - Ви можете справді не просто зробити так, щоб глобальний покажчик встановлений на початку вашої основної функції? Ви коли-небудь насправді випадково інсталювали два зчитувачі клавіатури?

Будь ласка, ненавиджу одиночку. Це робить дві речі погано. Глобальний доступ та сукупність. Часто розробники думають, що глобальний доступ == однотонний. Існує дуже мало проблем, ніж потрібен справжній синглтон, і, можливо, ще кілька, які є більш елегантними, коли їх вирішують синглтон.
deft_code

7

Системи сутності є приємним видом. Це не зовсім модель дизайну, оскільки це не строко OOP. Однак ви можете змішати його з OOP.

Кілька хороших посилань (початок зверху для введення):


3
"Це не зовсім модель дизайну, оскільки це не є надзвичайно складним OOP." Шаблони дизайну не мають нічого спільного з OOP; якщо що-небудь, то OOP - це модель дизайну. Шаблони дизайну з’являються не тільки поза OOP, а повністю поза розробкою програмного забезпечення.

Існують такі, OOP design patternsщо зазвичай показують взаємозв'язки та взаємодії між класами / об'єктами. І є багато інших моделей дизайну. OOP - це сукупність понять, а не модель насправді. Design patternце також концепція.
точний

6
Замість того, щоб говорити про семантичне, чи не варто оцінювати корисність відповіді, яку я дав?
Wernight

6

Усі. За винятком Сінглтона. [/ фліппанство]


Чи можете ви назвати один чи два шаблони дизайну, які ви часто використовували при розробці ігор, і з якої причини? Як початківець щодо дизайнерських моделей, "всі вони" не є особливо корисною відповіддю. Дякую, що відгукнулися.
jcurrie33

5
На запитання "якими моделями ви користувалися?" це як запитати "які імена змінних ви використовували?" Це зводиться до особистого стилю та вимог та домену. В якийсь момент ви, ймовірно, будете використовувати будь-який візерунок, який колись був названий. Ви, напевно, будете використовувати багато інших, які не були названі, а можливо, навіть винайдете якісь нові.

@ jcurrie33: Вибачте, я просто не міг протистояти копанню спочатку в одиночних кнопках. ;)
Кілотан

6

Не дуже про закономірності, а про основні принципи, що стоять за ними У "Шаблонах дизайну: елементи багаторазового використання об'єктно-орієнтованого програмного забезпечення" (1995) банда з чотирьох (Гамма, Еріх; Річард Гельм, Ральф Джонсон та Джон Вліссайдс) рекомендує лише два принципи для об'єктно-орієнтованого дизайну: (1) програма для інтерфейс, а не реалізація та (2) перевагу композиції об’єктів над успадкуванням класів.

Ці 2 принципи дуже допомагають у багатьох завданнях розвитку ігор. Наприклад, багато ігрових програмістів використовували ієрархію глибокого класу для представлення ігрових сутностей. Існує ще один підхід, заснований на композиції - ігрові об'єкти на основі компонентів. Стаття про такий підхід. Ще більше посилань . Це приклад декору декоратора .


Компоненти, що використовуються в дизайні ігор, більше схожі на конспективну схему стратегії, яка, природно, виражається як закриття за межами C / C ++ / Java / C #, так і як компонентні об'єкти всередині них. Шаблон декоратора більше нагадує проксі; його володіння та потік даних протилежні тим, про які ми зазвичай маємо на увазі, коли ми говоримо про складові системи в іграх.

Компоненти також повинні поговорити один з одним, запровадивши такі моделі, як «Посередник», «Спостерігач» та «Композитор». "Компонентна гра" - це складна модель дизайну сама по собі.
CodexArcanum

@CodexArcanum, Observer, визначено, але не завжди Посередник (натомість можна використовувати ланцюжок відповідальності). Він є лише композитором, якщо GameObject (що складається з GameObjectComponent) є самим GameObjectComponent (не необхідним).
точний

6

Цікаво повторюється картина шаблону може бути дуже корисною для запобігання віртуальних методів і втрати продуктивності , які можуть виходити від викликів віртуальних функцій.

Це може бути відповідна модель, коли вам насправді не потрібно мати контейнер типу базового класу, який має інтерфейс, за яким ви шукаєте, але ви хочете мати аналогічні назви поведінки та інтерфейси.

Наприклад, ви можете використовувати це під час компіляції класів для декількох платформ або двигунів (dx проти opengl), де дисперсія типу відома під час компіляції.


Я завжди ненавидів, що шар абстракції os є віртуальним. Це не так, як вам колись знадобиться два шари відсмоктування. Набагато краще використовувати CRTP.
deft_code

Можливо, я просто стара, але я навіть не використовую CRTP для інтерфейсів DX / OpenGL або платформи. Це занадто повільно збирати - я б просто використовував typedefs. CRTP добре, коли ви хочете ділитися інтерфейсами та реалізаціями між класами, але не маєте іншого відношення, не коли ви просто хочете вибрати одну чи іншу структуру.

4

Шаблон дизайну, який я розвивався протягом багатьох років і який був для мене надзвичайно корисним, - це те, що я називаю "посередницькими наборами визначення"; як узагальнити його в термінах GOF видається суперечливим, але це запитання, про яке я писав про нього на StackOverflow, вникає в нього детально.

Основна концепція полягає в тому, що деяка властивість моделі, як і вид істоти, налаштована так, що кожне можливе значення для властивості має відповідний об'єкт визначення - єдиний, спільний об'єкт на значення -, що визначає його поведінку, і доступ до них здійснюється через центрального брокера (який, по GOF, може бути Реєстром, Фабрикою або обома). У моєму використанні до них також зазвичай звертаються за допомогою скалярних клавіш, щоб полегшити слабке зв'язування для цілей морфізму виконання.


Я не бачу, як це взагалі сингл, і при обговоренні моделі з легкою вагою слово "реєстр" є зайвим. Це просто легка вага.

Моє розуміння з потоку SO полягало в тому, що люди визначили Singleton як його частину через визначення, які встановлюються як класи. Що стосується реєстру, я не бачу, як це може бути зайвим, коли його можна замінити або комбінувати з Factory.
хаос

-1, наскільки шаблони стосуються швидкого спілкування, це, мабуть, найбільша невдача, яку я бачив. Я справді не можу сприймати цей опис серйозно.

Ісусе, пробач мене за те, що я не став тобі печивом. Чи збираєтесь ви проголосувати "відповідні системи" відповідь теж тому, що це не миттєво підсумовується в термінах GOF?
хаос

1
Якась кількість «вирізань печива», або, принаймні, семантична ясність - саме те, якими повинні бути корисні шаблони. Такі терміни, як "легка вага" та "однотонний", як їх прийнято розуміти, є взаємовиключними. Перший - це автоматичний обмін даними між кількома екземплярами; другий - це мати саме один екземпляр. Я не кажу, що ваш вибір дизайну марний або навіть поганий, але зубріння "досить близьких" назв шаблонів разом просто все більше бентежить. (Будь ласка, не приймайте доріжки особисто, особливо на CW.)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.