Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mixing unmanaged C++ with F# for doing physics: worth it?

Tags:

c++

.net

interop

f#

I'm going to start writing a 3D game in unmanaged C++ using the DirectX SDK. It's going to involve a lot of physics and math, though I can't predictably say how complex it's going to be (I don't know if I'll be parallelizing it, for example). I was thinking, due to F#'s incredibly awesome units of measure feature, and the fact that it's functional and therefore parallelizes nicely, that I could write an F# library for doing the math-intensive computations of the game. But:

  • I'm inexperienced in C++, nevermind interfacing it with managed code. I don't know how backbreaking this would be.
  • I don't know how big a slowdown jumping in and out of a managed DLL would be for every math-intensive computation (at least one physics equation would have to be run per game iteration).
  • I'm not sure if the gain of units of measure and easy parallelization is worth it. I mean, if it's just math, it's gotta be easy to thread in C++ anyhow (there's not really any side effects, and if I recall there's a pure keyword in C++ maybe that disallows side effects or something?) -- and I suppose I could do without units of measure if I'm really careful (I know I'll only be using metric units).

So is it worth it? Is mixing managed and unmanaged code a common-ish practice? What about for games? Would it be a bottleneck? Would it make my draw code horrifying and convoluted? If you opened a VC++ project and saw this happening--what would your face look like (:) :( D:, etc)

like image 258
Carson Myers Avatar asked Feb 16 '11 04:02

Carson Myers


1 Answers

Jumping from managed to unmanaged code, or from unmanaged to managed code for individual operations is costly and not worth it for single instance costly operations. That is, the managed to unmanaged, or unmanaged to managed cost in calling a matrix multiplication will be higher than the cost of the multiplication in the implementation native to your code, although batching operations helps.

For what you're discussing, using F# in this manner would not produce any noticable benefit. It should also be noted that you have several math libraries already available to you, such as XNAMath (which comes with the DXSDK) for basic graphical transforms.

On the physics end of things you should prefer to use a physics middleware solution (PhysX, Bullet, etc) as they are much more mature, well tested, and generally will simplify development in the long run. Writing your own physics implementation is not recommended except in the case of learning HOW to do it.

like image 149
Washu Avatar answered Oct 11 '22 02:10

Washu