Ich habe versucht, eine Szene mit OpenGL in Objective-C für Wochen zu machen, und ich kann es einfach nicht funktionieren. Ich begann mit Drawing to an NSOpenGLView Class: A Tutorial, und das funktionierte gut für mich, und ich war sogar in der Lage, es ein wenig zu erweitern, aber der OpenGL Programming Guide hinterlässt eine Art Loch nach diesem Schritt. Sie erklären die Details zur doppelten Pufferung und Synchronisierung der Aktualisierungsraten und all das, aber sie enthalten keine konkreten Beispiele für die Aktualisierung Ihrer Ansicht. So kann ich derzeit viele coole Sachen auf den Bildschirm ziehen, aber sobald es da ist, ist es nur ein statisches Bild. Keine Bewegung, keine Drehung.
Kennt jemand eine gute, einfache Beispiel dafür, wie das eigentlich gemacht wird?Einfache OpenGL-Beispiel mit Cocoa
Antwort
Dies ist ein Problem, das ich häufig auftreten, und es überrascht mich, dass dieser entscheidende Schritt nicht Teil der NSOpenGLView ist Tutorial-Dokumentation.
Sie benötigen einen Rückruf-Timer einzurichten, um die Ansicht zu benachrichtigen, dass es neu gezeichnet werden muss:
- (void)awakeFromNib
{
NSTimer *updateTimer = [NSTimer timerWithTimeInterval:1.0f/30.0f target:self selector:@selector(idle:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:updateTimer forMode:NSDefaultRunLoopMode];
}
Beachten Sie, dass dies in awakeFromNib
passiert. Der Timer wird in einem Intervall von 1/30 ausgelöst, das Sie ändern können, wenn Sie möchten. Jedes Mal, wenn es ausgelöst wird, ruft es eine Funktion namens idle
auf. Diese Funktion kann wie so implementiert werden:
- (void)idle:(NSTimer*)timer
{
[self setNeedsDisplay:YES];
}
Dies bewirkt, dass die Ansicht, selbst jedes Update neu zu zeichnen, einschließlich Ihrer OpenGL-Grafik.
Das ist eine sehr allgemeine Frage und wie Sie schließlich die gesamte Struktur einer Rendering-Engine entwerfen können, bleibt Ihnen überlassen. Es wäre eine Menge, um Ihnen zu sagen, wie Sie das implementieren, aber es gibt viele Bücher und Tutorials online zu starten.
Ein ziemlich nettes ernstes auf, wie man langsam eine einfache Struktur passend für Spiele (in diesem Fall 2D) bildet, kann here gefunden werden, aber es ist für Win32, also würden Sie das anpassen müssen, aber vorausgesetzt, Sie haben ein allgemeines Verständnis von der Programmierung sollten Sie in der Lage sein, das allgemeine Design, das er entwickelt, zu verstehen.
Sie könnten versuchen, eine Anzeigeverbindung für wiederholtes Zeichnen zu verwenden, das mit dem Display synchronisiert wird. Stellen Sie einen bis:
GLint swapInt = 1;
[yourContext setValues:&swapInt forParameter:NSOpenGLCPSwapInterval];
CVDisplayLinkCreateWithActiveCGDisplays(&displayLink);
CVDisplayLinkSetOutputCallback(displayLink, &displayLinkCallback, self);
CGLContextObj cglContext = [yourContext CGLContextObj];
CGLPixelFormatObj cglPixelFormat = [[NSOpenGLView defaultPixelFormat] CGLPixelFormatObj];
CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext(displayLink, cglContext, cglPixelFormat);
CVDisplayLinkStart(displayLink);
Dann Ihr Rückruf wird einmal pro Rahmen:
static CVReturn displayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, const CVTimeStamp* outputTime, CVOptionFlags flagsIn, CVOptionFlags* flagsOut, void* displayLinkContext)
{
NSAutoreleasePool* pool = [NSAutoreleasePool new];
if ([self lockFocusIfCanDraw])
{
//Your drawing code
[self unlockFocus];
}
[pool drain];
return kCVReturnSuccess;
}
Was ist das IRGL-Objekt, das Sie verwenden? Apples Dokumentation scheint nicht zu wissen, was das ist. – anthropomorphic
Ist es ein Objekt, das Sie verwenden, das Ihren Kontext enthält? Ich habe verstanden, dass '[IRGL gl]' einen NSOpenGLContext (oder eine Unterklasse davon) zurückgibt, sollte ich diesen Teil einfach ignorieren? – anthropomorphic
Hoppla! Das ist meine eigene Klasse, die ich versehentlich verlassen habe. Nimm dir einfach deinen Kontext, wie du willst. Wenn Sie bereits zeichnen, müssen Sie eines haben. – andyvn22
- 1. Aktueller Spielstand mit Cocoa
- 2. Cocoa - Fehler mit XML
- 3. Cocoa-App mit nur NSSavePanel
- 4. Cocoa Audio Lautstärkeregler mit Bindings
- 5. Cocoa POST-Anfrage mit Datei
- 6. Cocoa NSWindow mit 2 Symbolleisten
- 7. Zeichnen Zielbild mit Cocoa Touch
- 8. Verbinden mit Sharepoint über Cocoa
- 9. Probleme mit NSMutableArray mit NSTableView (Cocoa)
- 10. Cocoa setAnimationDidStopSelector
- 11. Cocoa Variablendeklaration
- 12. Cocoa - NSSearchFieldDelegate Methoden heißt nicht
- 13. Wie schreibe ich eine einfache Ping-Methode in Cocoa/Objective-C
- 14. iTunes Songtitel Scrollen in Cocoa
- 15. Einfache Factory mit StructureMap
- 16. Einfache Tabellenbearbeitung mit Python
- 17. Einfache Anmeldung mit DynamoDB
- 18. einfache Numerologie mit Javascript
- 19. Einfache App mit Android
- 20. Einfache Hashtabelle mit Vektor
- 21. Einfache Anwendung mit Laravel?
- 22. Anzeigefenster mit Cocoa Framework in Xcode
- 23. Automatisches Speichern mit Cocoa und Core-Daten
- 24. Cocoa Pods mit Google Kalender api
- 25. Cocoa - NSScrollView mit großer Anzahl von Elementen
- 26. Cocoa Button, der mit der Maus über
- 27. Programmgesteuertes Abrufen des aktuellen Akkuladestands mit COCOA
- 28. Datei lesen mit Fortschrittsbalken in Cocoa
- 29. konzeptionelle oder technische Problem mit Cocoa Programmierung
- 30. Swift - Verwenden von Core-Daten mit Cocoa
Beachten Sie, dass dies keine gute Option für Hochleistungszeichnen ist; Sie sollten wirklich eine Anzeigeverbindung verwenden, um sicherzustellen, dass Sie zu den geeigneten Zeiten für Ihre Anzeige zeichnen. – andyvn22