Pull to refresh

Comments 24

Думаю, небольшая ошибка перевода, в оригинале говорится о том, что у них большой опыт модификации IL.

От C# в подходе DOTS остаётся только название. Да, он всё ещё компилируется так же быстро как нормальный С# (что почти сразу нивелируется во время билда: IL2CPP, который сначала конвертит IL код в с++ и делает это очень долго, а потом компилируется уже с++ тоже не быстро), но удобство написания кода страдает невероятно, писать на таком C# муторнее (не сложнее, просто ужасное количество бойлерплейта) чем на С++, я думаю на С++ или вообще С они добились бы такой же производительности при большем удобстве кодирования.

Тем не менее это всё тот же C#, где работают те же IDE, рефакторинги.


просто ужасное количество бойлерплейта) чем на С++

У вас есть пример такого бойлерплейта?

А в С++ IDE этого нет? Черт, ощущение что их отдел маркетинга просто сказал «ребята, если мы скажем что юнити теперь кодируется на С++, наши пользователи просто испугаются и свалят»
ребята, если мы скажем что юнити теперь кодируется на С++, наши пользователи просто испугаются и свалят

И действительно свалят в таком случае.

Свалят, но они и от HPC# свалят, писать в Unity ECS очень трудоемко и неудобно, дебажить ECS очень сложно и так далее и тому подобное. Эта тема взлетит только среди профессиональных разработчиков с большим бюджетом именно на разработку.

Говорю это имея опыт написания на Unity ECS тестовых игр и некоторый опыт профессиональной разработки с другими ECS

Безусловно, но перфоманс-ориентед ECS с вещами типа SoA/Архитипы нигде не будет удобнее и понятнее имхо, тем более в С++.

Зато все остальное будет удобнее. И, как показывает практика, плюсовый код написанный левой пяткой по умолчанию работает в разы быстрее С#, чего вполне достаточно и без ECS в 90% случаев
Не в этом случае, нет, в HPC# парадигме написать так чтобы тормозило из-за языка сложно и ограничений на то что и как ты пишешь достаточно, чтобы написать специальный компилятор со специфичными оптимизациями, компилятор общего назначения С++ не всегда сможет так соптимайзить.
плюсовый код написанный левой пяткой по умолчанию работает в разы быстрее С#

довольно спорное утверждение, особенно в контексте HPC#. Пример! :)

Не, я имею как раз таки без HPC#. Чисто C# vs C++. Суть в том, что если писать на плюсах обычный код, он будет работать с достаточной производительностью в большинстве случаев, и ECS там не нужен

Эээ не понимаю причем тут ECS. Если вы пишите игру, в которой у вас много объектов и затык в ЦПУ, то абсолютно не важно C# или C++ вам придется брать Data oriented подход и потратить много усилий, никакой компилятор С++ за вас ваш "простой код" не оптимизирует в SoA данные и т.п. А вообще вера в компиляторы плюсов слишком сильная у людей, попробуйте как-нибудь поупражняться на godbolt.org, чуть более сложный код (как в жизни ;-) и оптимизации идут лесом.

в с++ за счет шаблонов, не спрятанных от разработчика указателей и ссылок, можно построить более удобный фреймворк, и даже памятью управлять не придется ведь по условию задачи мы не используем динамическую память.

За счет них же и макросов можно и в ногу выстрелить :) ну и опять же — время компиляции отличается в разы. Ребята с юнити еще и дотюнили розлин (инкрементальная компиляция) что там вообще должно в теории на лету компилироваться всё (но просядет немного в llvm opt).

Насчет выстрелов себе в ногу, посмотрите на код из примеров юнити:

Unity.Physics.Collider* capsuleColliderForQueries;
{
    Unity.Physics.Collider* colliderPtr = collider.ColliderPtr;

                    // Only capsule controller is supported
    Assert.IsTrue(colliderPtr->Type == ColliderType.Capsule);

    byte* copiedColliderMemory = stackalloc byte[colliderPtr->MemorySize];
    capsuleColliderForQueries = (Unity.Physics.Collider*)(copiedColliderMemory);
    UnsafeUtility.MemCpy(capsuleColliderForQueries, colliderPtr, colliderPtr->MemorySize);
   capsuleColliderForQueries->Filter = CollisionFilter.Default;
}


Сильно это отличается от стрельбы себе в ногу в с++?

Ну хотя бы макросов нет ;-)

Почему все так не любят макросы? Да, есть минусы, но блин куча плюсов, ведь это считай средство расширения синтаксиса языка. Если бы еще можно было обозначать макросы как-то красивее, чем тупо функция, было бы вообще огонь. Имхо метапрограммирование языка разработки — суперкрутая штука. Посмотрите недавние предложения по мета-классам, просто офигенная вещь
Имхо тем самым профессиональным разработчикам с бюджетом проще иметь С++ API

Не смог удержаться )) Статья выглядит как наглядная иллюстрация: "что только не сделаешь, чтоб не писать на c++":


… почти полностью обойтись без стандартной библиотеки (прощайте Linq, StringFormatter, List, Dictionary), запретить операции выделения (=никаких классов, только структуры), рефлексию, отключить сборщик мусора и виртуальные вызовы, а также добавить несколько новых контейнеров, которые разрешено использовать (NativeArray и компания).



проверки на границы масивов в рантайме, и нарекания на скорость компиляции — улыбнули )) опять забывают — компиляция продукта производится единожды, но продук запускается "миллионы раз".


Мы можем получать ошибки, связанные с выходом за границу при попытке доступа, получим отличные сообщения об ошибках, у на будет поддерживаться отладчик, а скорость компиляции будет такая, о которой вы уж и позабыли, работая с C++.

резюмируя:


Мне самому весьма нравится писать код на C#. Однако традиционный C# — не самый лучший язык с точки зрения производительности.
компиляция продукта производится единожды, но продук запускается "миллионы раз".

Правильнее сказать компиляция производится миллион раз, продукт запускается миллион раз. Почитайте https://aras-p.info/blog/2018/12/28/Modern-C-Lamentations/


Хотя LLVM opt и llc/jit тоже не самые быстрые, но хотя бы убирается долгая фаза сбора плюсов для генерации IR. C# из коробки предоставляет их рантайму (читай llvm) хороший alias analysis для кода, и еще им был необходим контроль над оптимизациями грубо говоря по-методно. Вот этот метод максимально оптимизировать и векторизовать, а вот тут отключить все оптимизации, строгий расчет флотов и т.п.
Безусловно всё можно было сделать в С++ (насколько понял, ребята даже свой opt pass для векторизации пишут для LLVM IR) но С# — это основной язык в среде Unity, разумнее развивать его, а не предлагать C# юзерам Unity отдельную подсистему писать на плюсах (jobs).

ну теперь понятно, как это устроено… А то везде говорят «у них магия burst бла бла бла все будет работать быстро!!1».

Оказывается все просто: компилятору явно говорится что данные не пересекаются и можно векторизовать со спокойной душой. Так ли это сложно в С++, предназначенном для производительности, в статье не описано.

Мне кажется они пытаются решить неразрешимое противоречие: сделать простой и производительный инструментарий. Фишка в том, что простота всегда накладывает некие ограничения: ты можешь делать поверхностные операции, но не можешь уйти вглубь, иначе это становится сложно. А значит ты не можешь максимально эффективно распорядиться ресурсами, что значит невозможно достичь максимальной производительности.

В итоге, им приходится делать фактически сложное решение (нет сборщика мусора, везде опасные массивы, нет удобных плюшек C#, черт посмотрите их примеры, они просто ужасают), под эгидой простого решения — "..but it's still C#!!". Честно говоря не верится, что типичное Unity3D сообщество перейдет на эту парадигму. Это сообщество как раз таки и выросло из простоты и удобства инструмента.
Оказывается все просто: компилятору явно говорится что данные не пересекаются и можно векторизовать со спокойной душой. Так ли это сложно в С++, предназначенном для производительности, в статье не описано.

Пользователь компилятору этого не говорит.


ты можешь делать поверхностные операции, но не можешь уйти вглубь, иначе это становится сложно. А значит ты не можешь максимально эффективно распорядиться ресурсами, что значит невозможно достичь максимальной производительности.

Я не видел исходного кода Burst, но у ребята утверждают что у них полный контроль и предсказуемость над маппингом IL в LLVM IR. Понятно что можно так же держать полный контроль кодгена на С++, но как минимум нельзя сказать что они не могут "уйти вглубь".


В итоге, им приходится делать фактически сложное решение (нет сборщика мусора, везде опасные массивы, нет удобных плюшек C#, черт посмотрите их примеры, они просто ужасают), под эгидой простого решения — "..but it's still C#!!". Честно говоря не верится, что типичное Unity3D сообщество перейдет на эту парадигму. Это сообщество как раз таки и выросло из простоты и удобства инструмента.

Мне примеры не кажутся страшными — там вроде даже указатели не используются.
То, что это C# позволит шарить между скриптинговой средой и высокопроизводительными джобами юзерский ECS код. И все не-гцшные фичи языка можно свободно использовать.

Мне примеры не кажутся страшными — там вроде даже указатели не используются.
То, что это C# позволит шарить между скриптинговой средой и высокопроизводительными джобами юзерский ECS код. И все не-гцшные фичи языка можно свободно использовать.


А вы пробовали? Обычно хватает небольшого тестового проекта, чтобы осознать, что писать так как предлагается это страдание.
Sign up to leave a comment.