我有(多個)UIViews
與CAEAGLLayer
類型的層,並且能夠在輔助線程上附加到這些圖層的渲染緩衝區上調用[EAGLContext presentRenderBuffer
:],沒有任何形式的圖形故障。在輔助線程上調用[EAGLContext presentRenderBuffer:]是否安全?
我會期望看到至少有一些撕裂,因爲這些UIViews
合成的其他UI在主線程上更新。 CAEAGLLayer
(我有kEAGLDrawablePropertyRetainedBacking
設爲NO
)在後臺做一些雙緩衝?
我只是想知道爲什麼它是這個工程......
例子:
BView
是UIView
子類,它擁有與分配給它的OpenGLES層渲染存儲幀緩存,在共享EAGLContext
:
@implementation BView
-(id) initWithFrame:(CGRect)frame context:(EAGLContext*)context
{
self = [super initWithFrame:frame];
// Configure layer
CAEAGLLayer* eaglLayer = (CAEAGLLayer*)self.layer;
eaglLayer.opaque = YES;
eaglLayer.drawableProperties = @{ kEAGLDrawablePropertyRetainedBacking : [NSNumber numberWithBool:NO], kEAGLDrawablePropertyColorFormat : kEAGLColorFormatSRGBA8 };
// Create framebuffer with renderbuffer attached to layer
[EAGLContext setCurrentContext:context];
glGenFramebuffers(1, &FrameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, FrameBuffer);
glGenRenderbuffers(1, &RenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, RenderBuffer);
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(id<EAGLDrawable>)self.layer];
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, RenderBuffer);
return self;
}
+(Class) layerClass
{
return [CAEAGLLayer class];
}`
一個UIViewController
在初始化時主線程上又增加了BView
實例:
BView* view = [[BView alloc] initWithFrame:(CGRect){ 0.0, 0.0, 75.0, 75.0 } context:Context];
[self.view addSubView:view];
在輔助線程上,渲染到BView
中的幀緩衝區並呈現它;在這種情況下,它是在從視頻AVCaptureDevice,定期調用的回調:
-(void) captureOutput:(AVCaptureOutput*)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection*)connection
{
[EAGLContext setCurrentContext:bPipe->Context.GlContext];
// Render into framebuffer ...
// Present renderbuffer
glBindRenderbuffer(GL_RENDERBUFFER, BViewsRenderBuffer);
[Context presentRenderbuffer:GL_RENDERBUFFER];
}
發佈您的代碼片段 – phoenix
誰在更新緩衝區的內容?主線程或輔助線程? –
@JoaEbert更新和演示,如我剛剛添加的代碼所示,在輔助線程上完成 – Dickson