2013-09-24 3 views
4

Я - разработчик игр, и я предпочитаю использовать C#. Когда я спросил, в чем недостатки написания приложений реального времени на C#, я получил 1 существенный момент назад: сборник мусора и непредсказуемое влияние, которое он может иметь на производительность.Неуправляемый C# по сравнению с C++

Мой встречный вопрос, как насчет неуправляемого C#? Как он сравнивается (по производительности) с C++? Является ли это допустимым вариантом для разработки программного обеспечения?

Я не очень-то разбираюсь в неуправляемом C#, и все «неуправляемые вопросы C# против C++», которые я видел, остались без ответа или неточно ответили. Эти вопросы не были связаны с переполнением стека.

EDIT:

Я считаю, umanaged C# является "небезопасный код".

+7

На какой платформе неуправляемый C#? Я никогда не слышал об этом. C# был разработан для управляемой среды .net и остается таким, за исключением, возможно, если вы смотрите на монофонический сенсорный/дроид. Если такой платформы нет, возможно, именно по этой причине ее не так много узнать. –

+3

Что на Земле «Неуправляемый C#»? O_O – Drop

+0

Я слышал о C#, который не подпадает под управление памятью (и, возможно, и другие вещи). Он позволяет использовать указатели стиля C++. Пример может быть найден путем декомпиляции некоторой функциональности ядра .Net (я думаю). –

ответ

3

Небезопасный код на C# не предназначен для разработки отдельных приложений. Вы можете использовать небезопасный код для каких-то критически важных операций, но, как правило, это не самый эффективный и удобный способ сделать это. IMHO, он в первую очередь предназначен для того, чтобы дать C# возможность интегрироваться с неуправляемыми библиотеками динамических ссылок и неуправляемым кодом, поэтому, с моей точки зрения, основной причиной является INTEGRATION.

Я вижу 3 общих путей управляемой и неуправляемой интеграция коды:

  1. Unsafe code в C# и P/Invoke. Построить C# обертки над скомпилированным неуправляемым DLL s.
  2. Managed C++. Создавайте управляемые сборки поверх существующего кода C/C++.
  3. COM взаимодействие. Вызовите Runtime Callable Wrapper из клиента .NET или позвоните по телефону COM Callable Wrapper из COM-клиента.

С другой стороны, это ваше архитектурное и концептуальное решение: если вам нужна полная память и контроль производительности, вы развиваетесь на C++ или даже чистом C. Если вам нужны преимущества и простота современного языка и современных технологий, вы развиваетесь в .NET C#. Или вы можете использовать их и как их интегрировать, описано выше.

+0

Неверно, что небезопасные C# существуют только для интеграции. Указатели и арифметика указателей существуют в C# по тем же причинам, что и в C++. К сожалению, указатели не являются «безопасными», то есть компилятор и среда выполнения не могут защитить вас от таких ошибок, как оборванные указатели, переполнения буфера и утечки памяти, поэтому компилятор требует, чтобы вы согласились с отказом от ответственности: «Я знаю, что это небезопасно, но я хочу это". –

+0

Ну, C# не был в основном разработан для работы с указателями. – Olexander

+0

Я имею в виду, что вы можете использовать указатели и управлять памятью памяти, но это не то, для чего предназначен C#. – Olexander

0

Для общих целей C# (управляемый) - очень подходящий язык с отличной производительностью. Если у вас нет чрезвычайно высоких требований, вы можете использовать его для игр. Посмотрите на Unity:

Unity

Тем не менее, большинство игр ААА студии используют C++ в качестве основного языка программирования. При этом, если вы хотите карьеру в таких студиях, вам лучше инвестировать в C++.

+0

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

+0

Несмотря на то, что я никогда не чувствую себя как дома, как с C++, я действительно думаю, что у C# есть отличные возможности. Вы когда-нибудь пробовали Reactive Extensions в C#? Это потрясающе! Он обеспечивает действительно мощное параллельное программирование, основанное на событиях. –

+0

Мне нужно посмотреть. Спасибо :) –

1

Вы можете использовать C# для создания игр. Вопрос в том, что именно вы намерены делать? На каких платформах вы планируете нацеливаться, и насколько полированный вы планируете готовить?

Другие упомянули Unity, который использует C# и предоставляет готовый игровой движок и пакет разработки. Единственным недостатком является то, что бесплатная версия имеет ограничения.

Если вы хотите построить свой собственный двигатель ради понимания, загляните в XNA. Или вы можете использовать обертку вокруг OpenGL, например SharpGL. Или, может быть, вы можете найти долгоживущий управляемый DirectX, плавающий где-то. Или, если вы действительно смелы, вы можете использовать небезопасный код и переносить вызовы GDI, чтобы вам не приходилось иметь дело с ужасно медленной реализацией GDI +. Последние два действительно не рекомендуются, и только XNA собирается предоставить вам больше, чем способ рисовать вещи на экране. Конечно, будет множество других возможностей, особенно учитывая то, что становится доступным для разработчиков C# с Mono.

Независимо от того, что вы решите, сборщик мусора не собирается мешать вам, и небезопасный код не будет решением, если это произойдет.

Редактировать: Как упоминалось cdoubleplusgood, XNA больше не находится в активной разработке. Посмотрите на Monogame и рассмотрите чудеса кросс-платформенной разработки бонус.

+4

MS прекратила дальнейшее развитие XNA. Для нового проекта я бы не рекомендовал его. – cdoubleplusgood

+0

@cdoubleplusgood Вы правы. Пока это не совсем мертвая технология, но я полагаю, что лучше рекомендовать инструменты, которые в обозримом будущем, а? :) – Dave

Смежные вопросы