2

我目前正在开发一个游戏项目,所以我正在用 C# 开发我的编辑器,因为在 C++ 中完成它需要很多时间,所以为了提高效率,我使用 C# 作为编辑器的主要语言,以便快速获得结果。

但是,是否可以在 C# 中创建一个游戏编辑器来创建 C++ 可以读取的 C# 对象,或者在 C# 中创建一个可以在 C++ 中使用的 C++ 对象的游戏编辑器?

这是因为 C# 是 RAD 环境,所以开发 windows 应用程序很快,但 C++/DirectX 可能是最好的游戏环境。

有什么方法可以将两者结合起来,因为它们都是 .NET Framework 的一部分?

4

3 回答 3

2

过去,我成功地使用 C++/Cli 从 C# 创建 C++ 对象。基本上,您可以创建一个加载/创建 c/c++(非托管)对象的 C++(托管)库。您可以从托管 (c#/vb) 库/应用程序中使用此托管库。请注意以下事项:

  • C++/cli 只能针对特定平台 (x86/x64) 构建,因此您需要相应地构建托管编辑器
  • 只要微软不太喜欢这种情况,Visual Studio 2012 就不支持 C++/cli 的智能感知

COM 和 p/invoke 也是可行的替代方案。

于 2012-11-12T15:26:54.310 回答
1

C# 和 C++ 之间的通信(或任何托管和非托管语言之间)是一件令人头疼的事情,除非您有非常非常好的理由使用,否则应该避免使用。

对于通信,您可以使用管道、WCF、COM、P/Invoke 和其他一些自定义商业选项。你可以在网上搜索一下。在我工作的引擎中,我们使用由多个进程共享的匿名 MemoryStream。

但是总是会出现一个问题,即对于 C++ 中的任何结构更改,您都需要在 C# 中反映这些更改。就像您更改方法采用的参数或结构的定义一样。有一些解决方案可以自动“塑造”您的 C#,使其始终与 C++ 保持同步,但它们实施起来既昂贵又繁重。

现在,为什么你不应该打扰!诚然,您不会在 C++ 之外找到高端商业引擎。虚幻?C++。资源?C++。孤岛危机?C++。因为 C++ 提供了任何托管语言都无法提供的性能。它还允许直接控制内存和微观控制对象的创建和擦除方式。

那么,你为什么不关心呢?因为,除非您计划发布与刺客信条、半条命或天际一样大小或范围的 AAA 级游戏,否则 XNA 框架下的 C# 将提供充足的空间和性能。远远超过你应该需要的。如果您确实有性能问题,那么托管语言很可能不是问题,并且您的代码中应该还有很多优化需要完成。机会是,如果您在 C# 中遇到性能问题,您也会在 C++ 中遇到它们。

XNA 还提供了在 Windows、Xbox 和不同的 Microsoft 便携式设备上发布的能力。此外,无论如何,使用 DirectX 都会限制您使用这些平台。

于 2012-11-12T15:14:33.577 回答
0

是否可以从 C# 创建 C++ 对象?

不是直接的。对于初学者,我认为您不能使用 P/Invoke 调用构造函数;您将始终必须导出一个特殊的“构造函数包装器”,例如:

extern "C" {
    EXPORT_API YourClass* YourClassInstanceFactory()
    {
        return new YourClass();
    }
}

对于后续thiscall的 s ,您可能需要跟踪每次编译库时都会更改的所有修饰名称。

您可以在 C++ 中创建一个包装器库,该externC 辅助函数将通过 C# 进行平台调用,但话又说回来,不太确定这可能会增加开销,我认为您关心的是性能。

另一种解决方案可能是创建一个可以在 C# 中直接引用的 C++/CLI(CLR 类库)包装库。这种方法的优点是您可以像在常规 C++ 项目中一样引用本机库。

于 2018-07-05T20:40:04.760 回答