Mam aplikację na Androida, która dekoduje wideo do formatu yuv420p, a następnie renderuje klatki wideo za pomocą OpenGLES. Używam glTexSubImage2D() do przesłania bufora y/u/v do GPU, a następnie wykonaj konwersję YUV2RGB za pomocą modułu cieniującego. Cały kod instalacji/renderowania EGL/OpenGL jest natywnym kodem.Wydajność slow glTexSubImage2D na Nexusie 10/Androidzie 4.2.2 (Samsung Exynos 5 w/Mali-T604)
Nie mówię, że nie ma problemu z moim kodem, ale biorąc pod uwagę ten sam kod działa perfekcyjnie na iOS (iPad/iPhone), Nexus 7, Kindle HD 8.9, Samsung Note 1 i kilka innych tanich chińskich tablety (A31/RockChip 3188) z systemem Android 4.0/4.1/4.2. Powiedziałbym, że jest mniej prawdopodobne, że mój kod jest błędny. Na tych urządzeniach glTexSubImage2D() używa mniej niż 16 ms, aby przesłać teksturę SD lub 720P HD.
Jednak na Nexusie 10, glTexSubImage2D(), potrzeba około 50 ~ 90 ms dla tekstury SD lub 720P HD, która jest o wiele za wolna dla wideo 30 klatek na sekundę lub 60 klatek na sekundę.
Chciałbym wiedzieć
1) Jeśli miałbym wybrać inny format tekstury (RGBA lub BGRA). Czy istnieje sposób na wykrycie, który z najlepszych formatów tekstury jest wykorzystywany przez GPU?
2) jeśli jest funkcja wyłączona dla wszystkich innych SOC, ale ustawiona na "WŁ." Na Exynos 5. Na przykład, automatyczna opcja generowania MIPMAP. (Mam go wyłączyć, btw)
3) jeżeli jest to znany problem z Samsung Exynos SOC - Nie mogę znaleźć forum wsparcia dla procesora Exynos
4) Czy istnieje opcja muszę ustawić kiedy konfigurujesz powierzchnię EGL? jak, przejrzystość, format powierzchni, itp? (Nie mam pojęcia, o czym mówię)
5) Mogłoby to oznaczać, że GPU dokonuje niejawnej konwersji formatu, ale ja sprawdziłem, czy GL_LUMINANCE jest zawsze używany. Znowu działa na wszystkich innych platformach.
6) coś jeszcze?
Moja EGL config:
const EGLint attribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_NONE
};
konfiguracja początkowa:
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, ctx->frameW, ctx->frameH, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL); /* also for U/V */
późniejsze zamienne częściowy:
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, ctx->frameW, ctx->frameH, GL_LUMINANCE, GL_UNSIGNED_BYTE, yBuffer); /*also for U/V */
usiłuję renderowanie wideo na ~ 30FPS lub ~ 60fps w SD lub rozdzielczość 720P HD.
Rozważmy 'SurfaceTexture' dla Androida> 11: http://developer.android.com/reference/android/graphics/SurfaceTexture.html – Jave
Dzięki, ale nadal chciałby dowiedzieć się, dlaczego glTexSubImage2D() jest wolna od I nie chcesz utrzymywać wielu ścieżek kodu - działa tylko dla wszystkich z wyjątkiem Exynos –
Zaobserwowaliśmy ten sam (lub bardzo podobny) problem i zgłosiliśmy go na https://code.google.com/p/android/issues/detail?id = 53135, ale wydaje się, że jest to regresja między 4.2.1 a 4.2.2 na podstawie naszych testów. – chuoling