问题描述
我是 Objective C 的新手,我正在尝试将基于 OpenGL 的 3D 渲染引擎移植到 Metal。在当前状态下,窗口创建和视图控制器管理在 C#(基于 Xamarin.iOS)中,渲染部分在 Native(C++ & OpenGL)中处理。
我正在考虑在 C# 中的 ViewController 中创建 cametallayer,并在目标 C 中创建其余与 Metal 相关的渲染代码。谁能告诉我如何传递 cametallayer 实例的引用并在目标 C 代码中使用它。
public override void ViewDidLoad()
{
base.ViewDidLoad();
// Perform any additional setup after loading the view,typically from a nib.
mtlDevice = Metal.MTLDevice.SystemDefault;
mtlLayer = new cametallayer();
mtlLayer.Device = mtlDevice;
mtlLayer.PixelFormat = MTLPixelFormat.BGRA8Unorm;
mtlLayer.FramebufferOnly = true;
mtlLayer.Frame = View.Layer.Frame;
View.Layer.AddSublayer(mtlLayer);
}
如何将在 C# 中创建的 mtlLayer 的引用传递给目标 C?
或者我可以在 Objective C 中创建 mtlLayer,但是我如何做 View.Layer.AddSublayer()?
解决方法
阅读后找到了我自己问题的答案。
来自 C#
-
通过 DllImport 将 mtlLayer.Handle(IntPtr) 传递给 native
public class Engine { [DllImport("__Internal",EntryPoint = "nativeMetalInit")] public static extern void Init( IntPtr device,IntPtr layer); } Engine.Init(mtlDevice.Handle,mtlLayer.Handle);
在原生 C/Cpp 库中
API void nativeMetalInit(void* device,void *layer)
{
metalInit(device,layer);
}
在目标 Cpp(.mm 文件)中
void metalInit(void *device,void *layer)
{
pRenderer = [[NativeRenderer alloc] init];
[pRenderer initilalizeMetal: device andLayer:layer];
}
- (void)initilalizeMetal: (void*) pDevice andLayer: (void*) pLayer
{
self.mtlLayer = (__bridge CAMetalLayer*) pLayer;
self.mtlDevice = (__bridge id<MTLDevice>)pDevice;
}