Question

Je lisais le dernier billet de blog de Larry Osterman sur a débogué un problème de scintillement dans le contrôle du volume de Windows Vista / 7 et je me suis soudain rendu compte que je ne me souvenais pas avoir jamais vu un scintillement d'application sur mon ordinateur portable OS X. Même les applications qui semblent autrement mal écrites évitent le problème de scintillement dans mon expérience. Sans que cela devienne un débat Apple vs Windows (s'il vous plaît), pourquoi les applications OS X ne semblent pas avoir le même problème de scintillement ?

J'ai du mal à croire que les développeurs Apple sont tout simplement géniaux pour la programmation d'interfaces graphiques sans scintillement, alors que les programmeurs Windows craignent, alors quelle est la raison? L'API OS X nécessite-t-elle que toutes les interfaces graphiques mettent en œuvre une double mise en mémoire tampon? Alors que certaines applications ont un comportement de redimensionnement à double tampon légèrement lent, de nombreuses autres ne le font pas et évitent toujours le scintillement. Le flux de repeinte d'OS X est-il fondamentalement différent de Windows, ce qui évite complètement le problème WM_ERASEBKGRND ? Ou y a-t-il une autre possibilité que je ne vois pas?

Mise à jour: Merci pour vos réponses. J'aimerais pouvoir sélectionner les réponses de ken et de cb160, car elles sont toutes les deux utiles.

Était-ce utile?

La solution

Windows Vista / 7 et OSX utilisent tous deux des moteurs de composition pour dessiner des bitmaps pixellisés à l'écran. Ces moteurs de composition sont responsables du traitement de la sortie de toutes les fenêtres et du dessin de la dernière image à l’écran. Cette approche de la composition permet à OSX d’utiliser l’effet de génie lorsqu’il est réduit au minimum au quai et à la façon dont aero dessine les bordures translucides. Ils empêchent également le scintillement, car si le bitmap remplissant une zone particulière de l'écran n'est pas disponible, il utilisera l'image qu'il a déjà plutôt que de dessiner une région vide.

OSX dispose d’un moteur de composition depuis sa première livraison. À l'époque, beaucoup de gens pensaient que c'était une folie, car toutes les cartes vidéo fournies à l'époque étaient optimisées pour dessiner des bitmaps (c'est-à-dire des boutons et des bordures de fenêtres) et non des images composites. Dans les versions ultérieures d’OSX, la composition était transmise au GPU (dans Quartz Extreme), ce qui allégeait considérablement la charge du processeur et rendait possible davantage d’effets.

Etant donné que le compositeur Windows n’a été ajouté que sous Windows Vista et qu’il n’existait qu'un GPU et que vous disposiez de la bonne version du système d’exploitation, il n’est pas aussi puissant que le compositeur Quartz dans OSX. Le compositeur n'étant pas toujours utilisé dans Windows, un scintillement se produira lorsqu'une région est masquée et que l'application responsable du dessin n'est pas en mesure de redessiner assez rapidement la région.

Autres conseils

Mac OS X possède des fenêtres à double tampon .

Vous n'avez rien à faire pour y arriver. C'est dans les coulisses.

Vous (presque toujours) ne dessinez pas explicitement une fenêtre dans Cocoa lorsque quelque chose change, vous invalidez une région de la fenêtre. La structure descendra plus tard dans la hiérarchie des vues et dessinera les zones modifiées de la fenêtre dans un tampon secondaire. Ensuite, il échange les tampons.

Vous pouvez éventuellement faire des promesses permettant au framework de prendre des raccourcis lors du redessinage, mais ils sont tous optionnels. Seules les vues intelligentes sont affectées.

Si votre sous-classe de NSView implémente la méthode isOpaque pour renvoyer YES, la structure ne supprimera jamais rien derrière votre vue ni ne dessinera aucune de ses vues.

L'implémentation de preserveesContentDuringLiveResize pour renvoyer YES vous confère des responsabilités supplémentaires, mais peut améliorer les performances lors du redimensionnement de la fenêtre.

10.6 a ajouté deux nouvelles API de ce type, layerContentsRedrawPolicy et layerContentsPlacement .

Enfin, le dessin personnalisé est moins courant que sous Windows. La majorité des vues que vous voyez sont fournies par la structure et non pas classées. Cadre fourni signifie optimisé par pomme.

Oui, tout est mis en mémoire tampon automatiquement. Bien sûr, si vous courez code hérité de Mac OS 9, ou le code porté de Windoze, cela signifie que vous êtes probablement triple tamponnage sans le savoir. Hé, les cycles ne coûtent pas cher!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top