Estoy buscando en la conversión de mi renderizado de OpenGL código de tomar ventaja de algunas de las características de GLKit (es decir, el asincrónica textura de la carga y la automatización proporcionada por GLKView/Controller). Sin embargo, parece que las clases están diseñadas principalmente para dar cabida a personas de representación mediante una animación en bucle, mientras que yo estoy trabajando con la demanda de representación. Además, algunos de la representación es una textura en lugar de la GLKView del framebuffer, así que debo estar buscando sólo subclase de la GLKView y añadir las Obf?

Hay un enfoque recomendado para este tipo de instalación? Yo esperaría algo a lo largo de las líneas de:

  • Configurar la vista del controlador de preferredFramesPerSecond a 0, o simplemente
    pausa el marco de las actualizaciones?
  • Ignorar la glkViewControllerUpdate o glkView:drawInRect: métodos
    y dibujar lo que necesito, cuando lo necesito.
  • Utilizar la vista del setNeedsDisplay como normal UIView en orden
    para mostrar el cuadro (¿ tengo que llamar a bindDrawable teniendo en cuenta que me
    será la representación de una textura así?).

Tal vez no vale la pena el esfuerzo si esto no es lo que la nueva API está diseñada para? Me gustaría que la documentación era un poco más profunda de lo que es. Tal vez más muestras serán proporcionados cuando la API ha «madurado» un poco…

Gracias

InformationsquelleAutor Stuart | 2011-10-12

3 Comentarios

  1. 23

    El enfoque terminé usando para no molestar con el GLKViewController, pero sólo tiene que utilizar GLKView directamente debajo de una UIViewController subclase.

    Claramente, la GLKViewController está diseñado para su uso por las personas que necesitan un constante bucle de renderización para aplicaciones tales como juegos. Sin ella, el dibujo a la GLKView es tan sencillo como llamar [glkView setNeedsDisplay]. Asegúrese de establecer enableSetNeedsDisplay a YES con el fin de permitir este tipo de comportamiento.

    Si ¿todavía desea hacer uso de un GLKViewController, puede desactivar la animación de representación de bucle en viewWillAppear así:

    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];    //setPaused automatically set to NO in super's implementation
    
        [self setPaused:YES];
    }

    Además, el conjunto resumeOnDidBecomeActive a NO para evitar que el controlador de vista de la reanudación de nuevo automáticamente.

    El uso de una llanura UIViewController con un GLKView es perfectamente aceptable, sin embargo, y yo lo he visto recomendado por un ingeniero de Apple como una forma adecuada para llevar a cabo en la demanda de dibujo.

    • Sería de gran ayuda si pudieran aclarar en qué métodos enableSetNeedsDisplay y resumeOnDidBecomeActive es necesario establecer como se ha mencionado, ya que no los puso en viewWillAppear(BOOL)animados. Gracias.
    • Establecer estas propiedades cuando se crea la vista / controlador de vista. Por ejemplo, si usted cree que su GLKViewController en el código, tal vez establecer en la línea de meta después de su alloc/init. Si usted cree que en el interface builder, entonces la aplicación de la -awakeFromNib método en el controlador de vista podría ser un buen lugar para ello. En general, las propiedades como este debe ser establecido después de que/como se crea el objeto, pero antes de ser utilizado.
    • ¿Tiene el código fuente abierto disponible mostrando un ejemplo de esto? Gracias
  2. 3

    Acabo de convertir mi código de uso de un EAGLContext manager me di a mí mismo para el uso de la GLKit clases.

    Que sugieren que podría «..ignorar el.. glkView:drawInRect: métodos y dibujar lo que necesita, cuando lo necesita». Esto parece una opción razonable en cuanto al rendimiento; supongo (aunque no lo he probado) si usted simplemente no especifica un GLKViewDelegate o proporcionar una subclase de GLKView con su drawInRect: definido, entonces no hay ninguna animación en bucle de renderizado se va a producir. Ha intentado esto?

    La alternativa sería simplemente crear algunos @property (assign, nonatomic) BOOL shouldUpdate; en su MyController : GLKViewController <GLKViewDelegate> clase que sólo se actualizará si hay algo que hacer:

    [self setDelegate:self]; //in init or awakeFromNib or other..
    
    -(void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
        if ([self shouldUpdate]) { ...

    Estoy seguro de que usted consigue la idea, no es nada complicado.

    Una cosa que vale la pena mencionar: el oficial de la API docs estado que viewDidLoad debe ser utilizado en su GLKViewController inicial de configuración de CONTABILIDAD. He tenido problemas con esto, por alguna razón mi glCreateShader llamadas siempre se devuelve cero. Esto puede haber sido debido a mi configuración de la EAGLContext post-inicialización; yo no podía pasar como un init parámetro ya que he creado el controlador en el Guión gráfico. Sin embargo, no había nada lógicamente mal con el código, así que me ofrecen este amable advertencia en caso de encontrar problemas similares. Mi solución es simplemente el siguiente en mi drawInRect:

    -(void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
        if ([self initialGLSetupDone] == NO) {
            [self beforeFirstRender];
            [self setInitialGLSetupDone:YES];
        }
        //.. rest of render code goes here.
    }

    Obviamente no es lo ideal para tener una SI hay innecesariamente, pero era una solución fácil.

    Déjame saber cómo se va si se intenta actualizar a utilizar GLKit.

    • Con respecto a la viewDidLoad problema, su EAGLContext debe ser establecido antes de la creación de los shaders, como se dio cuenta de ti mismo. No hay nada de malo en hacer esto en viewDidLoad demasiado, directamente antes de la instalación el resto de su GL código. Echa un vistazo a la ‘OpenGL Juego’ de la plantilla de proyecto en Xcode para un buen ejemplo de cómo realizar esta configuración.
    • Gracias por el pestillo de la punta. Mucho más fácil que intentar dibujar manualmente el CAEAGLLayer o de otras soluciones.
  3. 1

    Después de haber creado GLKView, añadir esta línea:

    glkView.enableSetNeedsDisplay = TRUE;

    (Debido a esto, nadie va a volver a dibujar la vista automáticamente)

    Cuando se quiere redibujar, insertar esta línea:

    [glkView setNeedsDisplay];

    … entonces drawInRect rutina se llama sólo una vez.

    Espero que ayude.

    • -1. Esto es incorrecto, ajuste enableSetNeedsDisplay a NO desactiva GLKView‘s setNeedsDisplay método. Esta propiedad se establece automáticamente en NO cuando se utiliza un GLKViewController, y así es, de hecho, requiere que configurar manualmente para YES cuando dibujo en setNeedsDisplay «modo».
    • Corregido esta respuesta…

Dejar respuesta

Please enter your comment!
Please enter your name here