app9bergamo.com

  

Beste Artikel:

  
Main / Wann wird prepareopengl aufgerufen?

Wann wird prepareopengl aufgerufen?

OpenGL war in macOS 10 veraltet. Verwenden Sie stattdessen das Metal-Framework, um Hochleistungscode auf GPUs zu erstellen. Siehe Metall. Ein Rendering-Kontext ist ein Container für Statusinformationen. Die eigentlichen Zeichenflächen gehören niemals dem Renderkontext, sondern werden nach Bedarf erstellt, wenn der Renderkontext tatsächlich an ein zeichnbares Objekt angehängt wird.

Sie können denselben Zeichenflächen mehrere Renderkontexte hinzufügen. Jeder Kontext behält seinen eigenen Zeichenstatus bei. Zeichnen in ein Fenster oder eine Ansicht, Zeichnen in den Vollbildmodus und Zeichnen außerhalb des Bildschirms zeigen, wie Sie einen Renderkontext erstellen und an ein zeichnbares Objekt anhängen. In diesem Kapitel werden erweiterte Möglichkeiten zur Interaktion mit Rendering-Kontexten beschrieben.

Eine Rendereränderung kann auftreten, wenn der Benutzer ein Fenster von einer Anzeige zur anderen zieht oder wenn eine Anzeige angehängt oder entfernt wird. Geometrieänderungen treten auf, wenn sich der Anzeigemodus ändert oder wenn die Größe eines Fensters geändert oder verschoben wird.

Eine Anwendung, die eine benutzerdefinierte Ansicht für den Renderkontext erstellt, muss die entsprechenden Systemereignisse verfolgen und den Kontext aktualisieren, wenn sich die Geometrie oder Anzeige ändert. Durch das Aktualisieren eines Renderkontexts werden Änderungen der Geometrie gemeldet. Der Inhalt wird nicht gelöscht. Durch Aufrufen einer Aktualisierungsfunktion werden die angehängten zeichnbaren Objekte aktualisiert und sichergestellt, dass der Renderer für alle Änderungen am virtuellen Bildschirm ordnungsgemäß aktualisiert wird. Wenn Sie den Renderkontext nicht aktualisieren, werden möglicherweise Renderartefakte angezeigt.

Die Routine, die Sie zum Aktualisieren aufrufen, bestimmt, wie Ereignisse im Zusammenhang mit Renderer- und Geometrieänderungen behandelt werden. Ihre Anwendung muss den Renderkontext nach dem Systemereignis, jedoch vor dem Zeichnen in den Kontext aktualisieren. Wenn die Größe des zeichnbaren Objekts geändert wird, möchten Sie möglicherweise einen glViewport-Befehl ausgeben, um sicherzustellen, dass der Inhalt ordnungsgemäß skaliert wird. Es ist wichtig, dass Sie die Renderkontexte nicht mehr als nötig aktualisieren.

Ihre Anwendung sollte auf Ereignisse und Benachrichtigungen auf Systemebene reagieren, anstatt jeden Frame zu aktualisieren. Sie möchten beispielsweise auf Vorgänge zum Verschieben und Ändern der Fenstergröße reagieren und Konfigurationsänderungen wie z. B. eine Änderung der Farbtiefe anzeigen. Es ist ziemlich einfach, Geometrieänderungen zu verfolgen, aber wie werden Rendereränderungen verfolgt? Hier wird das Konzept eines virtuellen Bildschirms wichtig, siehe Virtuelle Bildschirme.

Eine Änderung im virtuellen Bildschirm zeigt eine Änderung des Renderers, eine Änderung der Renderfähigkeit oder beides an. Wenn Ihre Anwendung ein Fenstergrößenänderungsereignis, ein Fensterverschiebungsereignis oder eine Anzeigeänderung erkennt, sollte sie nach einer Änderung des virtuellen Bildschirms suchen und auf die Änderung reagieren, um sicherzustellen, dass der aktuelle Anwendungsstatus alle Änderungen der Rendererfunktionen widerspiegelt. Die Nummer des virtuellen Bildschirms stellt einen Index in der Liste der virtuellen Bildschirme dar, die speziell für das für den Renderkontext verwendete Pixelformatobjekt eingerichtet wurden.

Die Nummer ist in der Liste eindeutig, ansonsten jedoch bedeutungslos. Wenn sich der Renderer ändert, können sich auch die für OpenGL verfügbaren Grenzwerte und Erweiterungen ändern. Ihre Anwendung sollte die Funktionen des Renderers erneut testen und diese verwenden, um die Rendering-Algorithmen entsprechend auszuwählen. Cocoa ruft keine Umformungsmethode für die NSView-Klasse auf, wenn sich die Größe ändert, da diese Klasse keine Umschreibungsmethode zum Überschreiben exportiert.

Stattdessen müssen Sie Umformungsvorgänge direkt in Ihrem drawRect ausführen: Listing 7-1 ist eine teilweise Implementierung einer benutzerdefinierten Ansicht, die zeigt, wie mit Kontextaktualisierungen umgegangen wird. Die Aktualisierungsmethode wird nach dem Verschieben, Ändern der Größe und Anzeigen von Änderungsereignissen sowie nach dem Aktualisieren der Oberfläche aufgerufen. Es ist etwas komplizierter, Änderungen in der Anzeigekonfiguration vorzunehmen. Diese Benachrichtigung wird immer dann veröffentlicht, wenn die Konfiguration der an den Computer angeschlossenen Anzeigen entweder programmgesteuert geändert wird oder wenn der Benutzer die Einstellungen in der Benutzeroberfläche ändert.

Ein Rendering-Kontext verfügt über eine Vielzahl von Parametern, die Sie an die Anforderungen Ihrer OpenGL-Zeichnung anpassen können. Einige der nützlichsten und häufig übersehenen Kontextparameter werden in diesem Abschnitt erläutert: Die Funktion setValues: Die Funktion CGLSetParameter verwendet als Parameter einen Renderkontext, eine Konstante, die eine Option angibt, und einen Wert für diese Option.

Einige Parameter müssen aktiviert sein, damit ihre Werte wirksam werden. Die Referenzdokumentation für einen Parameter gibt an, ob ein Parameter aktiviert werden muss. Wenn das Auslagerungsintervall standardmäßig auf 0 gesetzt ist, werden die Puffer so schnell wie möglich ausgetauscht, unabhängig von der vertikalen Aktualisierungsrate des Monitors. Wenn das Auslagerungsintervall auf einen anderen Wert eingestellt ist, werden die Puffer nur während des vertikalen Rücklaufs des Monitors ausgetauscht. Weitere Informationen finden Sie unter Mit der Bildschirmaktualisierungsrate synchronisieren.

OpenGL-Oberflächen werden normalerweise als undurchsichtig gerendert. Daher die Hintergrundfarbe für Pixel mit Alpha-Werten von 0. Wenn Sie den Wert des Oberflächenopazitätsparameters auf 0 setzen, wird der Inhalt der Oberfläche mit dem Inhalt der Oberflächen hinter der OpenGL-Oberfläche gemischt. Diese Operation entspricht einer OpenGL-Mischung mit einem Quellbeitrag proportional zum Quell-Alpha und einem Hintergrundbeitrag proportional zu 1 minus dem Quell-Alpha.

Ein Wert von 1 bedeutet, dass die Oberfläche standardmäßig undurchsichtig ist. 0 bedeutet völlig transparent. Ein Wert von 1 bedeutet, dass sich die Position über dem Fenster befindet. Ein Wert von -1 gibt eine Position an, die sich unter dem Fenster befindet.

Wenn Sie überlappende Ansichten haben und die Reihenfolge auf -1 setzen, wird OpenGL darunter gezeichnet, 1 bewirkt, dass OpenGL oben zeichnet. Dieser Parameter ist nützlich, um Steuerelemente der Benutzeroberfläche über einer OpenGL-Ansicht zu zeichnen. Mit den folgenden Konstanten können Sie angeben, dass Sie den Wert für die Oberflächenzeichnungsreihenfolge festlegen: Listing 7-5 zeigt, wie diese Parameter verwendet werden. Normalerweise hat der Rückpuffer dieselbe Größe wie das Fenster oder die Ansicht, in die er gezeichnet wird, und ändert seine Größe, wenn sich die Größe des Fensters oder der Ansicht ändert.

Wenn Sie dieses Verhalten nicht möchten, verwenden Sie den Parameter zur Steuerung der Größe des Rückpuffers. Mit diesem Parameter wird die Größe des Rückpuffers festgelegt und das System kann das Bild automatisch skalieren, wenn die Daten in einen Puffer mit variabler Größe verschoben werden (siehe Abbildung 7-1).

Die Größe des Rückpuffers bleibt auf der Größe festgelegt, die Sie eingerichtet haben, unabhängig davon, ob die Größe des Bilds so geändert wird, dass es auf dem Bildschirm größer angezeigt wird. Ein Rendering-Kontext besitzt nicht die daran angehängten Zeichnungsobjekte, sodass die Option zum Teilen offen bleibt. Renderkontexte können Ressourcen gemeinsam nutzen und an dasselbe Zeichenobjekt (siehe Abbildung 7-2) oder an verschiedene Zeichenobjekte (siehe Abbildung 7-3) angehängt werden. Sie richten die Kontextfreigabe ein - entweder mit mehr als einem zeichnbaren Objekt oder mit einem anderen Kontext -, wenn Sie einen Renderkontext erstellen.

Kontexte können Objektressourcen und den zugehörigen Objektstatus gemeinsam nutzen, indem sie zum Zeitpunkt der Kontexterstellung einen gemeinsam genutzten Kontext angeben. Freigegebene Kontexte teilen alle Texturobjekte, Anzeigelisten, Scheitelpunktprogramme, Fragmentprogramme und Pufferobjekte, die vor und nach dem Initiieren der Freigabe erstellt wurden. Der Status der Objekte wird ebenfalls freigegeben, jedoch nicht in einem anderen Kontextstatus, z. B. aktuelle Farbe, Texturkoordinateneinstellungen, Matrix- und Beleuchtungseinstellungen, Rasterisierungsstatus und Einstellungen für die Texturumgebung.

Sie müssen Kontextstatusänderungen nach Bedarf duplizieren, aber Sie müssen einzelne Objekte nur einmal einrichten. Wenn Sie einen OpenGL-Kontext erstellen, können Sie einen anderen Kontext festlegen, dessen Objektressourcen Sie freigeben möchten. Alle Freigabe erfolgt Peer-to-Peer. Freigegebene Ressourcen werden mit Referenzzählungen versehen und somit beibehalten, bis sie explizit freigegeben werden oder wenn die letzte Ressource für die gemeinsame Nutzung von Kontexten freigegeben wird. Nicht jeder Kontext kann mit jedem anderen Kontext geteilt werden.

Beide Kontexte müssen dasselbe OpenGL-Profil verwenden. Sie müssen auch sicherstellen, dass beide Kontexte denselben Satz von Renderern verwenden. Sie erfüllen diese Anforderungen, indem Sie sicherstellen, dass jeder Kontext dieselbe virtuelle Bildschirmliste verwendet, und zwar mit einer der folgenden Techniken: Erstellen Sie Objekte im Pixelformat mit Attributen, die die Auswahl auf eine einzelne Anzeige beschränken. Diese Vorgehensweise stellt sicher, dass der virtuelle Bildschirm für jedes Pixelformatobjekt identisch ist.

Das Einrichten von gemeinsam genutzten Renderkontexten ist sehr einfach. Verwenden Sie das Argument share für initWithFormat: Siehe Listing 7-7. Siehe Listing 7-8. Listing 7-7 stellt die gleiche virtuelle Bildschirmliste sicher, indem für jeden der gemeinsam genutzten Kontexte dasselbe Pixelformatobjekt verwendet wird. Listing 7-8 stellt die gleiche virtuelle Bildschirmliste sicher, indem für jeden der gemeinsam genutzten Kontexte dasselbe Pixelformatobjekt verwendet wird. Alle Rechte vorbehalten. Nutzungsbedingungen Datenschutzrichtlinie aktualisiert: Dokumentationsarchiv Entwicklersuche. Weiter zurück.

Zurückgezogenes Dokument Wichtig: NSRect frameRect pixelFormat:

(с) 2019 app9bergamo.com