Android Java/Unity Graphic Interference

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
marcgfx
Establishment
Beiträge: 2050
Registriert: 18.10.2010, 23:26

Android Java/Unity Graphic Interference

Beitrag von marcgfx »

Ich untersuche seit Tagen einen beschissenen Bug in der Android-Version von sfäre. Ich habe ein MP4 Plugin in Java erstellt. Das Plugin läuft wunderbar durch und erstellt das gewünschte Video. Es wird sogar noch die Share-Funktion ausgelöst bevor alles abschmiert.

Der Workflow um das Problem zu finden war relativ beschissen, weil ich es einfach nicht besser weiss. Code anpassen, Java Modul erstellen, in Unity einfügen. Build erstellen und einige Minuten warten. Testen. Absturz Ja/Nein? Repeat.

Jedenfalls habe ich den Code identifiziert der den Absturz provoziert, aber nicht selber abstürzt. Meine starke Vermutung ist dass ich Unity's Graphik Engine beeinträchtige, da es kurz nach Beenden des Plugins zu einer null-Pointer Exception in einem Blit kommt.

Der böser Code mit dem bösen Aufruf "GLES20.glGenTextures" zu dem ich nirgends eine ausführliche Dokumentation gefunden habe. Überhaupt tue ich mich sehr schwer mit der Android Java Dokumentation. "glGenTextures" hat einne Offset Parameter an 3ter Stelle und ich weiss bis jetzt nicht für was der Gut ist. Ich habe mal 8 eingesetzt, einfach zum sehen was passiert. Absturz war das Resultat.

Code: Alles auswählen

    public static int loadTexture(int frameIndex)//final String path, final int resourceId)
    {
        Inform("Load Texture "+frameIndex);
        if (textureHandle[0] == 0) {
            GLES20.glGenTextures(1, textureHandle, 0);

            if (textureHandle[0] == 0)
            {
                throw new RuntimeException("Error loading texture.");
            }
            Log.d(TAG, "*** loadTexture");
        }
Log

Code: Alles auswählen

2021-02-12 16:35:10.832 27412-27452/space.spherience.app D/AndroidMP4: *** Finally -> Release Resources
2021-02-12 16:35:10.833 27412-27452/space.spherience.app D/AndroidMP4: *** Completed
2021-02-12 16:35:10.842 27412-27452/space.spherience.app D/Unity: NativeCrashSerializer::EndReport() Success!
2021-02-12 16:35:10.900 27412-27452/space.spherience.app E/CRASH: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2021-02-12 16:35:10.900 27412-27452/space.spherience.app E/CRASH: Version '2019.4.5f1 (81610f64359c)', Build type 'Development', Scripting Backend 'il2cpp', CPU 'armeabi-v7a'
2021-02-12 16:35:10.901 27412-27452/space.spherience.app E/CRASH: Build fingerprint: 'Ulefone/S10_Pro/S10_Pro:8.1.0/O11019/1531272594:user/release-keys'
2021-02-12 16:35:10.901 27412-27452/space.spherience.app E/CRASH: Revision: '0'
2021-02-12 16:35:10.901 27412-27452/space.spherience.app E/CRASH: ABI: 'arm'
2021-02-12 16:35:10.901 27412-27452/space.spherience.app E/CRASH: Timestamp: 2021-02-12 16:35:10+0100
2021-02-12 16:35:10.901 27412-27452/space.spherience.app E/CRASH: pid: 27412, tid: 27452, name: UnityMain  >>> space.spherience.app <<<
2021-02-12 16:35:10.901 27412-27452/space.spherience.app E/CRASH: uid: 10128
2021-02-12 16:35:10.901 27412-27452/space.spherience.app E/CRASH: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x8
2021-02-12 16:35:10.901 27412-27452/space.spherience.app E/CRASH: Cause: null pointer dereference
2021-02-12 16:35:10.901 27412-27452/space.spherience.app E/CRASH:     r0  00000000  r1  c73fe38c  r2  00000000  r3  c73fe440
2021-02-12 16:35:10.901 27412-27452/space.spherience.app E/CRASH:     r4  00000002  r5  00000001  r6  00000000  r7  c73fe338
2021-02-12 16:35:10.901 27412-27452/space.spherience.app E/CRASH:     r8  c560ce00  r9  c73fe474  r10 00000000  r11 c5613654
2021-02-12 16:35:10.901 27412-27452/space.spherience.app E/CRASH:     ip  00001c20  sp  c73fe2f0  lr  d616b29f  pc  d616df56
2021-02-12 16:35:10.902 27412-27452/space.spherience.app E/CRASH: backtrace:
2021-02-12 16:35:10.902 27412-27452/space.spherience.app E/CRASH:       #00 pc 0001ef56  /vendor/lib/egl/libGLESv2_mtk.so (BuildId: ae12ce3a4e7b403abac7c914598112db)
2021-02-12 16:35:10.902 27412-27452/space.spherience.app E/CRASH:       #01 pc 0001b0b5  /vendor/lib/egl/libGLESv2_mtk.so (BuildId: ae12ce3a4e7b403abac7c914598112db)
2021-02-12 16:35:10.902 27412-27452/space.spherience.app E/CRASH:       #02 pc 0001abff  /vendor/lib/egl/libGLESv2_mtk.so (glDrawElements+54) (BuildId: ae12ce3a4e7b403abac7c914598112db)
2021-02-12 16:35:10.903 27412-27452/space.spherience.app E/CRASH:       #03 pc 0097dae4  /data/app/space.spherience.app-o-cNgmVxbD4zUdgZ0hkD5g==/lib/arm/libunity.so (BlitFramebufferImpl(gles::BlitFramebufferDrawQuad&, GfxDevice&, TextureID, Vector4f const&)+388) (BuildId: e01983c489f2c1e98347e01e9a1a966c9737edfa)
2021-02-12 16:35:10.903 27412-27452/space.spherience.app E/CRASH:       #04 pc 0097de64  /data/app/space.spherience.app-o-cNgmVxbD4zUdgZ0hkD5g==/lib/arm/libunity.so (BlitFramebuffer::BlitTexture(TextureID)+68) (BuildId: e01983c489f2c1e98347e01e9a1a966c9737edfa)
2021-02-12 16:35:10.903 27412-27452/space.spherience.app E/CRASH:       #05 pc 008b04d3  /data/app/space.spherience.app-o-cNgmVxbD4zUdgZ0hkD5g==/lib/arm/libunity.so (ContextGLES::BlitToCurrentFB(ContextGLES::ExternalAndroidFBO&, unsigned int, unsigned int)+310)
Wenn einer ne Idee hat :) ...
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: Android Java/Unity Graphic Interference

Beitrag von xq »

Meine Vermutung: Da man in Java/.NET keine Pointer-Offsets auf Arrays machen kann, gehe ich davon aus, dass das hier im Hintergrund passiert und du damit einfach den Start-Index im textureHandles-Array angibst. Wenn du da 8 angibst, knallt das natürlich mit nem speicherzugriffsfehler (oder auch nicht und macht alles viel schlimmer).

Ist aber auch nur ne Vermutung, die Android-Doku schweigt sich ja dazu aus.
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Benutzeravatar
marcgfx
Establishment
Beiträge: 2050
Registriert: 18.10.2010, 23:26

Re: Android Java/Unity Graphic Interference

Beitrag von marcgfx »

Die fehlende Dokumentation ist schon richtig übel. Das ich nicht wirklich verstehe was schief geht und wie ich es lösen könnte, macht es noch schlimmer. Bin kurz davor das Handtuch zu werfen, ist ja vielleicht eh ein nutzloses Feature das mich bis jetzt einfach Tage gekostet hat. Anscheinend haben neuere Geräte sowieso eine Record-Funktion was meine Arbeit sowieso in Frage stellt.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4254
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Android Java/Unity Graphic Interference

Beitrag von Chromanoid »

Nimm doch die Variante ohne Offset-Parameter? Eigentlich müssten die Funktionen doch ziemlich direkt auf die Spec gehen. Sehr merkwürdig.

Das hier gesehen?: https://github.com/LWJGL/lwjgl3/issues/304 (könnte mir vorstellen, dass es eine ähnliche Fehlerursache hat)
Benutzeravatar
marcgfx
Establishment
Beiträge: 2050
Registriert: 18.10.2010, 23:26

Re: Android Java/Unity Graphic Interference

Beitrag von marcgfx »

Ich benutze den Offset nicht, weil es gar nicht geht. Ohne Offset stürzt Unity ab, vermutlich wird was benötigtes überschrieben (wie auch immer, ich nix verstehen). Der Offset war eine Hoffnung um den Unity-Absturz zu verhindern mehr nicht.

edit: Glaub der Link bringt mir nichts, oder ich verstehe nicht was ich rausholen soll. Für sich alleine funktionieren ja Unity und Java einwandfrei, es ist die Kombination die nicht geht.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4254
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Android Java/Unity Graphic Interference

Beitrag von Chromanoid »

Bzgl. des Offsets hat hier jemand die gleiche Meinung wie xq https://stackoverflow.com/questions/793 ... gentexture
Ich teile die Frage eines Kommentators "I'm curious to know how you know that." :D Wahrscheinlich steht das irgendwo so a'la prinzipiell wird ein Offset bei der Übergabe von Arrays vorgesehen - ist wirklich ziemlich schlecht dokumentiert...

Hast Du mal Multi-Threaded Rendering oder solche Späße (falls aktiviert) ausgeschaltet?
Benutzeravatar
marcgfx
Establishment
Beiträge: 2050
Registriert: 18.10.2010, 23:26

Re: Android Java/Unity Graphic Interference

Beitrag von marcgfx »

Multi-Threaded ist ausgeschaltet. Der Absturz passiert auch wunderbar Sequenziell und ist 100% reproduzierbar. Mein erster Ansatz war rauszufinden ob ich Unity Rendering einfach kurz abschalten kann, oder ob ich einen Callback finden könnte der nach dem rendern von Unity ausgelöst wird. In der Hoffnung ich komme so am Problem vorbei.

OnPostRender, OnBeforeRender gehen jedenfalls beide nicht.

RenderPipelineManager hat einen Event "endFrameRendering". Super! Nur... Ich habe dann mit erschrecken festgestellt dass es einen Unterschied zwischen Default-Renderer und Universal-Render-Pipeline gibt. Der Manager feuert nicht im Default-Renderer. Ich müsste auf URP umstellen um zu testen ob es was bringt. Keine Ahnung was das für Konsequenzen nach sich zieht.

Renderer ausschalten habe ich nicht rausfinden können.

Unity Forum war äusserst hilflos.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Android Java/Unity Graphic Interference

Beitrag von kimmi »

Der Offset gibt den Index in dem Array an, in dem die Texture-Ids geschrieben werden. Also wenn du 8 schreibst, steht da:

Code: Alles auswählen

gl.glGenTextures(n, textureHandle+8)
Siehe dazu auch https://stackoverflow.com/questions/793 ... gentexture. Hat nun dein Array keine 8 EInträge, stürzt der Code halt ab. Aber ich denke nicht, dass das der Grund für deinen Absturz ist.

Da der Code ja beim Herunterfahren knallt, könnte ich mir folgendes Szenario vorstellen:
  • System fährt runter, GL-Kontext ist gelöscht
  • Dein Code wird durchlaufen, genTexture aufgerufen.
  • Textur Handle ist bereits weg, daher 0
  • glGenTextures wird aufgerufen
  • Ohne GL-Kontext Absturz
Könnte das hinkommen?
Benutzeravatar
marcgfx
Establishment
Beiträge: 2050
Registriert: 18.10.2010, 23:26

Re: Android Java/Unity Graphic Interference

Beitrag von marcgfx »

Der Offset war nur ein Versuch der gescheitert ist. Das stürzt ab, war aber auch erwartet da ich keine Ahnung oder Dokumentation dazu habe.

@kimmi: Verstehe nicht was du mit herunterfahren meinst. Mein Code ist abgeschlossen, danach stürzt Unity ab.

Was ich habe:

Unity C#: Button MP4 machen wird gedrückt
Java: MP4 wird sauber in Java erstellt
Java: Callback nach Unity
Unity C#: MP4 wird sauber über die Share Funktion (C# code im Unity Projekt) verteilt
Java: MP4 funktion abgeschlossen
Unity C#: Mein Code abgeschlossen
Unity: Interner Aufruf von Blit -> Absturz

Reduziere ich jetzt meinen MP4 erstellen code aufs minimum (ohne MP4 erstellen) läuft es wunderbar.
Nur wenn die genTextures Funktion aufgerufen wird schmiert Unity später ab.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Android Java/Unity Graphic Interference

Beitrag von kimmi »

Rufst du die glGenTextures auf, also in deinem Code oder woher kommt dieser?
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4254
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Android Java/Unity Graphic Interference

Beitrag von Chromanoid »

Woher kommt denn der OGL Kontext, aus Unity?
Antworten