【问题标题】:Mixing unmanaged C++ with F# for doing physics: worth it?将非托管 C++ 与 F# 混合用于物理:值得吗?
【发布时间】:2011-02-16 04:24:53
【问题描述】:

我将开始使用 DirectX SDK 在非托管 C++ 中编写 3D 游戏。它会涉及很多物理和数学,尽管我无法预测它会有多复杂(例如,我不知道我是否会并行化它)。我在想,由于 F# 的 incredibly awesome units of measure feature,以及它的功能性并因此很好地并行化的事实,我可以编写一个 F# 库来进行游戏的数学密集型计算。但是:

  • 我对 C++ 缺乏经验,更不用说将它与托管代码接口。我不知道这会有多累人。
  • 我不知道对于每个数学密集型计算而言,进出托管 DLL 的速度会有多大(每次游戏迭代至少需要运行一个物理方程) .
  • 我不确定度量单位的增益和简单的并行化是否值得。我的意思是,如果它只是数学,无论如何它必须很容易在 C++ 中进行线程化(实际上并没有任何副作用,如果我记得 C++ 中有一个 pure 关键字可能不允许副作用或其他什么?) - 我如果我真的很小心的话,假设我可以不用度量单位(我知道我只会使用公制单位)。

那么值得吗?混合托管和非托管代码是一种常见的做法吗?游戏呢?会不会是瓶颈?它会让我的绘图代码变得可怕和令人费解吗?如果你打开一个 VC++ 项目并看到这种情况——你的脸会是什么样子(:):(D: 等)

【问题讨论】:

  • 您使用非托管 C++ 有什么特别的原因吗?
  • 二:1,我能找到的大多数适合初学者的教程都是用C++编写的,2,这是我明年在大学课程中使用的,所以很好带着一点经验进去
  • 虽然这对第 2 点没有帮助,但您可能对第 1 点的这个问题感兴趣:Comparison between XNA and DirectX (C#)。有很多关于使用 XNA 的教程,它可以让您在托管代码领域进行游戏。
  • c++ 中没有纯关键字。有一个纯虚拟的概念(由一个虚函数声明,后面有一个 = 0)表示你不能实例化类的实例,派生类必须重写这个函数。

标签: .net c++ f# interop


【解决方案1】:

从托管代码跳转到非托管代码,或从非托管代码跳转到单个操作的托管代码成本很高,对于单实例成本高昂的操作来说不值得。也就是说,调用矩阵乘法时的托管到非托管或非托管到托管的成本将高于代码本机实现中的乘法成本,尽管批处理操作会有所帮助。

对于您正在讨论的内容,以这种方式使用 F# 不会产生任何明显的好处。还应该注意的是,您已经有几个数学库可供您使用,例如用于基本图形转换的 XNAMath(随 DXSDK 提供)。

在物理方面,您应该更喜欢使用物理中间件解决方案(PhysX、Bullet 等),因为它们更加成熟、经过良好测试,并且从长远来看通常会简化开发。不建议编写自己的物理实现,除非在学习如何做的情况下。

【讨论】:

    猜你喜欢
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    相关资源
    最近更新 更多