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