Мікрооптимізація - BAD vs Game Development


12

У розробці ігор багато C / C ++, у бізнес-додатках C #. Я бачив, що C / C ++ розробники висловлюють занепокоєння з приводу того, як один рядок коду переводиться на збірку. У .NET деякі потрапляють в IL, рідко.

У C # "мікрооптимізація" нахмурена, рідкісна і, як правило, марна трата часу. Схоже, це не так у розробці ігор.

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

Я не шукаю дискусій щодо доцільності C # як ігрового розробника. Я знаю, що це було зроблено певною мірою. Зосередьтеся на мікрооптимізації. Зокрема, різниця між Game Dev vs Applications dev.

ОНОВЛЕННЯ
Під грою Я маю на увазі сучасний, великий масштабний розвиток. EG MMORPG, Xbox, PS3, Wii ...


3
Я працював як розробник ігор та розробник додатків, і відмінності суперечать. Мікрооптимізація без профілювання спонукає в обох. Багато ігор не мають дуже потужних вимог і не потребують оптимізації. Деякі бізнес-додатки вимагають набагато більш жорсткі вимоги (наприклад, гарантії тривалого часу та реального часу), ніж середня гра в 60 Гц.
Дейв Хілліє

1
Одним із додаткових факторів є те, що у бізнес-програмах зазвичай можна вибирати обладнання (в межах причини). Якщо мені потрібна більша потужність обробки, я можу просто придбати інший сервер або заплатити більше часу на AWS. В іграх, що вимагають найновішого обладнання, перетворюється гра в розмірі 60 доларів на 16060 гри та відеокарти. Якщо ви розробляєте консолі, оновлення апаратного забезпечення може означати затримку на роки очікування наступного покоління. Коли ви не можете отримати краще обладнання, вам доведеться краще використовувати його.
Андрій

Відповіді:


17

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

  1. чекаючи результатів запиту до бази даних
  2. чекаючи завершення веб-запиту
  3. чекаючи, коли користувач зробить дію інтерфейсу користувача

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

Основний розгляд:

  1. Час на ринок
  2. Простота, чи може хтось інший зрозуміти і підтримувати код

6
Я зазначу, що код, який оптимізує запити до бази даних, може значно покращити зручність використання бізнес-додатків.
HLGEM

4
+1. Оптимізація баз даних та мереж зазвичай дасть більше зусиль для долара в бізнес-застосуванні. Наприклад, вибір JSON vs XML та налаштування індексів БД
Shamit Verma

2
+1, але вам слід додати іншу сторону рівняння: «основна петля» та рендерінг в іграх, на яких покладається плинність гри, робить кожна мікросекунда втраченою цінністю, оскільки якість відчутна для ока та інших органів чуття.
Клаїм

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

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

13

У бізнес-програмах дуже рідкісні значення мають мікросекунди. В іграх - це факт життя.

Якщо ви хочете, щоб гра працювала зі швидкістю 60 кадрів в секунду, у вас є ~ 16,67 мілісекунд, щоб зробити все, що потрібно зробити для цього кадру - введення, фізика, логіка гри, аудіо, мережа, AI, візуалізація тощо; якщо пощастить, ви будете працювати на 30 кадрів в секунду і мати розкішні 33,3 мілісекунди. Якщо кадр триватиме занадто довго, ваші відгуки будуть страждати, ваші гравці заповнять інтернет-форуми жовчю, і ви не будете продавати стільки, скільки можливо (не кажучи вже про удар на вашу професійну гордість), і якщо вам справді не пощастить знайде вашу команду, що кодує бізнес-програми для життя.

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

Не очікуйте, що будь-яка мова високого рівня виштовхне C ++ у двері, поки одна не запропонує порівнянну та передбачувану продуктивність.


8
У високочастотних торгових програмах мікросекунди мають велике значення!
Quant_dev

2
@quant: Як і в більшості потокових програм - робототехніки, електромереж, ракетних виробів, медичних технологій і т. д. Створіть занадто великі відставання, і це може бути пізно до того, як ви наздоженете.
Aaronaught

@quant_dev: Високочастотні торгові додатки є дуже рідкісними.
molbdnilo

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

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

9

Гаразд, значить, ви бачили розробників C і C ++, які нав'язливі за окремими лініями. Б'юсь у заклад, що вони не одержимі кожним рядком.

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

Це не тому, що мови змушують людей до цього, це те, що люди вибирають мови, виходячи з того, що хочуть робити. Якщо ви хочете вивести з програми останній шматочок продуктивності, ви не запишете C # і компілюєте в CLR і сподіваєтеся, що компілятор JIT (чи що завгодно) зробить хорошу роботу, ви запишете його в те, де ви можете значною мірою контролювати вихід. Ви будете використовувати C або C ++ (і, ймовірно, обмежений підмножина C ++) та вивчите результати виводу мови збірки та результати профілера.

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


7

Чи постійно ігри грають межі обладнання?

Так, вони роблять.

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

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

Звичайно, є якийсь рух. Коли я був хлопцем і вперше зацікавився розвитком ігор, це було написано власноруч, або вийти з біса. Це була ера Commodore 64. Сьогодні, звичайно, C ++ - це лінгва-франка більшості ігрових розробок. І справді, ми навіть бачили рух до використання C ++ для коду двигуна та мови виводу сценарію вищого рівня для логічного коду гри. наприклад, LUA або движок Unreal має власну мову UnrealScript.


1
+1 хороша порція ігор для розробників ігор сьогодні використовує гіпер-оптимізований шар двигуна, написаний кимось іншим, а потім використовуйте щось на зразок Python або менш прискіпливий C ++, щоб обернути речі разом.
Морган Херлокер

Зазначимо, що Unreal перемістив сценарій «назад», з UnrealScript до C ++. Чудова річ про сучасний C ++, що він дозволяє писати як мікрооптимізований код з низькою затримкою, так і стисну логіку високого рівня. Більшість інших мов досягають високого рівня лише жертвуючи затримкою, а часто і продуктивністю.
ліворуч близько

7

У C # "мікрооптимізація" нахмурена, рідкісна і, як правило, марна трата часу. Схоже, це не так у розробці ігор.

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


0

"Гра" - досить обширний термін. Якби у вас, скажімо, був MMORPG, менші оптимізації впливали б на багатьох гравців.

Геймери і, мабуть, завжди були звикли до порівняно великої кількості речей, що відбуваються одночасно, в реальному часі. Впевнений; свого часу, мета чуйного Пакмана чи Тетріса була метою. Але вони все-таки повинні були бути чуйними. Щодня, 3DMMORPG через мережеві з'єднання, що відпадають.

Я впевнено розумію, що хочу оптимізувати.


0

Ігри постійно проводять величезну кількість фонової обробки. Бізнес-програми ні.


4
Не робиш багато ділових додатків, чи не так?
ДАЙТЕ МОЕ правильне ДУМКА

2
Досить знати, що бізнес-додаткам не потрібно оновлювати свій статус 60 разів на секунду. Крім того, я спеціально сказав "постійно".
user16764

2
Ви коли-небудь чули про торги в режимі реального часу?
ДАЙТЕ МОЕ правильне ДУМКА

0

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

Я більше не працюю в gamedev, але працюю у VFX у таких областях, як трасування траєкторій, і я бачив багато реалізацій дерев BVH та KD, які обробляють ~ 0,5 мільйона променів в секунду на складній сцені (і це з багатопотокова оцінка). Грубо кажучи, я схильний бачити прямолінійну реалізацію БВХ у проміжному контексті зі швидкістю 1 мільйон променів / с навіть при багатопотоковій оцінці. За винятком того, що Embree має BVH, який може обробляти понад 100 мільйонів променів на одній сцені одним і тим же обладнанням.

Це повністю завдяки "мікрооптимізаціям", що Embree в 200 разів швидший (той самий алгоритм і структура даних), але, звичайно, причина це набагато швидше, тому що розробники в Intel за ним - це професіонали, які спираються на свої профілі та вимірювання. дійсно налаштував важливі області. Вони не змінювали код вольово-невольно з угідь та вносили зміни, які зробили поліпшення 0,000000001% за рахунок значного погіршення ремонту. Це були дуже точні оптимізації, застосовані в розумних руках - вони могли бути мікроскопічними з точки зору фокусу, але макроскопічними з точки зору ефекту.

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

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

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

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

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

Цікаво, що в ці дні, коли я працюю в справжніх критичних для продуктивності сферах, мені доводиться дещо думати більш низький рівень, ніж я почав (хоча я почав в епоху Borland Turbo C DOS). Бо тоді кеш процесора майже не існував. В основному це була лише DRAM та регістри, що означало, що я можу більше зосередитися на алгоритмічній складності та дуже просто записувати пов'язані структури, як дерева, не заважаючи на ефективність. У наші дні низькорівневі деталі кешу процесора домінують над моїм мисленням майже настільки ж, як і сам алгоритм. І так само у нас є багатоядерні машини, які повинні змусити нас думати про багатопотоковість та атоміку, мютекси та безпеку ниток та одночасні структури даних тощо, що, я б сказав, є багато в чому більш низьким рівнем уваги (як в, не так по-людськи інтуїтивно зрозумілий), ніж коли я починав.

Як не дивно, це здається мені зараз дуже правдивим. Я думаю, що сьогодні я більше впливаю на основні та низькі рівні складності та деталі обладнання, ніж 30 років тому, намагаючись зняти окуляри з ностальгією. Звичайно, ми, можливо, тут трохи поговорили про збори, і нам довелося розібратися з деякими гострими деталями, такими як XMS / EMS. Але здебільшого я б сказав, що було менше складності та обізнаності із обладнанням та компілятором, яких я потребував тоді, ніж сьогодні, коли я працюю в критичних для продуктивності сферах. І це майже здається справжнім для всієї галузі, якщо ми відкладемо, як писатиif/else висловлювання, дещо легше зрозумілі для людини, і врахуйте, наскільки люди взагалі в цей час більше замислюються про деталі апаратного забезпечення нижчого рівня (від декількох ядер від графічних процесорів до SIMD до кешу процесора та внутрішні деталі того, як їх компілятори / інтерпретатори / бібліотеки працюють тощо).

Високий рівень! = Менш ефективний

Повертаємось до цього питання:

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

Для мене мова не йде про обладнання. Йдеться про оптимізатори та інструменти. Коли я починав, люди практично писали всі консольні ігри в зборах, і була справжня перевага в продуктивності, особливо, враховуючи відсутність якісних компіляторів, що генерують 6502.

Оскільки оптимізатори компіляторів C стали розумнішими у своїх оптимізаціях, тоді вони почали досягати точки, коли коди вищого рівня, написані на C, конкурували, а іноді навіть перевершували код, написаний найкращими спеціалістами з монтажу в багатьох областях (хоча і не завжди), і це зробило це так, що тоді не було розумним прийняттям C принаймні основної частини кодування для гри. І подібний зсув поступово стався в якийсь момент із C ++. Прийняття C ++ проходило повільніше, оскільки я думаю, що підвищення продуктивності переходу від збирання до C, можливо, може досягти одностайної згоди від gamedevs, що пишуть нетривіальні ігри повністю в ASM, на відміну від переходу від C до C ++.

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

Якщо ви можете уявити собі гіпотетичний сценарій, коли ми могли б написати код у коді найвищого рівня, який можна уявити, не турбуючись про багатопотоковість чи графічні процесори чи пропуски кешу чи щось подібне (можливо, навіть не конкретні структури даних), а оптимізатор був як штучний інтелект розумний і міг би розібратися у найефективніших компоновках пам’яті, переставляючи та ущільнюючи наші дані, з’ясуйте, що він може використовувати тут і там якийсь графічний процесор, паралелізувати якийсь код тут і там, використовувати якийсь SIMD, можливо, сам профіль і продовжувати оптимізувати його ІК як нас, люди реагуючи на гарячі точки профілера, і це робилося таким чином, що перемагає найкращих експертів у світі, тоді було б непродумано навіть тих, хто працює у найважливіших сферах продуктивності, щоб прийняти це ... і це прогрес походить від смішно розумних оптимізаторів, а не швидшого обладнання.


0

У C # "мікрооптимізація" нахмурена, рідкісна і, як правило, марна трата часу. Схоже, це не так у розробці ігор.

У вас тут є проблема термінології. Ви правильно вживаєте слова, але розробники ігор та бізнесмени використовують один і той же термін двома дуже різними способами.

Для бізнесу "мікрооптимізація" означає прискорити дуже маленький крок у загальному бізнес-процесі, реалізованому програмним забезпеченням. Причина, на яку він спохмурнів, зазвичай є однією з:

  1. Додаткові гроші, витрачені на доставку тієї ж ділової вартості, на кілька секунд швидшою швидкістю. Гроші, заощаджені на покращенні швидкості, надходять з іншого грошового масиву (час користувача), тому бізнес зазвичай не отримує користі від витрачених зусиль, які клієнт робить за рахунок бізнесу.
  2. Зазвичай бізнес-програмісти мають погану видимість у загальному бізнес-процесі, тому оптимізація одного кроку може не принести хороших переваг загальному процесу. Наприклад, якщо ви зробите 3% процесу в 10 разів швидше, ви витратили весь процес на 2,7%.
  3. Зазвичай бізнес має великий перелік решти робіт, які мають деяку цінність для бізнесу, і він повинен надавати пріоритет, додаючи цю вартість замість того, щоб доставляти одне і те ж значення за (ймовірно) менший час.

Розвиток гри - це інший звір. "мікрооптимізація" - це економія невеликої кількості часу у функції чи розпорядку.

  1. Ігрові системи, як правило, утримуються до циклу візуалізації. В даний час золотим стандартом є 60 кадрів в секунду, тому все, що буде обчислено, потрібно зробити і винести на екран за 1/60-ту секунду.
  2. Це означає, що часто одні і ті ж процедури під час гри називаються тисячами-сотнями тисяч разів. Таким чином, 10-кратне поліпшення однієї функції збільшується на кількість, скільки відчують переваги покращення.
  3. Недосягнення швидкості візуалізації впливає на презентацію гри. Відео стане похмурим, герої оживлятимуть зі стрибками та стрибками замість руху рідини. Це негайно виводить гравця із занурення гри та перебуває у царині сумніву щодо вартості гри.

Тож у бізнесі нікого не хвилює, чи форма чотиритактного бізнес-процесу представлена ​​за 0,6 секунди або 0,5 секунди. Під час ігор, хтось хвилює, якщо рутина, яка займає 200 мс, може бути скорочена до виконання на 100 мс.

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


-1

Це пов'язано з тим, чому саме цей інструмент був обраний для певної роботи.

Гольфісти будуть нав'язливі над напрямком і силою, яку вони застосовують за допомогою путтера, не стільки, коли вони користуються водієм.

Чому? Тому що вони різні види пострілів. На приводі ви хочете отримати його в фарватері з максимальною відстані. Для путту ви хочете потрапити саме в отвір.

Те саме стосується і тут. Розробники ігор вибирають C ++, оскільки це дає їм контроль за виконанням різних операцій. Якщо ви вибрали це, вам захочеться скористатися цим.


-3

Більшість бізнес-заявок написані як внутрішні інструменти. Очікування щодо зручності використання цих інструментів значно нижчі, ніж у випадку програмного забезпечення, що продається масовим клієнтам. Досить поширеним є те, що власний бізнес-додаток має меню та діалоги, які повільно реагують на клацання миші, вікна, які перемальовуються із затримкою, або навіть графічний інтерфейс, написаний на Swing (жах!). Це пов’язано з низкою причин (важливіше, що програмне забезпечення налаштовується, ніж те, що воно дуже "спритне"; користувачі програмного забезпечення не мають вибору використовувати або не використовувати це програмне забезпечення, люди, які роблять рішення про встановлення програмного забезпечення не використовуйте самі ...). Наслідком всього цього є те, що розробники цього інструменту не витрачають багато часу на оптимізацію чуйності програми, але дуже дбають про розширюваність та кількість функцій. Різна база клієнтів => різні цілі дизайну => інша методологія.

Зауважте, що бізнес-додаток, орієнтований на масову аудиторію, наприклад, Excel, сильно оптимізований.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.