GLKView устанавливает свойства рисования - PullRequest
31 голосов
/ 22 февраля 2012

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

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

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

Ответы [ 5 ]

8 голосов
/ 03 декабря 2012

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

@interface CAEAGLLayer (Retained)

@end 

@implementation CAEAGLLayer (Retained)

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

@end

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

7 голосов
/ 13 декабря 2012

Ответ Симеона работает, но изменяет поведение всех представлений на основе 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 для тех представлений, для которых требуется принудительное сохранение.

2 голосов
/ 01 августа 2012

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

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.Надеюсь, это позволит вам установить нужный параметр.

1 голос
/ 02 мая 2016

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

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

0 голосов
/ 17 августа 2012

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

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;
...