STL для ігор, так чи ні? [зачинено]


144

Кожна мова програмування має свою стандартну бібліотеку контейнерів, алгоритмів та інших корисних матеріалів. З такими мовами, як C #, Java та Python, користуватися мовою без її стандартної лібрики практично неможливо .

Тим не менш, у багатьох C ++ іграх, над якими я працював, ми або взагалі не використовували STL, використовували невелику частину цього, або використовували власну реалізацію. Важко сказати, чи було це надійним рішенням для наших ігор, чи це було просто зроблено з незнання STL.

Отже ... добре підходить STL чи ні?



1
Так, це я мав на увазі під «власною реалізацією». :)
чудовий

3
Якщо у вас є можливість знайти та придбати дорогоцінні камені Best of Game Programming, зробіть це. Є заголовок статті "Використання STL в ігровому програмуванні" Джеймса Бура, ArenaNet, де він робить справді хороший випадок використання STL.
chiguire

Власне використання Java без її стандартної вкладки цілком можливо, вона називається J2ME: p
Барт ван Хекелом

1
Чудове запитання!
Алан

Відповіді:


191

Ще коли я працював у професійному розвитку ігор, STL був занадто незрілим і роздутим. Але це було> 10 років тому.

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

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

Просто переконайтеся, що ви знаєте, як використовувати STL та використовувати його у своїй грі. Прочитайте кілька книг і подивіться код реалізації в STL, який ви використовуєте.


49
Це досить солідна порада. Мем "STL is slow" не був вірним принаймні п’ять років і, мабуть, набагато довше. Він продовжуватиме жити, подібно до дурниць "Java повільна" та ".NET повільна", поки всім не стане очевидним, що це вже не так. STL допомагає вам писати кращі програми; Я б пішов так далеко, щоб сказати, що не використовувати його, в більшості випадків (окрім 0,1% десь), є безвідповідальним. (. Претензії , які не відповідають заданій предметній області, часто більш обвинувального висновку у тому , як проблема вирішувалася, а не саме STL Fix ваш код, люди.)
Ed Ropple

5
@Ed Ropple: Я думаю, що проблема полягає не в тому, що STL не відповідає тій чи іншій проблемі, проблема полягає в тому, що вона вміщує занадто багато проблем, що робить код у ньому занадто складним. Страшно, як люди надмірно використовують STL, і я думаю, що це одна з причин, чому стільки (в тому числі і я) взагалі утримуються від його використання. Як і в одному прикладі, який я недавно бачив, коли питання полягало в тому, як отримати найбільше з 3-х чисел, одна з відповідей була штовханням їх у std :: vector, а потім std: сортування. Це, безумовно, змушує рішення, яке є непотрібним, надто простою проблемою.
Саймон

22
@Simon: при всій повазі останній приклад є ознакою крайньої незрозумілості і не має нічого спільного зі STL ... ця людина зробила б те ж саме в будь-якій іншій мові зі списками, які можна сортувати. Це його мислення порушено.
ggambett

@EdRopple спробуйте реалізувати STL-аналізатор для файлів зображень PPM (загалом менше 100 рядків коду, якщо лише націлені на P6 або P3). Половина отриманого коду призначена лише для пропускання рядків коментарів, оскільки STL не надає щось подібнеif(stream.nextCharacter() == '#') stream.skipLine();
GameDeveloper

@DarioOO Я не знаю цього формату файлів, але для цього потрібні адаптери потоку та фільтри. Я написав цей коментар п’ять років тому, розум (і він час від часу постійно повертається!), Але в наші дні я пишу про все, що не супер, супер перф-критично у функціональному, трансформованому стилі та таких проблемах, як той, який ти описуємо випадання проблеми. Мені не дуже важливо все, що стосується кількості рядків (і ІМО, і не слід), я дбаю про правильність виконання, то чіткість, то продуктивність, а потім такі речі, як довжина коду.
Ед Роппл

63

Я б сказав, що найкраще використовувати STL, якщо ви точно не знаєте , чому ви не хочете ним користуватися.

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

Скарги на те, що STL застосовує "вузький погляд на світ", вражають мене трохи дурним. Вони є контейнерами. Вони мають обмежений набір операцій, оскільки контейнери мають обмежений набір операцій. Що ти робиш, що не з цим?


4
Я не думаю, що ніхто не повинен виправдовувати, чому вони не повинні використовувати STL. Також не погоджуйтеся з цілим аргументом «використовуйте його, оскільки вони розумніші за вас». STL був розроблений на основі конкретного перегляду проблемної області, а не лише контейнерів, тобто алгоритмів, алокаторів, ітераторів, рис тощо. Це досить справедливо, але це не єдиний спосіб розгляду цієї проблемної області
zebrabox

2
Отже, ви хочете скористатися домашнім прокатом, ніж загальновипробуваний, сильно надійний код? Проблемна область не все відрізняється від проекту до проекту (окрім, можливо, вбудованих проектів. Навіть консолі мають пристойні реалізації STL в наші дні!). Незалежно від гри, ваша проблема просто не така вже й інша, і якщо ви робите щось, що маєте намір поставити, ви несете відповідальність за написання надійного коду. Чи призведе повторне вправлення колеса до кращої надійності та гнучкості? Я схиляюся до "ні". Те, що це не єдиний спосіб, не означає, що він не є загалом кращим.
Ед Роппл

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

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

4
"Це буде майже так швидко, як дозволяє платформа". Це остаточна неправда, тому що багато постачальників компіляторів не можуть потрудитися переписати STL, щоб це справді витіснило найбільшу продуктивність із конкретної архітектури. STL не має жодних гарантій щодо характеристик продуктивності, за винятком великих O. O, однак може бути настільки ж ефективним або неефективним, як постачальник компілятора хоче це зробити.
Кай

35

Я бачив дуже мало причин не використовувати STL для ігор.

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

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


Насправді використання великих типів не вказівників на карті є гарним випадком використання, оскільки stdlib карти мають вимогу не виключати ітераторів, що змушує реалізувати використання покажчиків та окремо виділених відображених елементів. Найкращим рішенням для ігор є використання google::sparse_mapабо написання власного.
v.oddou

чому б не щільна карта?
GameDeveloper

23

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

Індивідуальний варіант, такий як EA STL , спеціально розроблений для ігор і може отримати набагато кращі показники пам’яті та зручність використання консолі. Він став відкритим кодом у 2016 році відповідно до пункту BSD-3 зі сховищем на GitHub .


19
Проблеми з використанням пам'яті STL та ігор зазвичай можна вирішити за допомогою спеціальних класів розподілу. Дійсно, на моїй попередній роботі наш "спеціальний" векторний клас був лише тонкою обгорткою навколо, std::vectorщо переоцінила розподільник за замовчуванням.
Блер Холлоуей

1
@Blair Holloway: "Спеціальні алокатори на основі класів, а не на екземплярах. Розподільники повинні будувати та знищувати об'єкти, а також розподіляти їх. Це змушує змішати два окремих поняття: розподіл та побудову. Це лише деякі з на жаль, проблеми зі stl-алокаторами ". EA STL наводить ще кілька поважних причин, через які алокатори STD погані. Це не просто "мокріше чи ні, їх можна перекрити".
Саймон

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

@Simon - для уточнення: хоча STL може бути громіздким, він дуже добре перевірений і без помилок; якщо ви зможете ним скористатися, ви заощадите людино-години, потребуючи налагодження спеціального рішення. Моя теперішня робота відхиляється від STL на користь домашніх алокаторів, і мені довелося витратити час на налагодження та переробку деяких з цього коду, оскільки він не на тому ж рівні зрілості, як STL.
Блер Холлоуей

1
@Simon: Я трохи запізнююсь на вечірці тут, але мені цікаво, якщо ви дасте конкретний приклад того, що ви маєте на увазі під цим. Який хороший приклад вирішення конкретної проблеми таким чином, що STL є занадто загальним для ефективного вирішення?
BRaffle

21

Ось, що Майк Актон (директор двигуна на Іграх про безсоння Spyro Dragon, Ratchet & Clank і Resistance) повинен був сказати про це, коли його запитали тут . Зауважте, його запитали як про STL, так і для Boost в цілому, як це стосується використання в ігрових розробниках.

STL / Boost, чи належить він до gamedev? Якщо тільки його частини, то які?

Ви тут питаєте про дві різні речі, правда? STL та Boost, окремо. Але насправді моя відповідь одна і та сама: ні в одному немає нічого поганого , але я не перешкоджаю їх використанню. Використання будь-якого способу заохочує людей підходити до вирішення проблеми, а не знаходити рішення проблеми. Рішення завжди повинно відповідати наявним даним та обмеженням обладнання та ін. І STL, і Boost мають надзвичайно вузький погляд на "світ", і їх відповідне використання обмежене. Дійсно, я відволікаю їх, тому що вони ведуть програмістів відразу в неправильному напрямку, я часто кажу, якщо вам здається, що вам потрібен або один, напевно, ви не дуже розумієте проблему, яку ви "

Я також помітив, що більшість розробників про ігор більше прагнуть до C, ніж до C ++.


18
Я не погоджуюся з тим, що більше прагнуть до C. Переважна більшість розробників ігор, а також письменників SDK використовують C ++. Насправді останній основний користувач C був ідентичним, і навіть Carmack перейшов на C ++ зараз ...
Goz

82
Коментар містера Актона здається схематичним. Взагалі, STL добре підходить для цих проблем. Якщо ви намагаєтесь зробити щось таким чином, щоб підхід STL здався "неправильним", напевно, справді гарна ідея переоцінити свій підхід і побачити, чи справді ви це робите розумним шляхом. На мій досвід, найчастіше, ви, мабуть, не так. (ІМО набагато розумніше, вирішити проблему, чітко розуміючи її в контексті ваших інструментів, ніж викидати ваші інструменти просто для того, щоб переробити її з нуля.)
Ед Роппл,

50
Мій досвід використання STL був майже протилежним. Це ефективно та економно. Якщо ви відчуваєте необхідність скручувати власну бібліотеку шаблонів або бібліотеку контейнерів, це добре. Але не робіть вигляд, що STL (або підвищення з цього приводу) погано. Я широко використовував STL для комерційних ігор iPhone, Nintendo DS, Wii, ПК, Mac та Xbox. Кожного разу, коли мене змушували користуватися чужою "кращою" бібліотекою, я виявляв, що вона не вистачає і багата.
BRaffle

5
Він працює на DS так само добре, як і на будь-якій іншій платформі, на якій я його використовував. Я використовував STL по всьому коду інтерфейсу та AI. Гра була ds.ign.com/articles/832/832147p1.html . Я працював у невеликій студії, яка була частиною Amaze, яка входила до Фонду 9.
BRaffle

7
Майк - це все про дані. Перегляд даних пропонує найкращий метод перетворення даних. Застосовуйте його у великих масштабах і у вас є програмування. У цьому контексті його критика має багато сенсу. STL (і шаблони дизайну) пропонують, що замість того, щоб вивчати дані, щоб придумати рішення, ми вивчаємо рішення у нашій сумці хитрощів, щоб знайти той, який працює з даними. Я не хочу говорити за Майка, але я вважаю, що він би припустив, що такий спосіб наближення до проблеми є зворотним і може потенційно призвести до неефективних чи роздутих рішень.
Ден Олсон

19

Якщо ви виявите, що переписуєте щось, що вже існує в STL, з будь-якої причини зупиніться . Використовуйте STL.

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


7
map <> майже ніколи не використовується тим, що потрібно використовувати для пам’яті чи центрального процесора, які є ефективними в контексті гри. hash_map <> майже завжди є кращим вибором, хоча продуктивність hash_map сильно відрізняється від постачальника. Якщо ви будуєте гру, яка призначена для консолі або має масштабовану мережеву гру, STL може бути занадто повільною або роздутою для ваших цілей.
Бен Цайглер

3
unordered_map <> тепер широко доступний і має надзвичайно суворі вимоги до продуктивності в поточному проекті TR1. (До точки завищення я думаю, що він навіть забороняє відкривати хешування, і хоча це зазвичай повільніше, я не думаю, що це повинно бути прямо забороненим стандартом.)

5
STL пропонує алгоритми, а також контейнери. Ніколи немає причин не використовувати stl-версію алгоритму. Наприклад, std::sortзазвичай використовується введення під себе, підсвічуючи досить швидко і досить складно, що ви не хочете робити це самостійно.
deft_code

правда, це unordered_mapабо C ++ 11, або прискорення є надто повільними, ви хочете, це карта з хешем відкритої адреси, наприклад google :: sparse_map або ваша власна.
v.oddou

16

Чи добре підходить STL для ігор? Безумовно. Ігри - це складне програмне забезпечення, STL надає функції, що допомагають керувати складністю, тому це добре.

Чи це добре підходить для вашої платформи? Не обов'язково. Якщо ви пишете для консолі, то вам слід бути дуже уважним щодо використання пам'яті та кешу. STL не робить це дуже просто.

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


10

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

Я використовував STL у кожному проекті з середини 90-х до сьогодні, за винятком короткого часу в EA. Я думаю, що сторона анти STL мала певні раціональні причини не використовувати її. Таких значною мірою немає. Спеціальні розподільники - це одне рішення, використання резерву - інше, і не передавати речі за значенням - це третя частина, але вони досить прості і будь-який програміст повинен це знати. Що важливіше, але це використання алгоритмів. Автори-компілятори точно знають, що робить for_each (), і можуть оптимізувати код. Це не може статися з домашньою рулонною петлею. for_each () на об'єкт const ще краще. Microsoft оптимізує for_each багатьма способами, включаючи серіалізацію. У них також є бібліотека AMP, у якій паралельний_фор_ех (). Якщо у вас є можливість, поговоріть з цим інженерів-компіляторів. Компілятори консолей оптимізують те, що звикає, так що sa трохи проблеми з куркою та яйцями. Microsoft стає дуже важким із C ++ 11, і наступний XBox не буде відрізнятися. Я не маю уявлення про PS4, ми ще цього не отримали.

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

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

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

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


цікаві ідеї; що ви маєте на увазі під « використовувати клас на основі класу new and delete »? Тобто, пришвидшити процес, використовуючи об’єкти, які вже є в купі?
johnbakers

9

Це гаряча тема в розробці ігор. Я особисто не рекомендую його, за винятком, можливо, EASTL, як згадувалося вище. У мене є дві основні проблеми зі STL (технічно "Стандартна бібліотека C ++", оскільки STL більше не називається) в іграх. 1) Динамічне розподіл пам'яті часто витрачає багато часу виконання в іграх, коли використовується STL. 2) Використання STL заохочує масив структур підходити до архітектури ігор, тоді як підхід до структури масивів набагато зручніший для кешу.


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

Я ціную вашу думку, що важливо добре зрозуміти проблему, яку ви вирішуєте. Але з повагою я все ж думаю, що я не згоден з вашим висновком. У кожній проблемі є шаблони використання, які не можуть бути виражені у користувальницьких розподільниках STL, але їх можна легко використовувати в користувальницькому контейнері, такому як розподільник фіксованого блоку, реалізований за допомогою плоского масиву. І застосування фіксованої трансформації над масивом однорідних типів, швидше за все, призведе до набагато кращої когерентності кешу, ніж ітерація над вектором поліморфних типів та виклик віртуальних методів.
Терранс Коен

5

Це залежить. Наскільки великий проект, яка платформа (и) та яка хронологія?

Якщо ви працюєте над великим проектом, на платформах з обмеженими ресурсами, зі значним терміном і бюджетом, тоді ви можете заощадити собі багато клопоту, уникаючи неминучого пекла, який буде дивитись на півмільйонну базу лінійного коду, що Завалений STL, не може підтримувати частоту кадрів вище 30, з'їдає достатню кількість оперативної пам’яті, щоб вмістити ще декілька активів, а на збирання потрібно 2 години.

В інших ситуаціях, але STL і навіть Boost можуть бути дуже корисними при належному застосуванні. Я працював над заголовками, які використовували підбірку STL / Boost, і були абсолютною мрією для кодування: менше помилок / протікань і простота у підтримці коду означає більше часу кодування веселих нових функцій! Особливо для хобі-проектів - це величезна виграш у відділі мотивації.

Знайте, коли торгувати продуктивністю для зручності!


1
"Знати, коли торгувати ефективністю для зручності". Так. Це одне речення настільки ж хороша відповідь, як і будь-яке. З'ясуйте, що вам потрібно досягти зі своєю грою, проконсультуйтеся з однолітками та вирішіть, чи допоможе STL вам дістатися чи заважатиме вам. Я б сказав, якщо ви не хочете встановити планку для графіки та продуктивності нового покоління під час своєї гри, STL, ймовірно, вам допоможе.
gkimsey

4

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

Навіщо турбуватися заново винаходити колесо, коли ви можете працювати над чимось іншим, як ІІ гра, досвід користувача чи ще краще; тестування та налагодження?


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

2
Але якщо ви не хочете динамічного розподілу пам'яті, вам не слід використовувати STL. Це свого роду суть. Ваш власний код буде не кращим, і, безумовно, може бути зовсім гіршим. Дизайнерське рішення зловжити STL є проблемою тут, що не СТЛ, його можливості, або його Perf характеристики. Ви атакуєте неправильну частину проблеми.
Ед Роппл

4

STL абсолютно чудовий для використання в іграх, якщо ви добре це розумієте. Наш двигун досить широко використовує його, і це ніколи не було проблемою. У мене немає досвіду розробки консолей, що може бути зовсім іншою історією, але вона добре підтримується на всіх платформах ПК (Windows / Mac / Linux).

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


4

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

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


4

Мої 2 копійки на це те, що STL працює чудово. Я розробляв 3D-ігровий двигун (не якості AAA, але достатньо просунутого типу сценаріїв, відкладеного візуалізації, інтегрованої фізики Bullet) для ПК, і я ще не бачив, щоб контейнери стали основним вузьким місцем. Неправильне використання 3D-API та неякісні алгоритми були найкращими цілями (визначаються шляхом профілювання!) Кожного разу, коли я заходив і намагався досягти трохи більшої продуктивності.


3

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


3

Гарне питання! Більш конкретний питання - які загальні вимоги до гри, які не можуть бути задоволені STL та Boost.

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

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

Однак для розробки лише для ПК я думаю, що STL та Boost дуже хороші. Хоча загальноприйняті рішення не завжди ідеальні, вони часто досить хороші. Ваше перше рішення проблеми майже ніколи не є ідеальним, і ви вдосконалюєте або замінюєте недоліки, поки вона не стане достатньою.


2

STL добре підходить для вашої гри, якщо STL добре підходить для вашої гри.

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

Люди не повинні уникати використання STL у своїх іграх, оскільки інші люди уникають використання STL в іграх; вони повинні уникати його використання, якщо вони зважили всі свої варіанти і справді вірять, що інша реалізація поліпшить якість їх продукту.


2
Я погоджуюсь на 100% з останньою частиною вашого коментаря, але я б пішов ще далі: якщо ви можете остаточно продемонструвати, чому STL не є хорошим варіантом, не використовуйте STL. Інакше зробіть. Культ вантажу (все від "о, розробники ігор використовують C ++!" До "о, розробники ігор не використовують STL!") Є нездоровим. Я б, однак, задумався з вашим другим абзацом: навряд чи люди, які все ще досить наївні, щоб думати про повторне втілення STL, - це гарна ідея, що побудує краще, vectorніж люди з STL. На той час, коли ви зможете це зробити, ви вже не вважаєте, що потрібно! :-)
Ед Роппл,

2

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

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

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


2

Я думаю, що цю дискусію можна узагальнити так:

посередньо написаний специфічний код програми <добре написаний код загального призначення <добре написаний специфічний код програми

Будь-хто, чиє домашнє рішення потрапило б до категорії 3, напевно знає відповідь на початкове запитання щодо своєї конкретної проблеми. STL потрапляє в категорію 2. Таким чином , для тих , хто потребує , щоб задати питання, «повинен я використовувати STL», відповідь, ймовірно , так.


2

STL все в порядку для використання на ПК, оскільки його вдосконалена система віртуальної пам’яті робить необхідність ретельного розподілу пам'яті трохи менш важливою (хоча все-таки потрібно бути дуже обережною). На консолі, з обмеженими можливостями віртуальної пам’яті або відсутністю надмірних кеш-витрат, ви, ймовірно, краще писати власні структури даних, які мають передбачувані та / або обмежені паттові помилки на розподіл пам'яті. (І ви, звичайно, не помилитесь, зробивши те ж саме і на проекті для ігор на ПК.)


1

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

Найкраще в програмному забезпеченні, на відміну від більшості інших дисциплін, полягає в тому, що ви завжди зможете змінити речі згодом, якщо виявите, що це не працює так, як вам хотілося б. Пізніше ви дізнаєтесь, що STL не працює для вас у цьому проекті? Зірвіть його, поставте щось інше на своє місце. Вам не подобається, як ви розділили обов'язки між своїми об'єктами? Рефактор. Вам не подобається, що ви використовували предмети? Замініть їх прямими методами С. Вам не подобається, що все, що зберігається в структурах, та методи маніпулювання ними? Замініть їх об’єктами C ++.


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

1

Я кажу, що це STL. Моя причина досить проста:

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

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

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


1
Я згоден щодо часу компіляції. Будь-який значний час складання подвоює кількість втраченої роботи; наприклад, якщо компіляція триватиме 5 хвилин, ви витрачаєте 10 хвилин на каву щоразу. ;)
Ipsquiggle

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