Я не могу комментировать конкретные физические движки, однако могу предложить некоторый опыт в написании высокопроизводительного кода (как неуправляемого, так и управляемого).
Несколько лет назад я работал над программным обеспечением для моделирования, написанным на 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 # я бы сказал, что оно того стоит!
С уважением,