Проблемы с памятью Skia при использовании статической библиотеки на iOSIOS

Программируем под IOS
Ответить
Anonymous
 Проблемы с памятью Skia при использовании статической библиотеки на iOS

Сообщение Anonymous »

Я скомпилировал Skia для iOS:

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

bin/gn gen out/ios-apple --args='target_os="ios" target_cpu="arm64" ios_use_simulator=false skia_enable_tools=false is_official_build=false is_debug=true is_trivial_abi=false skia_use_metal=true skia_use_expat=false skia_use_system_expat=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_system_freetype2=false skia_use_system_harfbuzz=false skia_use_system_icu=false skia_enable_gpu=true skia_enable_skottie=false skia_compile_modules=true extra_cflags=["-F/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks"] extra_ldflags=["-framework", "CoreFoundation", "-framework", "Metal"]'
Вот как я использую это в контроллере представления:

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

#import 
#import 
#import 

#define SK_GANESH
#define SK_METAL

#import 
#import 

@interface SkiaViewController : UIViewController 

@property (nonatomic, strong) MTKView *mtkView;
@property (nonatomic, strong) id metalDevice;
@property (nonatomic, strong) id metalQueue;

@property (nonatomic, assign) sk_sp grDirectContext;
@property (nonatomic, assign) sk_sp surface;
@end

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

#import 
#import 

#define SK_GANESH
#define SK_METAL

#import "include/gpu/ganesh/GrTypes.h"
#import "include/gpu/ganesh/SkSurfaceGanesh.h"
#import "include/gpu/ganesh/mtl/GrMtlTypes.h"

#import 
#import 
#import 
#import 
#import 
#import 

#import 
#import 
#import 
#import 

#import "SkiaViewController.h"

@implementation SkiaViewController

- (void)viewDidLoad {
[super viewDidLoad];

#ifndef SK_GANESH
NSLog(@"SK_GANESH is undefined");
#endif

#ifndef SK_METAL
NSLog(@"SK_METAL is undefined");
#endif

[self setMetalDevice:MTLCreateSystemDefaultDevice()];
[self setMetalQueue:[[self metalDevice] newCommandQueue]];

if(![self metalDevice]) {
NSLog(@"Metal is not supported on this device");
return;
}

if(![self metalQueue]) {
NSLog(@"Failed to create Metal command queue");
return;
}

// Initialize MTKView
self.mtkView = [[MTKView alloc] initWithFrame:self.view.bounds device:self.metalDevice];
self.mtkView.delegate = self;
self.mtkView.enableSetNeedsDisplay = YES;

[self.mtkView setDepthStencilPixelFormat:MTLPixelFormatDepth32Float_Stencil8];
[self.mtkView setColorPixelFormat:MTLPixelFormatBGRA8Unorm];
[self.mtkView setSampleCount:1];

NSLog(@"self.metalDevice.maxBufferLength=%lu", self.metalDevice.maxBufferLength);

self.mtkView.layer.borderWidth = 2.0; // Set border width
self.mtkView.layer.borderColor = [UIColor redColor].CGColor; // Set border color

[self.view addSubview:self.mtkView];

// Initialize Skia with Metal
GrMtlBackendContext backendContext = {};
backendContext.fDevice.retain((__bridge void*)[self metalDevice]);  // also tried __bridge_retained
backendContext.fQueue.retain((__bridge void*)[self metalQueue]);

GrContextOptions grContextOptions;

self.grDirectContext = GrDirectContexts::MakeMetal(backendContext, grContextOptions);

if (![self grDirectContext]) {
NSLog(@"Failed to create GrDirectContext");
return;
}

NSLog(@"Created GrDirectContext");
}

#pragma mark - MTKViewDelegate

- (void)drawInMTKView:(nonnull MTKView *)view {
}

- (void)mtkView:(nonnull MTKView *)view drawableSizeWillChange:(CGSize)size {

}

@end
В этом случае все работает нормально.
Но если я создаю статическую библиотеку внутри того же проекта, переместите ViewController в эту статическую библиотеку и используйте представление контроллер из статической библиотеки в моем приложении, я сталкиваюсь с проблемами памяти в GrDirectContexts::MakeMetal.
Иногда происходит сбой из-за ошибки неправильного доступа, иногда некоторые указатели становятся nullptr, например в backendContext сразу после установки этих значений.
То же самое, если я перенесу эту инициализацию Skia в отдельную библиотеку C++ (скомпилированную CMake, а не напрямую в Xcode).Я предполагаю, что это какая-то проблема с интеллектуальными указателями Skia (может быть, что-то удаляется при связывании со статической библиотекой?), но я не знаком с разработкой Obj-C и взаимодействием с C++ для iOS.
UPD. Я тестировал простую библиотеку C++, не передавая в Skia никаких указателей Obj-C, и могу подтвердить, что у меня с ней точно такие же проблемы — в какой-то момент указатель внутри sk_sp становится недействительным (например, когда Skia пытается его освободить).
Что здесь может быть не так?

Подробнее здесь: https://stackoverflow.com/questions/793 ... ary-on-ios
Ответить

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

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

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

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

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