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.
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
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
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. –