Управляемые и неуправляемые физические движки для C # - PullRequest
3 голосов
/ 21 января 2012

кто-нибудь пробовал BEPU Physic Engine?http://bepuphysics.codeplex.com/

Это полностью управляемый физический движок, написанный на C # ... Я знаю, что он в основном используется для XNA (проекты XBOX и WP7), потому что неуправляемые коды не разрешены.

Но что яХотите узнать, как полностью управляемый физический движок сравнивается с P / Invoked One (например, tao.ODE) в Windows Среде (в терминах производительность )?

Другими словами, какой метод создает больше накладных расходов, полностью управляемый код или P / Invoke Wrapper вокруг неуправляемых двигателей, таких как ODE или PhysX, в реальном проекте?

Ответы [ 2 ]

5 голосов
/ 21 января 2012

Я не могу комментировать конкретные физические движки, однако могу предложить некоторый опыт в написании высокопроизводительного кода (как неуправляемого, так и управляемого).

Несколько лет назад я работал над программным обеспечением для моделирования, написанным на Delphi и портированным на .NET (я бы сказал, до моего приезда).Это был чисто управляемый код и вычисленные ионные траектории для масс-спектрометрического моделирования.Кодекс включал численное интегрирование, дифференцирование, расчеты электростатического заряда N-тела, поэтому, безусловно, тестировал процессор.

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

Под хорошо оптимизированным я подразумеваю сокращение новых операторов (повторное использование объектов), кэширование, объединение объектов, где это возможно, использование структур, минимизацию вызовов методов, где это возможно, перемещение вызовов методов на static / * 1008.* где возможно, минимизируйте количество параметров, передаваемых в методы, компилируйте в выпуске x64, отсоединяйте от отладчика.После того, как я это сделал, чтобы действительно победить CLR с помощью C ++, мне пришлось прибегнуть к низкоуровневым методам, таким как SSE / SSE2 и встроенный ассемблер.

Хорошо, я признаю, что C # и управляемые языки не подходят для оптимизированного вручную кода C ++ в опытных руках, но я видел плохо оптимизированный код на обеих платформах.Легко обвинять CLR, когда код на C # медленный, но когда разработчики используют оператор new по своему желанию, я нахожу странным, что они удивляются, когда GC запускается так часто.new и delete в C ++ также приводят к снижению производительности, поэтому не ожидайте, что компиляция C ++ просто сделает вещи быстрее.

Возвращаясь к вашему конкретному движку - вам, конечно, придется самостоятельно провести тестирование и анализ производительности.Что касается вызова платформы, то он вызывает снижение производительности, известное как thunking, когда указатели и структуры маршалируются через управляемую / неуправляемую границу.В чистом управляемом коде этого не будет, но при этом будут отсутствовать такие оптимизации, как копирование памяти низкого уровня, расширения SSE / SSE2 и т. Д., Которые можно кодировать в C ++.

В заключение я скажу, что в качестве примера очень мощной и быстрой библиотеки управления управляемой платформой взгляните на SlimDX .Хорошо, вы получите снижение производительности по сравнению с нативным кодом и DirectX (в некоторых источниках ~ 5%), но для повышения производительности разработки на C # я бы сказал, что оно того стоит!

С уважением,

1 голос
/ 21 января 2012

но я хочу знать, как полностью управляемый физический движок сравнивается с P / Invoked One (для пример tao.ODE) в среде Windows (в плане производительности)?

Оба отстой - единственный способ получить действительно высокую производительность в наши дни не "неуправляемый", как в "коде процессора", но "неуправляемый", как в "работе на видеокарте".

...