Чому C / C ++ є кращим для розробників ігор?


14

Деякі люди кажуть, що він пропонує більше контролю для розробників, але що саме можна керувати через C ++, який неможливо керувати, використовуючи, наприклад, Java?

Відповіді:


21

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

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

Для ігор це може бути згубно. Кожні кілька кадрів якийсь збирач сміття приходить разом, щоб перевірити кожне виділене вами виділення, щоб побачити, чи воно все ще використовується? Говоріть про уповільнення!

По-друге, більшість бібліотек, якими ми користуємося, були або написані на C, або написані на C ++. Я говорю про Scaleform, фізику двигуна Havok, PhysX, SpeedTree тощо. Усі професійні пакети, що широко використовуються в галузі. Якщо інша мова хоче бути королем, то краще їх підтримайте.

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

Я не кажу: не використовуйте Java. Я кажу: подумайте, чому ви використовуєте Java. Minecraft був побудований на Яві, тому, безумовно, можна будувати ігри на Яві. Але чи це була б краща гра, якби вона була побудована на C ++? Ну, це, звичайно, не було б таким дешевим, щоб запустити його на велику трійку (Windows, MacOS, Linux), але навіть так, у його розробці виникло багато помилок, пов’язаних з платформою, помилок, які Java не змогла згладити над.

Зараз для початківців-програмістів існує безліч фреймів С ++. Дійсно немає приводу не вчитися цьому, особливо якщо ви хочете продовжити свою кар’єру в галузі.


1
Просто нитрик, але в більшості операційних середовищ власний код працює у віртуальній машині. Java працює у віртуальній машині всередині віртуальної машини.
Skyler Saleh

1
@RTS: Це трохи розтягнення, щоб викликати op -> micro-op перекладати віртуальну машину, якщо це те, до чого ти потрапляєш.

Ні, я говорив про віртуальну машину, яку всі програми вводять сучасними операційними системами, щоб забезпечити безпечну багатозадачність. Це відбувається в ОС, яка працює в архітектурах без мікрооперацій (RISC). Сюди входять віртуальна пам’ять, переривання програмного забезпечення, системи для паралельного доступу до обладнання, планувальник операційних систем та обробка файлу реєстру.
Skyler Saleh

@RTS Я не впевнений, що ізоляція завдань справді кваліфікується як VM. Це RM (реальна машина) з вбудованим захистом. Немає явного шару абстрагування інструкцій між fetch / exec. Компілятори та лінкери генерують пересувний код як вимогу. Більшість із цього процесора забезпечує апаратну підтримку - це видаляє "віртуальний" аспект.
3Dave

2

Коротка відповідь: C ++ компілюється в нативний код, тому продуктивність залежить від розробника, а не в режимі виконання або VM.

Довга відповідь:

Будучи "швидшим" ​​C ++ не має нічого спільного з C ++. Наразі це одна з небагатьох доступних мов, яка підтримується інструментами, які створюють окремий, власний код для декількох платформ.

З того часу ви можете використовувати C, C ++, BASIC / 2, Delphi тощо, і отримувати ефективні, самостійно виконані файли. Вибір мови був питанням особистих уподобань та ринкових сил.

У наші дні припущення про те, що "C ++ швидше" - це, по суті, пророцтво, що самореалізується, хоча LLVM в змозі змінити це, оскільки воно робить все, що потрапляє в розбір спорів, як це було раніше.

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

Java побудована таким чином, що без JVM було б важко реалізувати. Як не дивно, C #, звичайно і неправильно, вважається приблизно еквівалентним Java, вже компілюється в нативний код на декількох платформах, включаючи iOS.

Верх мого списку Різдва? Машина часу, щоб повернутися назад і додати властивості, реальні обробки винятків та фактичний РОБОЧИЙ поліморфізм на C ++ та позбутися від синтаксичного лайна стрілки f "d up, який аналізатор може розібратися самостійно. Я написав препроцесора за це 10 років тому, бо це дурно.


Ви маєте на увазі непрямий доступ члена (як у h-> x)? Видалення, що зробить ручку та інтелектуальний тип покажчиків способом менш корисним. Якщо ви сперечаєтесь змінити його лише для необмежених покажчиків, ви просто зробили мову менш послідовною.
Ларс Віклунд

1
Що не працює в поліморфізмі С ++?
Кейсі

@LarsViklund так, саме це я маю на увазі. Але, хоча оператори адреси, дереференції та учасників (&, *, ::, -> ...) мають різні значення, більшу частину часу можливо зробити висновок drsjted з контексту. Все можна було спростити наперед, як це робиться в інших мовах. Незначна точка дотримування, але така, яка має потенціал для збільшення складності коду (і, таким чином, часу і витрат)
3Dave
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.