Как правильно передать металлический слой от Swiftui Mtkview в C ++ для использования с Metal-CPP?IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Как правильно передать металлический слой от Swiftui Mtkview в C ++ для использования с Metal-CPP?

Сообщение Anonymous »

Я в настоящее время переношу эмулятор консоли видеоигр в iOS, и я пытаюсь заставить рендеринг (тестируемый на macOS) работать и на iOS. У меня есть заголовок Objective-C ++ для соединения сторон Swift и C ++. Внутри делегата Mtkview я запускаю эмулятор для 1 видео кадры и передаю его слой подножки представления, чтобы он мог отобразить конечное выводное изображение. Эмулятор работает и возвращается, но когда он возвращается, я получаю сбой в Swift Land (Callstack прикреплен ниже), внутри OBJC_RELEASE, что указывает на то, что я делаю что -то не так с управлением памятью.

Код: Выделить всё

#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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • MTKView currentDrawable Bad Access на iOS 17
    Anonymous » » в форуме IOS
    0 Ответы
    57 Просмотры
    Последнее сообщение Anonymous
  • Металлический каркас добавляется в индивидуальный каркас без каких-либо ссылок.
    Anonymous » » в форуме IOS
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Металлический addCompletedHandler вызывает сбой в Swift 6 (iOS)
    Anonymous » » в форуме IOS
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Xcode 26 металлический компилятор ошибка Metaltoolchain
    Anonymous » » в форуме IOS
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Xcode 26 металлический компилятор ошибка Metaltoolchain
    Anonymous » » в форуме IOS
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous

Вернуться в «IOS»