2015-10-09 12 views
7

Mam problem z UIWebView i uruchamianiem gier HTML 5 (nad którym pracuje inny programista). Wypróbowaliśmy dwie różne opcje, a żadna nie jest optymalna.Gra UIWebView HTML 5 Powolność rysowania na płótnie w iOS 9 lub awaria WebGL w iOS 8.0 i powyżej

Opcja 1: renderuje grę HTML 5 za pomocą "rysunku na płótnie". Kiedy robi to w ten sposób, nic się nie zawiesza, jednak w iOS 9, gdy wracamy do aplikacji z tła, widok w sieci ładuje się z powrotem, ale gra porusza się znacznie wolniej niż zwykle (problem nie dotyczy systemu iOS 7.1 i nowszych wersji) . O wiele wolniej mówię o tym, że animacje nie poruszają się z tą samą prędkością, jaką były, kiedy po raz pierwszy wczytaliśmy grę. Dziwne jest to, że nawet jeśli użytkownik otworzy inną grę HTML 5 (dodajemy wiele gier), animacje są wolniejsze w tej grze. Próbowałem zwolnić kontroler Web View, gdy publikowane jest zgłoszenie UIApplicationWillResignActiveNotification. Kiedy ustawię grę w ten sposób, spowolnienie nastąpi tylko wtedy, gdy aplikacja będzie dostępna przez 4 sekundy (to bardzo dziwne).

Opcja 2: Odtwarza grę za pomocą "WebGL". Kiedy pokazuje to w ten sposób, aplikacja ulega awarii, gdy aplikacja zostanie uruchomiona w tle w systemie iOS 8.0 lub nowszym. Moje badania nad awarią polegają na tym, że iOS nie może narysować OpenGL ES w tle. Zakładam, że komendy WebGL uruchamiają podobne polecenia, jak zrobiłby to OpenGL ES, a więc awaria. Odrzucenie kontrolera Web View na UIApplicationWillResignActiveNotification nadal powoduje awarię.

Czy ktoś jeszcze kiedykolwiek miał do czynienia z taką sytuacją?

Odpowiedz

2

Nie znalazłem dobrego rozwiązania problemu, ale znalazłem pracę.

Po wyświetleniu komunikatu Aktywna rezygnacja z aplikacji usuwam UIWebView z podglądu interfejsu UIWebViewController. Kiedy otrzymam komunikat Czy Become Active, dodaję UIWebView do podglądu UIWebViewController.

To rozwiązanie działa w obu przypadkach.

+0

Z tego powodu można było wywołać zdarzenia JavaScript, które zatrzymują i ponownie uruchamiają animację, więc tak się nie dzieje podczas korzystania z metody OpenGL ES –

+0

Jednym z rozwiązań, które próbowaliśmy było wstrzymać grę (przez wywołanie funkcji JavaScript w sieci widok). Ta funkcja wyświetli ekran pauzy. Kiedy próbowaliśmy tego rozwiązania, te same problemy miały miejsce. –

+0

Tak, jeśli wyświetlisz ekran pauzy, nadal możesz uruchomić pętlę rysowania po prostu rysując ekran pauzy. Próbowałem powiedzieć, żeby zbudować pętlę rysowania za pomocą 'setTimeout() ;, wtedy możesz umieścić metodę pauzy, która wywołuje' clearTimeout(); 'a twoje CV wywołuje twoją metodę rysowania, która na końcu używa'. setTimeout' jednak bez testowania to cała teoria oparta na moim doświadczeniu. :) Nie mówię, żeby użyć tego, ale mam implementację wywołania Draw w 2D przy użyciu zarządzania deltaTime i timeout http://650h.rs/1R1f1uv –