Ich habe eine Android-App, die Video in yuv420p Format decodiert dann Video-Frames mit OpenGLES rendert. Ich benutze glTexSubImage2D() um y/u/v Puffer auf GPU hochzuladen und dann eine YUV2RGB Konvertierung mit Shader durchzuführen. Der gesamte EGL/OpenGL-Setup-/Rendering-Code ist systemeigener Code.Slow glTexSubImage2D Leistung auf Nexus 10/Android 4.2.2 (Samsung Exynos 5 w/Mali-T604)
Jetzt sage ich nicht, es gibt kein Problem mit meinem Code, aber in Anbetracht der gleichen Code läuft perfekt auf iOS (iPad/iPhone), Nexus 7, Kindle HD 8.9, Samsung Note 1 und ein paar andere billige Chinesisch Tablets (A31/RockChip 3188) mit Android 4.0/4.1/4.2. Ich würde sagen, dass es weniger wahrscheinlich ist, dass mein Code falsch ist. Auf diesen Geräten verwendet glTexSubImage2D() weniger als 16 ms zum Hochladen einer SD- oder 720P-HD-Textur.
Allerdings benötigt glTexSubImage2D() auf Nexus 10 etwa 50 ~ 90ms für eine SD- oder 720P HD-Textur, die für ein 30fps oder 60fps Video viel zu langsam ist.
Ich mag
1) wissen, ob ich ein anderes Textur-Format (RGBA oder BGRA) holen soll. Gibt es eine Möglichkeit zu erkennen, welches das beste Texturformat ist, das von einer GPU verwendet wird?
2) wenn es eine Funktion gibt, die bei allen anderen SOCs "AUS" ist, aber auf Exynos 5 auf "EIN" gesetzt ist. Zum Beispiel die automatische MIPMAP-Generierungsoption. (Ich habe das Ganze abzurunden, btw)
3), ob dies ein bekanntes Problem von Samsung Exynos SOC ist - ich nicht ein Support-Forum für Exynos CPU
4) Gibt es eine Möglichkeit, die ich brauche finden einstellen wenn die EGL-Oberfläche konfiguriert wird? wie, Transparenz, Oberflächenformat, etc? (Ich habe keine Ahnung worüber ich spreche)
5) Es könnte bedeuten, dass GPU eine implizite Formatkonvertierung durchführt, aber ich habe überprüft, dass GL_LUMINANCE immer verwendet wird. Wieder funktioniert es auf allen anderen Plattformen.
6) noch etwas?
Meine 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
};
Ersteinrichtung:
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, ctx->frameW, ctx->frameH, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL); /* also for U/V */
anschließende Teilersatz:
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, ctx->frameW, ctx->frameH, GL_LUMINANCE, GL_UNSIGNED_BYTE, yBuffer); /*also for U/V */
ich bei ~ 30 FPS oder ~ 60 FPS auf SD zu machen Video versuche oder 720P HD-Auflösung.
Betrachten Sie die "SurfaceTexture" für Android> 11: http://developer.android.com/reference/android/graphics/SurfaceTexture.html – Jave
Danke, aber ich möchte immer noch herausfinden, warum glTexSubImage2D() ist langsam seit ich möchte keinen Mehrfachcodepfad beibehalten - funktioniert für alle außer Exynos –
Wir haben das gleiche (oder sehr ähnliche) Problem beobachtet und es unter https://code.google.com/p/android/issues/detail?id gemeldet = 53135, aber es scheint eine Regression zwischen 4.2.1 und 4.2.2 basierend auf unseren Tests zu sein. – chuoling