Код: Выделить всё
#pragma once
#include
#include
void iosCreateEmulator();
void iosRunFrame(CAMetalLayer* layer);
< /code>
Реализация моста (ios_driver.mm): < /p>
#import
extern "C" {
#include "ios_driver.h"
}
#define IOS_EXPORT extern "C" __attribute__((visibility("default")))
std::unique_ptr emulator = nullptr;
IOS_EXPORT void iosCreateEmulator() { ... }
// Runs 1 video frame of the emulator and
IOS_EXPORT void iosRunFrame(CAMetalLayer* layer) {
void* layerBridged = (__bridge void*)layer;
// Pass the CAMetalLayer to the emulator
emulator->getRenderer()->setMTKLayer(layerBridged);
// Runs the emulator for 1 frame and renders the output image using our layer
emulator->runFrame();
}
< /code>
my mtkview делегат: < /p>
class Renderer: NSObject, MTKViewDelegate {
var parent: ContentView
var device: MTLDevice!
init(_ parent: ContentView) {
self.parent = parent
if let device = MTLCreateSystemDefaultDevice() {
self.device = device
}
super.init()
}
func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {}
func draw(in view: MTKView) {
var metalLayer = view.layer as! CAMetalLayer
// Run the emulator for 1 frame & display the output image
iosRunFrame(metalLayer)
}
}
< /code>
Наконец, функция рендеринга эмулятора, которая взаимодействует с слоем: < /p>
void RendererMTL::setMTKLayer(void* layer) {
metalLayer = (CA::MetalLayer*)layer;
}
void RendererMTL::display() {
CA::MetalDrawable* drawable = metalLayer->nextDrawable();
if (!drawable) {
return;
}
MTL::Texture* texture = drawable->texture();
}
Насколько я понимаю, я не должен нарушать правила ARC, поскольку мой мостовой заголовок использует Cametallayer* вместо void*Code>, и Swift будет автоматически, когда ARC-объекты будут автоматически передавать ARC, когда ARC-объекты. Однако у меня нет никакой другой идеи относительно того, что может вызвать это. Я пытался отладить этот код в течение нескольких дней без особого успеха. https://github.com/wheremyfoodat/panda3 ... pp#l58-l68> Реализация моста: https://github.com/wheremyfoodat/panda3 ... reship/br/> Заголовок монтажа: https://github.com/wheremyfoodat/panda3 ... IVER.HRIVE Пробое:
Я изначально использовал void* вместо каметаллера* в интерфейсе моста, но это сбоя аналогично и сделало управление памятью еще более запутанным, поэтому я сбросил его. printf не приводит к сбою, сторона C ++ возвращает, и приложение продолжает работать. Тем не менее, это не очень полезно, так как я ничего не вижу ... < /p>
< /li>
Запуск эмулятора без рендеринга (использование его нулевого рендеринга) также работает. Я получаю правильные печатные сообщения в терминале Xcode, и я могу слышать игровое аудио. /> < /li>
< /ul>
Любая помощь больше, чем ценится. Спасибо за ваше время заранее.
Подробнее здесь: https://stackoverflow.com/questions/794 ... -with-meta