Як Dwarf Fortress відслідковує стільки сутностей, не втрачаючи результатів?


79

У фортеці карликів у будь-який момент у грі ви можете мати сотні гномів, тварин, гоблінів тощо, кожен зі своїм складним AI та рутинним режимом. Моє запитання: як це не призводить до помітного уповільнення? Чи кожен Гном працює у своїй власній нитці?


6
Цікаве запитання. Хоча мені не подобається те, як це висловлено фразою, оскільки просто було б спекуляцією відповісти на це запитання як сформульовано. У будь-якому випадку ви, можливо, бачили цю статтю, що розмовляла з Тарном Адамсом. Де вони коротко висвітлюють пошук шляхів.
MichaelHouse

25
Це абсолютно спричиняє помітне уповільнення, коли у вас складна тунельна топологія та 100 гномів.
Рассел Борогов

3
Так, DF за моїм досвідом неймовірно повільний у сценарії, який ви описуєте.
аргументація

4
Знищіть первинну сходову клітку і спостерігайте за тим, як ваш кадр на мить падає, як скеля, в той час як кожен гном раптово відштовхується.
Mooing Duck

2
Я збираюся прозвучати і погоджуюсь, що DF - не найкращий приклад; насправді, відомо, що DF страждає від проблем з ефективністю.
Роберт С.

Відповіді:


110

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

Проста відповідь - просто бути ефективною щодо обробки кожної сутності в грі.

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

2
+1 для цього, щоб фактично пояснити, що відбувається, а не задумуватися над такою графікою, як я. :)
Метт Кемп

4
Якщо чесно, я дав вам ще й +1, бо я забув про цей аспект, і це дуже правда - вийміть gfx з рівняння, і це як зробити комп'ютери 2х чи 3х швидшими миттєво.
Kylotan

Я чув, що DF зараз багатопотокове, але принаймні донедавна це робилося в одну нитку. (Це все ще може бути, не впевнений)
Mooing Duck

@MooingDuck Досі це не так.
Tharwen

63

Карликова фортеця не є відкритим кодом, і хоча існує велика кількість гіпотез та зворотної інженерії, які можуть втрутитися в те, як це все працює, я замість цього зосередитимусь на деяких основних методах оптимізації 3D (не 3D графіки, 3D світу) одного типу.

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

Рух

Якщо говорити про нанесення маршрутів, то це може бути дуже важкою проблемою для вирішення великих просторів, як, наприклад, карта DF (цілком 768x768x64 IIRC), проте проблему можна спростити та прискорити таким чином:

  • Заздалегідь запечена мережа вузлів: Коли карта створена, світ можна розбити на шматки, і кожен шматок може мати свої виходи та входи. Коли фрагмент оновлюється, наприклад, коли будується стіна, потрібно лише оновити мережу цього фрагмента.
  • Поетапна трафаретна перевірка: Проведення шляху по всій карті, комірці для комірки, зайняло б багато часу, замість цього ви будете шукати шлях по більшій мережі, яка відображає все з'єднання між шматками, а потім виконувати лише внутрішньочерепичний шлях, коли перехід від шматка до шматка. Це робить 2 речі для вас. Це прискорює пошук маршруту, розбиваючи його на багато менших шматочків, а також дозволяє пристрою змінювати частину напрямку напрямку вздовж шляху, коли фрагмент оновлюється. Він буде повторно прокладений через велику мережу, якщо будь-який з вузлів йому потрібно перетнути оновлення.
  • Випадкове рульове управління: не рухаючись до цілі, підрозділу потрібно лише безцільно ходити. Багато негідників просто переміщують пристрій у випадковому напрямку, що відчуває себе неприродно. Можуть бути використані різні методи рульового управління, прості - вони віддають перевагу переміщенню по прямій лінії і мають менше і менше шансів рухатись у напрямку, що випромінює назад, що має шанс приблизно на 1%. Таким чином, агрегат іноді цілком би перевертав напрямок, але лише рідко.

Я не буду висвітлювати основи проходження маршруту. Більшість негідників використовують A *, але є й інші методи, як шкіру кота. Мммм Котяча шкіра ..

Особисті завдання

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

Деякі завдання мають вимоги. Зробити шкіряну спідницю вимагає, щоб dorf був у такому магазині, де є X предметів. Тож усі вони перевіряються та додаються як завдання до їх списку. Просто як це.

Оскільки більшість часу підрозділ буде в дорозі, перевірки того, що роблять підрозділи, можуть бути дуже швидкими, лише кілька одиниць будуть робити вибір у будь-який момент, і тому загалом немає сповільнення навіть на сотні чи тисячі одиниць. І пам’ятайте, в DF все - від бджіл до троглодитів до дерев - це одиниці.


Здійснюючи додаткові дослідження, зрозуміло, що DF, як це дивно, займається жахливою роботою в пошуку шляху. Це не розбиття карти на шматки, це розбиття карти на пов'язані між собою сегменти або ділянки (що краще, ніж нічого точно), тому моя вище оцінка є ще менш прикладом того, як працює DF, ніж я думав. :) Що не означає, що DF - це щось менш дивовижне з мільйона інших причин.

Це свідчить про те, що важливо в грі - гра. Не графіка, не чудове програмування, не чудова написання, не чудова музика, навіть інтерфейс; нічого іншого навіть 1% не так важливо, як сама гра.


1
1024X1024X32? По вертикалі - 128 або 256, я вважаю. Це набагато більше, ніж 32.
Лоутон

@Lawton Я вважаю, що я помиляюся щодо максимального розміру, але висота не є такою неправильною. Я це виправляю. Я завантажив гру, і початок, на якому я зараз, лише близько 45 рівнів. Більше може бути «змодельовано», але я не маю доступу до них для копання чи будівництва.
DampeS8N

@ DampeS8N Я щойно завантажив не змінену, середню карту і зміг переглянути від +16 до -156, приблизно на 180 рівнях. Карти рівня 40 - це виняток, а не правило. Навіть якщо ви зможете копати лише 40 з-за того, що їх перекрив водоносний горизонт або лава, це не актуально, оскільки територія під ним все ще заселена імітацією веселощів.
Лоутон

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

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

50

З цієї сторінки :

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

ТА: Гноми здебільшого пересуваються з A *, із звичайною старою евристикою вулиць. Хитра частина полягає в тому, що він насправді не може зателефонувати на A *, якщо вони не знають, що зможуть потрапити туди заздалегідь, або це в кінцевому підсумку затопить карту і вбиває процесор.

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

Ієрархічне визначення шляху

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

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

Існує також абстракція HPA *, яка має справу з одиницями, які можуть проходити через деякі місцевості, але не інші (наприклад, скелі, по яких повітряні установки можуть переходити, але наземні установки не можуть) . Це називається НАА * , і є дуже доступна стаття пояснюючи це тут .

Ви можете прочитати більше про різні алгоритми прокладання маршруту тут .


3
Я знайшов це відео від розробника RimWorld дуже просвічуючим. Це схожа гра, хоча тільки в 2D. Він пояснює основи, що стоять за маршрутом пошуку та переваги поділу карти на регіони. youtube.com/watch?v=RMBQn_sg7DA
Sire

18

Якщо що, то навпаки - вся справа працює на одній нитці, і тепер вона потрапляє в точку, коли це стає фактором блокування (востаннє я перевіряв!)

Причина, що це швидко, полягає в тому, що немає фантазійної графіки. Це оманливо, але головне, що сповільнює роботу, - це малювання речей (придумати дві третини кадру в заголовках AAA). Оскільки карликова фортеця є досить базовою, то решту часу вона приділяє займанням цікавих справ.


8
Одним із даних на користь цього є перезапис OpenGL з певного часу, який, як я пам'ятаю, приніс значне збільшення частоти кадрів. Таким чином, навіть простий графік спрайту, який DF ефективно зробив вплив.
мільйон

3
+1 Стрип-графіка = величезна кількість вільного часу для ігрових обчислень
Лоран Кувіду,

2
Варто відзначити, що графіка DF настільки ж вимоглива, як і будь-яка сучасна 2D-гра Інді. Існує багато текстур, навіть якщо вони невеликі та прості, і їх можна розповсюджувати на повноекранних моніторах нерухомості. Ніяких ефектних частинок немає, або що у вас є, але сира робота з "фарбою всіх цих пікселів" все ще присутня, і завдяки кількості дзвінків для малювання, необхідних для крихітних розмірів плитки, насправді є досить великим завданням зробити виконавцем.
DampeS8N

Спочатку це може виглядати як нерозумна відповідь, але це правильно, уявіть, що можна зробити з графіками 4-12 гб і потужністю GPU 4-12 тфлопс, якщо вам не потрібно малювати складні примітиви, розгортання, текстури, перетворювати 3d вектори в
двомірний

10

Я не знаю, як кодується DF, але кількість AI мене не дуже вражає, тому що те, що люди часто переглядають, що AI не потребує точності . Цілком реально робити більшість матеріалів лише кожні кілька секунд. Крім того, можливо використовувати неточні розрахунки. Недосконалість економить багато результатів . Ви можете запустити процедуру прийняття рішень у 100 одиниць кожні 100 мс, або ви можете виконувати її на 1000 одиниць щосекунди, це займе стільки ж часу процесора, але добре ... у вас є 10 разів більше одиниць.

Ось простий приклад того, як можна обробляти багато одиниць:

int curUnit;
Array<Unit> units;
[...]
while([...]) // Game Loop
{
  [...game logic...]
  // process 10 AIs per Frame
  for(int i=0; i++; i<10)
  {
    curUnit++
    if(curUnit == units.length()) curUnit=0;
    if(curUnit < units.length())
      units[curUnit].processAI();
  }

  // Update the position of all units, this should be as optimized as possible
  foreach(Unit& unit in units){ unit.move(); };

  [...graphics...]
}

ШІ стане все менше і менше реагувати, чим більше є, але гравець, ймовірно, помітить це лише у крайніх випадках.


Можна багато чого сказати для перегляду стеків завдань, які не є точними на рівні кадру. Ігри AAA часто явно встановлюють тайм-бокс кожного окремого відділу у відсотках кадрів, щоб один відділ не міг наступати на пальці інших відділів. Якщо метод анімації коливання дерев на основі швидкості та напрямку вітру повільний, менше дерев буде оброблено, а не витратити бюджет інших команд.
DampeS8N
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.