使用 Objective-C++ 创建金属 Window 包装器

Create a Metal Window Wrapper using Objective-C++

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

有一个用于 C++ 的现有 Metal 包装器库,https://github.com/naleksiev/mtlpp(MIT 许可)。我还没有任何个人经验,所以我不能 推荐 它,但代码看起来很简单,如果你 运行 遇到任何问题或它的局限性你可以很容易地修复或扩展它。

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

正如@warrenm 在评论中指出的那样,在 Objective-C 和 C++ 之间创建 "glue" 的关键是保持 headers "clean" Objective-C 个关键字或类型(在 runtime headers 中定义的那些之外)。

在过去的几个月里,我了解到我实际上已经了解了链接器,并且我可以围绕 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!!");
}

Log.m

#include <Cocoa/Cocoa.h>

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