2009-09-17 12 views
9

Estaba leyendo la última publicación de blog de Larry Osterman sobre debugging a flickering problem in the Windows Vista/7 volume control, y de repente me di cuenta de que no recuerdo haber visto una aplicación parpadear en mi computadora portátil OS X. Incluso las aplicaciones que de otra manera parecen estar mal escritas evitan el problema del parpadeo en mi experiencia. Sin que esto se convierta en un debate entre Apple y Windows (por favor), ¿Por qué las aplicaciones de OS X no parecen tener el mismo problema de parpadeo?¿Por qué OS X no tiene los mismos problemas de parpadeo que Windows?

Tengo problemas para creer que los desarrolladores de Apple son simplemente increíbles en la programación de GUIs sin parpadeos, mientras que los programadores de Windows apestan, entonces, ¿cuál es el motivo? ¿La API de OS X requiere que todas las GUI implementen doble buffering? Mientras que algunas aplicaciones tienen el comportamiento de cambio de tamaño de búfer doble ligeramente lento, muchas no lo hacen, y todavía evitan el parpadeo. ¿El flujo de repintado OS X es fundamentalmente diferente de Windows, evitando por completo el problema WM_ERASEBKGRND? ¿O hay alguna otra posibilidad que no estoy viendo?

Actualización: Gracias por sus respuestas. Desearía poder seleccionar tanto las respuestas de ken como las de cb160, porque ambas son útiles.

Respuesta

9

Tanto Windows Vista/7 como OSX usan motores de composición para dibujar mapas de bits rasterizados en la pantalla. Estos motores de composición son responsables de procesar la salida de todas las ventanas y dibujar la imagen de la pantalla final. Este enfoque de composición es cómo OSX puede usar el efecto de genio cuando se minimiza en el dock y cómo aero dibuja los bordes translúcidos. También evitan el parpadeo, como si el mapa de bits para llenar un área particular de la pantalla no estuviera disponible, usará la imagen que ya tiene en lugar de dibujar una región en blanco.

OSX ha tenido un motor de composición desde su primer envío.En ese momento, muchas personas pensaban que era una aplicación loca ya que todas las tarjetas de video que se enviaban en ese momento se optimizaban para dibujar bitmaps (es decir, botones y bordes de Windows) y no imágenes compuestas. En versiones posteriores de OSX, la composición se desplazó a la GPU (en Quartz Extreme) y, por lo tanto, quitó mucha carga de la CPU e hizo posibles más efectos.

Debido a que el compositor de Windows solo se agregó en Windows Vista y solo cuando había una GPU disponible y tenía la versión correcta del SO, no es tan penetrante como el Quartz Compositer en OSX. Debido a que el compositor no siempre se utiliza en Windows, el parpadeo se producirá cuando una región esté en blanco y la aplicación responsable del dibujo no pueda volver a dibujar la región lo suficientemente rápido.

16

Mac OS X tiene double buffered windows.

No tiene que hacer nada para que esto suceda. Está detrás de escena.

Usted (casi siempre) no dibuja explícitamente una ventana en Cocoa cuando algo cambia, invalida una región de la ventana. El marco descenderá posteriormente a la jerarquía de vistas y dibujará las regiones sucias de la ventana en un buffer secundario. Luego intercambia los buffers.

De forma opcional, puede hacer algunas promesas que le permitan a la estructura tomar accesos directos al volver a dibujar, pero todas son opt-in. Solo las vistas inteligentes se ven afectadas.

Si su subclase de NSView implementa el método isOpaque para devolver SÍ, entonces el marco nunca borrará nada detrás de su vista ni dibujará ninguna de las vistas debajo de él.

Implementar preservesContentDuringLiveResize para devolver SÍ le da algunas responsabilidades adicionales, pero puede mejorar el rendimiento durante el cambio de tamaño de la ventana.

10.6 agregaron otras dos nuevas API de este tipo, layerContentsRedrawPolicy y layerContentsPlacement.

Por último, el dibujo personalizado es menos común que en Windows. La mayoría de las vistas que ve son provistas por el marco y no subclasificadas. El suministro del marco significa optimizado por manzana.

1

Sí, todo es de doble amortiguación automágicamente. Por supuesto, si está ejecutando código heredado de mac os 9, o código portado desde windoze, eso significa que usted es probablemente triple buffer sin saberlo. ¡Oye, los ciclos son baratos!

Cuestiones relacionadas