31 votes

GLKView définit les propriétés de dessin

J'essaie de port Pommes GLPaint exemple l'utilisation de GLKit. À l'aide d'une UIView, il est possible de retourner le CAEAGLLayer de l'afficher et de définir la drawableProperties inclure kEAGLDrawablePropertyRetainedBacking. Cela a pour effet de conserver le drawable contenu après la présentation du tampon de rendu, comme prévu. La suppression de cette propriété des résultats dans le scintillement après l'appel à la partie de la drawable contenu apparemment attirés par les différents tampons.

Le problème c'est que c'est exactement la question que je suis maintenant dans mon GLKView, mais il ne semble pas être un moyen de mettre le drawable propriétés. Retour d'un CAEAGLLayer et en définissant les propriétés n'a aucun effet et je ne vois pas de propriétés pertinentes de GLKView pour définir conservé la sauvegarde.

Quelqu'un d'autre a rencontré ce ou une solution?

8voto

simeon Points 1027

Si vous souhaitez obtenir kEAGLDrawablePropertyRetainedBacking dans un GLKView, ajoutez la catégorie suivante à votre projet.

 @interface CAEAGLLayer (Retained)

@end 

@implementation CAEAGLLayer (Retained)

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

@end
 

La définition de drawableProperties sur CAEAGLLayer gérée par GLKView ne fonctionne pas car GLKView écrase ces propriétés lorsqu'il lie son drawable et génère son stockage de rendu. L'utilisation de cette méthode force GLKView à utiliser à la place les propriétés drawableProperties renvoyées par votre catégorie.

7voto

John Stephen Points 2739

La réponse de Simeon fonctionne mais modifie le comportement de toutes les vues basées sur EAGL dans une application. J'ai certaines vues qui nécessitent un support forcé et d'autres qui ne le font pas, j'ai donc trouvé une solution légèrement différente en créant des sous-classes de GLKView et CEAGLLayer, comme ceci:

 @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
 

et ça

 @interface RetainedGLKView : GLKView
@end

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

Maintenant, je peux simplement utiliser RetainedGLKView au lieu de GLKView pour les vues où je veux forcer un support conservé.

2voto

Liron Points 921

Je ne sais pas si cela fonctionnera, mais voici un code que nous avons:

 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;
 

Vous devriez pouvoir accéder à eaglLayer.drawableProperties . J'espère que cela vous permet de définir le paramètre souhaité.

-2voto

vni Points 16

Salut, essayez celui-ci

 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;
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X