Подтвердить что ты не робот

GLKView устанавливает доступные свойства

Я пытаюсь передать пример Apples GLPaint для использования GLKit. Используя UIView, можно вернуть CAEAGLLayer представления и установить drawableProperties для включения kEAGLDrawablePropertyRetainedBacking. Это приводит к сохранению извлекаемого содержимого после представления буфера визуализации, как и ожидалось. Удаление этого свойства приводит к мерцанию после вызова рисования с частью извлекаемого содержимого, которое, казалось бы, нарисовано на разные буферы.

Проблема в том, что это именно та проблема, с которой я сейчас сталкиваюсь в своем GLKView, но, похоже, не существует способа установить доступные свойства. Возвращение CAEAGLLayer и установка свойств не оказывают никакого эффекта, и я не вижу никаких соответствующих свойств GLKView для установки сохраненной поддержки.

Кто-нибудь еще сталкивается с этим или имеет решение?

4b9b3361

Ответ 1

Если вы хотите получить kEAGLDrawablePropertyRetainedBacking в GLKView, добавьте в свой проект следующую категорию.

@interface CAEAGLLayer (Retained)

@end 

@implementation CAEAGLLayer (Retained)

- (NSDictionary*) drawableProperties
{
    return @{kEAGLDrawablePropertyRetainedBacking : @(YES)};
}

@end

Настройка drawableProperties на CAEAGLLayer, поддерживаемая GLKView, не работает, потому что GLKView перезаписывает эти свойства, когда привязывает свой drawable и создает хранилище рендеринга. Использование этого метода заставляет GLKView использовать вашу категорию, возвращаемую drawableProperties.

Ответ 2

Ответ Simeon работает, но изменяет поведение для всех представлений на основе EAGL в приложении. У меня есть некоторые взгляды, которые нуждаются в поддержке, и другие, которых нет, поэтому я придумал немного другое решение, создав подклассы GLKView и CEAGLLayer, например:

@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

и этот

@interface RetainedGLKView : GLKView
@end

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

Теперь я могу просто использовать RetainedGLKView вместо GLKView для тех видов, где я хочу принудительно сохранить резервную копию.

Ответ 3

Не уверен, что это сработает, но вот какой код у нас есть:

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;

Вы должны иметь доступ к eaglLayer.drawableProperties. Надеюсь, это позволит вам установить требуемый параметр.

Ответ 4

В вашем файле реализации 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;
}

Я не знаю, как людям удается сделать вещи такими сложными; это так, и только это.

Ответ 5

Привет, пожалуйста, попробуйте этот

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;