2015-02-17 9 views
25

Mam aplikację utworzoną za pomocą LibGDX. Mogę uruchomić aplikację na pulpicie i działa z prędkością 90 fps @ 1080p.WebGL i Chrome: wysoka rozdzielczość powoduje niską wydajność

W przeglądarce Firefox działa z szybkością 40-50 fps @ 1080p (zmaksymalizowane okno).

W przeglądarce Chrome działa z szybkością 30 klatek na sekundę przy 1080p (zmaksymalizowane okno).

Jednak w Chrome, jeśli obniżę rozdzielczość, wydajność podwaja się (do 60 klatek na sekundę). W Firefoksie tak się nie dzieje. Co może być tego przyczyną?

Używam webkitRequestAnimationFrame.

Jak pokazano, wiem, że mój komputer może obsłużyć wysoką rozdzielczość.

Edit

Próbuję zastosować poniższe wskazówki, chociaż wydają na celu głównie mobilnych procesorów graficznych.

Źródło: https://wiki.mozilla.org/Platform/GFX/MobileGPUs#Memory_Bandwidth

Zawsze zadzwonić glClear natychmiast po glBindFramebuffer

Zobacz Adreno 200 dokument, sekcja 3.2.1: „konieczne jest, aby (a) stosowanie czyści podczas przełączania obiektów bufora ramki (FBO), aby uniknąć sytuacji, w której kierowca próbuje zapisać/przywrócić zawartość GMEM oraz (b) zawsze kasuje bufor głębi na początku ramki. "

To ma sens, więc zawsze powinniśmy to robić. Konkretnie oznacza to, że powinniśmy wykonać glClear po każdym wywołaniu glBindFramebuffer, najlepiej zaraz po nim lub przynajmniej przed każdym wywołaniem.

Bufor ramki wiązania są drogie

Zmiana sił wiązania Bufor ramki bezpośrednio rozdzielanie renderowania bieżącego bufora ramki. Dlatego ważne jest sortowanie renderowania, aby zminimalizować wiązania bufora ramki. Dokument Adreno 200, Rozdział 3.2.4, ma użyteczne wytłumaczenie.

Edit

Powyższe nie popełniła zauważalna różnica.

Edit

Mam wrażenie, problem ten powstaje w wyniku kompilator GLSL. Nie mam zbyt dużo wiedzy na ten temat, ale uważam, że GLSL dla OpenGL ES jest skompilowany do zwykłego GLSL, z pewnym kodem specyficznym dla przeglądarki. Możliwe, że Chrome kompiluje mniej niż optymalnie i powoduje cieniowanie fragmentów, aby spowolnić program w wyższych rozdzielczościach.

Jeśli ktoś ma kilka wskazówek, jak upewnić się, że ta kompilacja jest zoptymalizowana, mogę spróbować i sprawdzić, czy to rozwiązuje problem.

Edit

Problem nie wydaje się powszechne w Chrome na Windows z Intel HD Graphics 4000 + chipset. Wersja Chrome: 40.0.2214.111 m. Niska rozdzielczość: 45 fps ~.Wysoka rozdzielczość: stabilne 30 klatek na sekundę.

Mój oryginalny test był z Chrome na Ubuntu z GTX 650. Wersja Chrome zostanie dodana później.

Edit

wersji Chrome, który wyświetla ten problem: 40.0.2214.111 (64-bit) na Ubuntu na karcie graficznej GTX 650.

Edit

na tym samym komputerze z GTX 650, w systemie Windows 7, sama aplikacja działa w ramach stałych 60fps Chrome. Ponieważ pod Ubuntu aplikacja skompilowana na Javę działa dobrze na 90 fps, uważam, że nie może to być problem ze sterownikiem Linuxa, ale raczej jest to problem z linuksową wersją Chrome.

Edit

Wysłałem wypełnienie i wysłanie do Chrome na ten temat.

+0

Czy próbowałeś porównać chrome: // gpu/z Linuksa i Windowsa, aby sprawdzić, czy mają różne wykryte problemy? Ponadto sprawdź, czy Chrome/Ubuntu obsługuje akcelerację sprzętową. Ponadto sprawdza, czy problem w Chrome/Ubuntu jest w rzeczywistości renderowaniem. Może jest to coś w innej części kodu. Chciałbym zasugerować, może to dobry pomysł, aby wysłać wiadomość e-mail na [listę dyskusyjną Khronos Group na temat WebGL] (https://www.khronos.org/webgl/public-mailing-list/). – wendelbsilva

+1

Czy wywołujesz 'gl.getError()' lub 'gl.readPixels' w pętli renderowania? Obaj zabiją perf. Czy przesyłasz duże ilości danych (np. Wideo)? Ogólnie rzecz biorąc, wolisz WebGL wolniej niż natywnie, ponieważ płótna WebGL są połączone na stronie internetowej. Aby uzyskać pełnoekranowe płótno, które jest dodatkowym pełnym ekranem. Oprócz tego requestAnimationFrame jest ograniczona do 60 fps (lub częstotliwości odświeżania monitora). Jeśli chcesz sprawdzić czas, powinieneś sprawdzić ile użyto milisekund lub opuścić każdą ramkę, nie ile klatek na sekundę, ponieważ monitor nie może ich wyświetlić. – gman

+2

W systemie Windows WebGL używa DirectX i transpiled HLSL shaderów w ramach projektu [ANGLE] (https://code.google.com/p/angleproject/). Spróbuj uruchomić Chrome z flagą '--use-gl = desktop' (bez wcześniejszych wystąpień Chrome) i sprawdź, czy występują takie same problemy z wydajnością. Również bez podania jakichkolwiek informacji o tym, co robi twoja aplikacja pod względem renderowania tego pytania, nie można go odzyskać. Zastanów się nad dodaniem linku do zgłoszenia błędu, ponieważ może to pomóc innym. –

Odpowiedz

1

Nie obejmuje innych rzeczy w tutaj, o ile mi było do niego ostatni raz, wszystkie te metody requestAnimationFrame są ograniczone do 60fps, a może tylko zejść niżej niż to.

Można go przetestować z tym bitem: http://cssdeck.com/labs/gvxnxdrh/. Możesz zmodyfikować plik fps var tak wysoko, jak chcesz, ale animacja nie będzie działać szybciej niż 60 klatek na sekundę w dowolnej przeglądarce na moim komputerze.

+0

Nie mam nic wspólnego z VSync. Z jakiegoś powodu Chrome po prostu nie lubi aktualizować systemu Windows w wysokiej rozdzielczości. Jeśli mam zmaksymalizowane okno, jest to 20 klatek na sekundę. Zmaksymalizowane okno o połowę rozdzielczości, wciąż 20 fps. Jeśli jednak zmniejszę okno do połowy, zwiększa to ogromnie liczbę klatek na sekundę. Firefox nie wyświetla tego problemu. – RobotRock

+0

Nie można odtworzyć tego zachowania ... Rozdzielczość Wat/rozmiar okna zaczyna się łamać w chrome? – yergo

+0

Liczba klatek na sekundę jest zmienna z rozmiarem okna (rozdzielczość), gdy masz ograniczoną liczbę GPU. Zdarza się to w jednej przeglądarce, a nie w drugiej, głównie z powodu implementacji OpenGL. Jeśli chodzi o częstotliwość requestAnimationFrame ... zależy to od szybkości procesora i GPU (zobacz narzędzia programistyczne w przeglądarce, F12, aby określić, które powoduje dławienie). Btw, FPS nie jest ograniczony do 60. Nie jestem pewien, czy istnieje limit, widziałem, jak działa na poziomie 75 na wysokiej klasy komputerze – DAG