获取 C# 对象的 ObjectiveC 引用Xamarin.iOS、CAMetalLayer

问题描述

我是 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#

  1. 通过 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;
}