[JAVA] So übergeben Sie Bildpixelinformationen nativ aus Unity

Es gab einen Fall, in dem ich die Pixelinformationen eines Texturbildes wie RenderTexture of Unity nativ weitergeben wollte, daher hatte ich große Probleme (insbesondere auf der Android-Seite). Machen Sie sich also eine Notiz. Android ist übrigens verdammt. Ich möchte, dass du schnell verschwindest. Genauer gesagt ist es ein Fall, in dem Sie die Bilddaten mithilfe von WebCamera auf der Unity-Seite an eine Java-Bibliothek übergeben möchten.

Klicken Sie hier für ein Beispielprojekt https://bitbucket.org/HoshiyamaTakaaki/pixelreadstest

Erstens die Implementierung auf der Seite der Einheit

CameraOnPost.cs


RenderTexture.active = m_TargetTexture;
m_TargetTexture2D.ReadPixels(new Rect(0, 0, m_TargetTexture.width, m_TargetTexture.height), 0, 0);
m_TargetTexture2D.Apply();

var col = m_TargetTexture2D.GetPixels32();

var handle = default(GCHandle);
try
{
	handle = GCHandle.Alloc(col, GCHandleType.Pinned);
	var ptr = handle.AddrOfPinnedObject();
	libglutil_SetPixels(ptr.ToInt32(), m_TargetTexture.width, m_TargetTexture.height);
}
finally
{
	if (handle != default(GCHandle))
		handle.Free();
}

Auf der iPhone-Seite ist Unitys GetPixels32 relativ schnell, daher denke ich, dass es in Ordnung ist, Farbinformationen normalerweise auf der Unity-Seite abzurufen und den Zeiger auf die native Seite zu übergeben. Im Fall von RenderTexture muss es einmal in Texture2D verschoben werden, und es kann erforderlich sein, vorsichtig zu sein, da dieser Bereich zu einem Overhead wird.

CameraOnPost.cs


m_NativePlugin.CallStatic("sendRgbaFrame", m_Context, m_TargetTexture.GetNativeTexturePtr().ToInt32(), m_TargetTexture.width, m_TargetTexture.height);
GL.InvalidateState();

Leider funktioniert Android mit den ReadPixeln von Unity nicht gut. Und die Lieferung von Byte [] an Java ist sehr schwer. Es ist zu schwer, um es zu diesem Zeitpunkt zu verwenden. Unter Android wird die Textur unverändert an Java übergeben, und ReadPixels wird auf der Java-Seite ausgeführt. Übrigens können Sie NDK übergeben, wenn Sie es so machen, wie Sie es auf dem iPhone getan haben. Es scheint schneller zu sein, ein großes Byte-Array über C # → NDK → JNI nach Java zu übertragen.

Verwenden Sie auf der Java-Seite die Textur, die Sie erhalten haben, zeichnen Sie die Textur mit OpenGL ES in den Frame-Puffer und lesen Sie sie mit glReadPixels. Aber die glReadPixel von Android sind sehr schwer. Es ist doch schwer. Die Verwendung von PBO (Pixel Buffer Object) macht es etwas schneller (und manchmal langsamer), aber es ist immer noch schwer. Darüber hinaus benötigt PBO OpenGL ES3.0, und es ist in Java nicht vollständig, also tritt es auf und tritt. (Sie müssen die minimale SDK-API auf 24 erhöhen, um Java zu vervollständigen. Können Sie sie erhöhen oder dumm)

Um die erfassten RGBA-Informationen in MP4 usw. zu speichern, muss sie weiter in YUV konvertiert werden. In diesem Stadium ist es unvermeidlich, dass sie sich in einem ruckartigen Zustand befinden.

Ich denke nicht, dass es für die harte Arbeit sehr nützlich ist, aber das Anpassen der Größe der RenderTexture wird die Leistung in gewissem Maße verbessern.

Außerdem hatte Android große Probleme. Es fiel mir auch schwer, einen Weg zu finden, andere, die so geschaffen wurden, in aar einzubeziehen. Als die 64-Bit-Version der so-Datei enthalten war, dauerte es lange, bis das Problem behoben war, dass ein Popup angezeigt und beendet wurde, sobald die mit Unity erstellte App gestartet wurde.

Bei der Erstellung dieses Beispiels habe ich viele Informationen von unseren Vorgängern ausgeliehen. Und ich habe viele Fragen (Leichen) ohne Antworten gesehen. Jeder hat Probleme mit Android.

Vielen Dank.

Recommended Posts

So übergeben Sie Bildpixelinformationen nativ aus Unity
Bereitstellen von einem lokalen Docker-Image auf Heroku
So erhalten Sie die längsten Informationen von Twitter ab dem 12.12.2016
[IOS 14] Wie erhalte ich Bilddaten vom Datentyp direkt von PHPickerViewController?
[Rails 5] Verwendung von gem gon ~ Übergabe von Variablen von Rails an JS ~
[Rails] Anzeigen von Datenbankinformationen
So übergeben Sie Oracle Java Silver
[Swift5] So kommunizieren Sie von ViewController zu Model und übergeben einen Wert
So wechseln Sie von HTML zu Haml
So beschneiden Sie ein Bild in libGDX
[Rails] Wie man von erb zu haml konvertiert
So verwischen Sie das Bild (super einfach)
So rufen Sie Swift 5.3-Code von Objective-C auf
[Flattern] Wie verwende ich C / C ++ von Dart?
Java: So senden Sie Werte von Servlet zu Servlet
So übergeben Sie den Wert an einen anderen Bildschirm
So implementieren Sie die Image-Veröffentlichung mithilfe von Schienen
[Struts] So übergeben Sie Werte zwischen jsps
[Spring MVC] Übergeben von Pfadvariablen
Hinzufügen von Informationen zur Anwendungsversion zu Sentry-Informationen
So verknüpfen Sie Rails6 Vue (aus dem Umgebungsbau)
So erhalten Sie einen Heapdump aus einem Docker-Container
So sichern Sie von der Datenbank (DB) in die Seeds-Datei
So verkleinern Sie das Spring Boot Docker-Image
So erstellen Sie eine Klasse, die Klasseninformationen erbt
So erhalten Sie eine Klasse von Element in Java
Wie erstelle ich Unity Native Plugin (Android-Version)
So geben Sie jemandem Ihr Image mit Docker
[Java] So wechseln Sie von Open JDK zu Oracle JDK
Verwendung der Scope- und Pass-Verarbeitung (Servist)
So erhalten Sie eine SIMD-Optimierung für HotSpot JavaVM
[Ruby] Wie erhalte ich den Wert von der Standardeingabe?