З якими підводними каменями ви стикалися, коли писали ігри для ПК з керованою мовою на зразок C # і як ви їх вирішували?
З якими підводними каменями ви стикалися, коли писали ігри для ПК з керованою мовою на зразок C # і як ви їх вирішували?
Відповіді:
Я не знаю багато про Java, тому це з точки зору .net dev.
Найбільший на сьогоднішній день - сміття. збирач сміття .net на вікнах робить фантастичну роботу, і ви можете піти, не зважаючи на немовля. У xbox / winPhone7 це вже інша справа. Якщо ви отримуєте кіоски на кожні кілька кадрів, збирання сміття може викликати у вас проблеми. На даний момент він спрацьовує після кожного виділення 1mb.
Ось кілька порад щодо поводження зі сміттям. Не варто турбуватися про більшість із них насправді, але вони можуть стати в нагоді одного дня.
GC.GetTotalMemory()
на екрані. Це дає приблизну кількість виділених байтів, які використовує ваша гра. Якщо він ледве рухається, у тебе все гаразд. Якщо це швидко йде, у вас є проблеми.GC.Collect()
кожен кадр. Це може здатися гарною ідеєю, зберігаючи на своєму смітті і все таке, але пам’ятайте, що тільки з гіршим, ніж збирання сміття, - це над вивезенням сміття.StringBuilder
(будьте обережні, StringBuilder
це не чарівна паличка, і все ще можуть привести до розподілу! . Це означає , що прості операції , як додавання номера в кінець рядка може створювати дивовижні кількості сміття) або використання foreach
циклів над колекціями, які використовують IEnumerable
інтерфейс, також може створювати сміття, не знаючи (наприклад, foreach (EffectPass pass in effect.CurrentTechnique.Passes)
це звичайна)IDisposable
на класах, які містять некеровані ресурси. Ви можете використовувати їх для очищення пам'яті, GC не може звільнитися.Інша річ, про яку слід подумати - це продукти з плаваючою комою. Хоча .Net JITer робить досить багато оптимізацій, пов'язаних з процесором, він не може використовувати SSE або будь-який інший набір інструкцій SIMD для прискорення математики з плаваючою комою. Це може спричинити досить велику різницю швидкості між C ++ та C # для ігор. Якщо ви використовуєте моно, у них є спеціальні бібліотеки математики SIMD, якими ви можете скористатися.
Типовий підводний показник продуктивності не враховує сміттєзбірника при розробці / розробці гри. Виробництво занадто багато сміття може призвести до "гикавки" в грі, які трапляються, коли GC працює протягом значного тривалого часу.
Для C # використання об'єктів цінності та оператор "using" можуть зменшити тиск з боку GC.
using
Твердження не має нічого спільного зі збором сміття! Це для IDisposable
об'єктів - для вивільнення некерованих ресурсів (тобто тих, якими сміттєзбірник не займається ).
Я б сказав, що найбільшими проблемами, з якими я стикався при написанні ігор в C #, була відсутність гідних бібліотек. Більшість, що я знайшов, це або прямі порти, але неповні, або обгортки над бібліотекою C ++, які несуть сувору штрафну ефективність за марширування. (Я говорю спеціально про MOgre та Axiom для бібліотеки OGRE та BulletSharp для бібліотеки фізики Bullet)
Керовані мови (на відміну від Інтерпретованих - ні Java, ні C # насправді вже не тлумачаться) можуть бути настільки ж швидкими, як рідні мови, якщо ви добре розумієте, що насправді робить їх повільними (марширування, збирання сміття). Я думаю, що справжня проблема полягає в тому, що розробники бібліотек цього ще не зрозуміли.
Як говорили інші, паузи в колекції GC є найбільшою проблемою. Використання об'єктних пулів - одне типове рішення.
C # та Java не інтерпретуються. Вони компілюються в проміжний байт-код, який після JIT стає так само швидким, як і власний код (або достатньо близький, щоб бути незначним)
Найбільша проблема, яку я знайшов, - це звільнення ресурсів, які безпосередньо впливають на досвід користувачів. Ці мови автоматично не підтримують детерміновану доопрацювання, як це робить C ++, що, якщо ви не очікуєте, це може призвести до таких речей, як сітки, що плавають навколо сцени після того, як ви думали, що вони були знищені. (C # завершує детерміновану фіналізацію через IDisposable , я не впевнений, що робить Java.)
Крім цього, керовані мови справді набагато більше здатні обробляти таку ефективність, яку вимагають ігри, ніж їм належать заслуги. Добре написаний керований код набагато швидший, ніж погано написаний нативний код.
IDisposable
дозволяє детерміновано очищати критичні та некеровані часом ресурси, але не впливає безпосередньо на доопрацювання та збирання сміття.
Ні Java, ні C # не інтерпретуються. Вони обидва складаються в рідний машинний код.
Найбільшою проблемою як для них, так і для ігор є те, що кодувати так, щоб вони ніколи не збирали сміття під час гри. Кількість обручів, через які ви повинні проскочити, щоб досягти майже що переваги переваг їх використання. Більшість функцій, завдяки яким ці мови цікаво використовувати для програмування програм або серверів, слід уникати для програмування ігор, інакше ви отримаєте довгі паузи під час гри, коли вони вимикаються і збирати сміття.
Одне велике підводне каміння, яке я бачу в створенні таких ігор з такими мовами (або використанням таких інструментів, як XNA, двигун TorqueX тощо), - це те, що вам буде важко знайти команду хороших людей з досвідом, необхідним для створення гри, еквівалентної тому, що було б досить легко знайти людей для C ++ та OpenGL / DirectX.
Індустрія ігор для розробників все ще дуже сильно пронизана C ++, оскільки більшість інструментів та трубопроводів, які використовуються для виштовхування великих або просто відшліфованих маленьких ігор, були написані на C ++, і наскільки я знаю ВСІ офіційні комплекти розробників ви можете отримати для XBox, PS3 та Wii випускається лише сумісність для C ++ (набором інструментів XBox в даний час може бути більше керовано, хтось більше знає?)
Якщо ви хочете зараз розробити ігри для консолей, ви майже отримаєте XNA та C # на XBox, а потім лише в бічній частині бібліотеки ігор під назвою XBox Live Indie Games. Деякі, хто виграє конкурси тощо, вибираються, щоб перенести свою гру на реальну аркаду XBox Live. За винятком цього плану створення гри для ПК.