2011-10-20 22 views
6

Po zmianie rozmiaru o GLKView następuje kilka operacji za kulisami, które mają miejsce w buforach i kontekście tego GLKView. Podczas wykonywania tych operacji poza sceną rysowanie do GLKView nie daje prawidłowych wyników.Zmiana rozmiaru szablonu GLKView

W moim scenariuszu mam GLKView że ma setNeedsDisplay włączone, tak że w każdej chwili muszę zaktualizować jego zawartość na ekranie, po prostu zadzwoń -setNeedsDisplay na tym GLKView. Używam GLKView do rysowania obrazów, więc jeśli potrzebuję narysować obraz o innym rozmiarze, muszę również zmienić rozmiar GLKView.

Problem: Po zmianie rozmiaru GLKView i wywołaniu setNeedsDisplay w tym widoku wynik na ekranie jest nieprawidłowy. Dzieje się tak dlatego, że GLKView nie kończy operacji za kulisami wywołanych zmianą nowego rozmiaru, zanim spróbuje narysować nowy obraz.

Znalazłem do tego obejście, dzwoniąc pod numer: performSelector:@selector(setNeedsDisplay) withObject:nil afterDelay:0 zamiast po prostu setNeedsDisplay na GLKView. To zasadniczo zmusza główny wątek do oczekiwania na zakończenie wszystkich otwartych operacji OpenGL przed wywołaniem setNeedsDisplay. Chociaż działa to dobrze, zastanawiam się, czy istnieje lepsze rozwiązanie. Na przykład, czy istnieje wywołanie openGL, aby wątek oczekiwał na zakończenie wszystkich operacji OpenGL przed kontynuowaniem?

Odpowiedz

9

Rozwiązaniem było zresetowanie obiektu CIContext po zmianie rozmiaru obiektu GLKView.
Dzięki za nic, wszyscy!

+2

Mogę Cię przytulić – dxb

+0

Jak to zresetowałeś? Odtworzenie go od zera? Czy istnieje konkretna metoda wywoływania. – flainez

+1

W moim przypadku po zmianie rozmiaru ustawiłem mój obiekt 'CIContext' w następujący sposób:' ci_context = [kontekst CIContextWithEAGLContext: glkView.context] ', a następnie wywołanie' [wyświetlacz glkView] '. Zauważ, że to było dawno temu i nie dążyłem do nauki o tym, więc nie zakładaj, że to właściwe podejście. – spybart