files apple app iphone ios5 opengl-es-2.0 glkit

iphone - apple - GLKView establece las propiedades dibujables



files app iphone (5)

Estoy tratando de portar el ejemplo GLPaint de Apples para usar GLKit. Usando un UIView, es posible devolver CAEAGLLayer de la vista y establecer drawableProperties para incluir kEAGLDrawablePropertyRetainedBacking. Esto tiene el efecto de retener los contenidos dibujables después de presentar el buffer de renderización, como se esperaba. Al eliminar esta propiedad, se produce un parpadeo después de la llamada al sorteo y parte del contenido dibujable se dibuja aparentemente en diferentes búferes.

El problema es que este es exactamente el problema que ahora tengo en mi GLKView, pero no parece haber una manera de establecer las propiedades dibujables. Devolver un CAEAGLLayer y establecer las propiedades no tiene ningún efecto y no veo ninguna propiedad relevante de GLKView para establecer el respaldo retenido.

¿Alguien más se ha encontrado con esto o tiene una solución?


En su archivo de implementación GLKView:

- (id)initWithCoder:(NSCoder *)aDecoder { if ((self = [super initWithCoder:aDecoder])) { _eaglLayer = (CAEAGLLayer *)self.layer; _eaglLayer.opaque = TRUE; _eaglLayer.drawableProperties = @{ kEAGLDrawablePropertyRetainedBacking : [NSNumber numberWithBool:NO], kEAGLDrawablePropertyColorFormat : kEAGLColorFormatRGBA8}; } return self; }

No sé cómo la gente logra hacer las cosas tan complicadas; es así, y solo esto.


Hola, por favor, prueba este

GLKView * const view = (GLKView *)self.view; view.context = self.context; view.delegate = self; view.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888; view.drawableDepthFormat = GLKViewDrawableDepthFormat24; view.drawableMultisample = GLKViewDrawableMultisampleNone; self.preferredFramesPerSecond = 10; [EAGLContext setCurrentContext:self.context]; CAEAGLLayer * const eaglLayer = (CAEAGLLayer*) view.layer;


La respuesta de Simeon funciona pero cambia el comportamiento de todas las vistas basadas en EAGL en una aplicación. Tengo algunas vistas que necesitan el respaldo forzado y otras que no, así que se me ocurrió una solución ligeramente diferente al crear subclases de GLKView y CEAGLLayer, así:

@interface RetainedEAGLLayer : CAEAGLLayer @end @implementation RetainedEAGLLayer - (void)setDrawableProperties:(NSDictionary *)drawableProperties { // Copy the dictionary and add/modify the retained property NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] initWithCapacity:drawableProperties.count + 1]; [drawableProperties enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) { // Copy all keys except the retained backing if (![key isKindOfClass:[NSString class]] || ![(NSString *)key isEqualToString:kEAGLDrawablePropertyRetainedBacking]) [mutableDictionary setObject:object forKey:key]; }]; // Add the retained backing setting [mutableDictionary setObject:@(YES) forKey:kEAGLDrawablePropertyRetainedBacking]; // Continue [super setDrawableProperties:mutableDictionary]; [mutableDictionary release]; } @end

y esto

@interface RetainedGLKView : GLKView @end @implementation RetainedGLKView + (Class)layerClass { return [RetainedEAGLLayer class]; } @end

Ahora puedo usar RetainedGLKView en lugar de GLKView para aquellas vistas en las que quiero forzar un respaldo retenido.


No estoy seguro si esto funcionará pero aquí hay un código que tenemos:

GLKView * const view = (GLKView *)self.view; view.context = self.context; view.delegate = self; view.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888; view.drawableDepthFormat = GLKViewDrawableDepthFormat24; view.drawableMultisample = GLKViewDrawableMultisampleNone; self.preferredFramesPerSecond = 30; [EAGLContext setCurrentContext:self.context]; CAEAGLLayer * const eaglLayer = (CAEAGLLayer*) view.layer; eaglLayer.opaque = YES;

Debería poder acceder a eaglLayer.drawableProperties . Con suerte, eso te permite establecer el parámetro que deseas.


Si desea obtener kEAGLDrawablePropertyRetainedBacking en un GLKView, agregue la siguiente categoría a su proyecto.

@interface CAEAGLLayer (Retained) @end @implementation CAEAGLLayer (Retained) - (NSDictionary*) drawableProperties { return @{kEAGLDrawablePropertyRetainedBacking : @(YES)}; } @end

El establecimiento de DrawableProperties en CAEAGLLayer mantenido por GLKView no funciona porque GLKView sobrescribe esas propiedades cuando vincula su drawable y genera su almacenamiento de renderizado. El uso de este método obliga al GLKView a usar en su lugar las DrawableProperties devueltas de su categoría.