gpt4 book ai didi

ios - 如何在通常的 iOS 应用程序(基于 UIWindow)中使用 GPU 加速的 SkCanvas?

转载 作者:行者123 更新时间:2023-11-29 11:48:59 24 4
gpt4 key购买 nike

是否可以将 OpenGL View 添加到 UIWindow 并使用 Skia 在其上绘制?

我找到了一个例子,我们在其中初始化了这样的 View :

 - (void)initialize {
CAEAGLLayer* layer = (CAEAGLLayer*)self.layer;

layer.opaque = NO;
layer.drawableProperties = @{kEAGLDrawablePropertyRetainedBacking: @(NO),
kEAGLDrawablePropertyColorFormat: kEAGLColorFormatRGBA8};

self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
if (!self.context || ![EAGLContext setCurrentContext:self.context])
NSLog(@"Cannot create EAGLContext!");

GLuint framebuffer;
GLuint renderbuffer;
glGenFramebuffers(1, &framebuffer);
glGenRenderbuffers(1, &renderbuffer);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);

[self.context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)layer];
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer);

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
NSLog(@"Failed to make complete frame buffer: %x", status);

CADisplayLink* displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(drawFrame:)];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}

- (void)drawFrame:(CADisplayLink*)sender {
glClearColor(1.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);

[self.context presentRenderbuffer:GL_RENDERBUFFER];
}

绘制了红色背景,但我无法让 Skia 使用此 View 。

我的 skia 代码:

const GrGLInterface* glInterface = GrGLCreateNativeInterface();
NSAssert(glInterface->validate(), nil);

GrContextOptions contextOptions;
GrContext* grContext = GrContext::Create(kOpenGL_GrBackend, (intptr_t)glInterface, contextOptions);
sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named);

GrBackendRenderTargetDesc grBackendRenderTargetDesc;

// This is GLuint framebuffer value from view setup code above.
grBackendRenderTargetDesc.fRenderTargetHandle = self.framebufferID;

grBackendRenderTargetDesc.fWidth = self.rboWidth;
grBackendRenderTargetDesc.fHeight = self.rboHeight;
grBackendRenderTargetDesc.fConfig = kRGBA_8888_GrPixelConfig;
grBackendRenderTargetDesc.fOrigin = kTopLeft_GrSurfaceOrigin;
grBackendRenderTargetDesc.fSampleCnt = 0;
grBackendRenderTargetDesc.fStencilBits = 0;

SkSurfaceProps skSurfaceProps(0, kUnknown_SkPixelGeometry);
sk_sp<SkSurface> skSurface = SkSurface::MakeFromBackendRenderTarget(grContext, grBackendRenderTargetDesc, &skSurfaceProps);

if (skSurface)
{
skCanvas = skSurface->getCanvas();

SkPaint paint;
paint.setColor(SK_ColorGREEN);
skCanvas->drawPaint(paint);
}

当我在 [self.context presentRenderbuffer:GL_RENDERBUFFER] 之前的 [... drawFrame:] 中放置 Canvas 绘制代码时,它不会绘制任何东西。

我错过了什么?我应该如何将 SkSurface/SkCanvas 与给定的 EAGLContext 链接起来,我应该如何调用 skia 绘图代码以使其正确工作?

最佳答案

当我调用时它按预期工作

skSurface->prepareForExternalIO() 

在所有 Skia 绘图代码之后和我调用之前

[self.context presentRenderbuffer:GL_RENDERBUFFER];

关于ios - 如何在通常的 iOS 应用程序(基于 UIWindow)中使用 GPU 加速的 SkCanvas?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42096415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com