【问题标题】:Create a Metal Window Wrapper using Objective-C++使用 Objective-C++ 创建一个 Metal Window Wrapper
【发布时间】:2020-01-23 18:59:33
【问题描述】:

我目前正在使用 C++ 开发轻量级游戏引擎,但是我正在 Mac 上开发。最初,我使用的是 Bootcamp,但我想尝试使用 premake 在 Mac 上实现它。我想在我的引擎中实现一些 Metal 支持,我知道我需要使用 Objective-C++。有什么方法可以在 Objective-C++ 中创建一个金属窗口并将其绑定到我的 C++ 代码中?

【问题讨论】:

  • 这当然是可能的。例如,GLFW 项目包含一个 C API,它通过 Objective-C 后端实现来管理 Cocoa 对象(包括 NSWindows)。在 C++ 中,您可以使用 Pimpl idiom 创建一个纯 C++ 类,其背后有一个 Objective-C++ 实现。

标签: c++ game-engine metal objective-c++ bridging-header


【解决方案1】:

有一个现有的 C++ 金属包装器库,https://github.com/naleksiev/mtlpp(MIT 许可)。我还没有任何个人经验,所以我不能推荐它,但是代码看起来很简单,如果你遇到任何问题或限制,你可能会修复他们或扩展它没有太多麻烦。

有一个示例也创建了一个窗口,因此至少涵盖了其中的基础知识:https://github.com/naleksiev/mtlpp/blob/master/examples/04_window.cpp

正如@warrenm 在 cmets 中指出的那样,在 Objective-C 和 C++ 之间创建“胶水”的关键是通过没有任何 Objective-C 关键字或类型(在runtime 标头)。

【讨论】:

  • 我知道 mtlpp 库是什么,但我很好奇的是它如何避免使用任何故事板或 xib 文件?
  • @James51332 您可以通过编程方式创建一个NSWindow,并在其中完全用代码添加和排列NSViews。然而,这部分非常需要用 Objective-C 编写。 MTLPP 似乎实现了这个in this part of the code
  • 感谢您指导我使用 Pimpl Idiom。我可以将它与本教程一起使用:oreilly.com/library/view/building-cocoa-applications/0596002351/…(使用 MTKView)为我的引擎创建一个 c++ 渲染系统。我还查看了 mtlpp,它非常有用。我现在知道如何将我的 Objective-C 代码包装到我的 C++ 代码中。我现在可以在我的引擎中实现 Mac 支持!
【解决方案2】:

在过去的几个月里,我了解到我实际上已经了解了链接器,并且我可以围绕 Metal 编写一个包装器来非常容易地适应我的 API。这是在 c++ 中使用 NSLog 登录的简单示例。

Main.cpp

// Prototype (should probably be in a header)
// extern "C" to avoid name mangling
extern "C" void log(const char*);

int main() {
    log("This was printed in c++ using NSLog!!");
}

日志.m

#include <Cocoa/Cocoa.h>

void log(const char* str)
{
    NSLog(@(str));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2013-05-17
    • 2012-08-10
    相关资源
    最近更新 更多