简体   繁体   中英

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

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)

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM