2009-03-20 6 views
2

Tenir compte de l'extrait de code suivant:détails de mise en œuvre du GDI écrêtage

HRGN clip = ::CreateRectRgn(50, 50, 100, 100); 
::SelectClipRgn(context, clip); 
::Rectangle(context, 0, 0, 50, 50); 

Est-ce que la mise en œuvre de découpage de Microsoft assez intelligent pour revenir immédiatement de l'appel à Rectangle sans essayer de tirer quoi que ce soit? Je soupçonne que c'est probablement, mais ont été incapables de trouver une confirmation nulle part. La documentation MSDN pour clipping est clairsemée sous les détails de capot et recherche sur Google se présente rien, mais comment utiliser écrêtage GDI.

EDIT: Il m'est apparu que je n'ai pas réussi à faire remarquer que cela fonctionnait sous Windows Mobile, de sorte que les outils d'analyse sont limités.

Répondre

2

En fait, je retirai ma Petzold (2e édition) de l'étagère et a constaté que, sans surprise, coupure était une caractéristique importante dans les premières versions du SDK de Windows. À l'époque, il était nécessaire pour des raisons de performance de ne pas dessiner d'objets invisibles. Je dirais que l'écrêtage GDI est en fait assez intelligent et ne fera rien quand vous dessinez en dehors de la région de découpage.

0

Vous pouvez voir le code source de SelectClipRgn() (Win32 groupe api il y a, de nombreuses années, 16 ou 32 bits)

+0

Je suis assez sûr que la source de SelectClipRgn ne me dira pas comment écrêtage est en fait manipulé parce que l'écrêtage ne se produit que quand je l'appelle Rectangle. Aussi quel groupe api Win32 et il y a environ combien d'années il y a plusieurs années. –

1

tester.

Fixez votre débogueur favori (Windbg, CDB) et utilisez le WT command pour suivre les statistiques du chemin d'exécution. Compare :: Rectangle (contexte, 0, 0, 50, 50); avec :: Rectangle (contexte, 0, 0, 51, 51);

0

Mon estimation serait qu'il est juste en utilisant une simple ligne Cohen-Sutherland détourage sous le capot, bien que je ne suis pas sûr de cela. Toutefois, si vous avez beaucoup de données qui est en dehors de l'écran (et ne doit pas être établi), vous pourriez être mieux avec un algorithme d'abattage sélectif de niveau supérieur en fonction, par exemple, un Quad-tree, de sorte que vous pouvez sauter les objets tous ensemble dans une étape antérieure.