Übergeben Sie Array-Werte von und zu Android RenderScript mithilfe von Zuordnungen

8

Ich habe kürzlich mit RenderScript gearbeitet, um eine API zu erstellen, die ein Programmierer mit Leichtigkeit verwenden kann, ähnlich wie Microsoft Accelerator.

Das Problem, mit dem ich im Moment festhalte, da ich Werte an und von der RenderScript-Ebene übergeben und alles so effizient wie möglich ausführen möchte, ist ein Auszug aus meinem Quellcode:

%Vor%

Dies erstellt nur zwei grundlegende Arrays und füllt sie mit Werten und ruft die Funktionen auf, die sie an RenderScript senden.

%Vor%

Dies sendet ein Wertepaar an den folgenden RenderScript-Code:

%Vor%

Aber es gibt zwei Probleme damit, die erste ist die Asynchronität von RenderScript bedeutet, dass, wenn die Java-Schicht den Wert anfordert, das Skript die Operation entweder noch nicht ausgeführt hat oder es bereits erledigt ist, den Wert zerstört hat der Ausgabe und begann auf der nächsten. Und dank der geringen Debug-Sichtbarkeit von RenderScript gibt es keine Möglichkeit, das zu sagen.

Das andere Problem ist, dass es nicht sehr effizient ist. Der Code ruft ständig die RenderScript-Funktion auf, um zwei Zahlen zu addieren. Idealerweise würde ich das Array an RenderScript übergeben und es in einer Struktur speichern und die gesamte Operation in einem Skriptaufruf statt in vielen ausführen lassen. Aber um es zurück zu bekommen, muss ich die rsSendtoClient-Funktion benutzen, aber ich habe kein Material gefunden, das es benutzt. Und am liebsten würde ich die rsForEach-Strategie verwenden, aber auch hier sind die Informationen erschreckend.

Wenn jemand irgendwelche Ideen hat, wäre ich sehr dankbar. Danke.

Wird Scott-Jackson

    
Will Scott-Jackson 11.03.2012, 13:31
quelle

3 Antworten

2

Ich bin mir nicht sicher, ob Ihnen das an dieser Stelle helfen wird, aber da ich weiß, wie viel Schmerz es sein kann, mit RenderScript zu arbeiten, ist hier die Hilfe, die ich anbieten kann. Um die rsSendToClient-Funktion zu verwenden, müssen Sie die RenderScript-Instanz anweisen, die Sie erstellt haben, an die Sie Nachrichten senden möchten. Dies wird durch etwas wie:

erreicht %Vor%

Es wird notwendig sein, RenderScript.RSMessageHandler abzuleiten und die run () -Methode zu überschreiben. Siehe Ссылка , falls Sie dies nicht bereits getan haben. Grundsätzlich gibt es keine Möglichkeit, die asynchrone Natur, die ich als zweischneidiges Schwert empfinde, zu umgehen.

Was die Ineffizienz betrifft, würde ich in Betracht ziehen, eine RenderScript-Instanz zu erstellen, sie laufen zu lassen (Sie können sie pausieren, wenn sie nicht benötigt wird, bleibt im Speicher, stoppt aber die Threads, so dass bei jedem Aufruf einer Funktion keine Baukosten entstehen) . Von hier aus können Sie Ihre Strukturen haben und dann invoke_myFunction (einige Argumente hier) von der reflektierten Java-Ebene verwenden.

Hoffentlich hilft das zumindest ein bisschen.

    
Jared 13.04.2012 06:36
quelle
2

Ich hatte das gleiche Problem. Das Problem mit Ihrem Programm besteht darin, dass es nicht weiß, wann die Add-Funktion in der rs-Datei ausgeführt werden soll , versuche das es sollte funktionieren

%Vor%     
user1225347 30.05.2012 11:54
quelle
0

Ich hatte das gleiche Problem mit dir. Ich denke rsSendtoClient Funktion ist nicht nützlich und erzeugt viele Fehler. Stattdessen ist es viel einfacher, einen Zeiger zu verwenden und ihm einen Speicher zuzuweisen, um das Ergebnis zurück zu bringen.

Ich empfehle die Lösung Ihres Problems wie folgt:

Verwenden Sie in rsintadd.rs dieses Snippet:

%Vor%

Verwenden Sie in Ihrem JAVA-Code dieses Snippet:

%Vor%

Und das ist Ihr Ergebnis auf Logcat:

Ihre erste Frage bezieht sich auf Asynchron, Sie können den Thread verwenden, um das Ergebnis zu warten. In diesem Beispiel ist die Funktion schnell genug und gibt die Ausgabe sofort an C-Array, so dass das Ergebnis auf logcat angezeigt werden kann.

Ihre zweite Frage betrifft die Funktion intAdd () implementieren, ohne sie aufzurufen. Der obige Code ist die Antwort. Sie können auf jeden Teil des int-Arrays in Java zugreifen, bis die Methode fertig ist (anders als root ()).

Hoffe das kann jemandem helfen:)

    
Kẻ Lười Biếng 17.08.2014 18:55
quelle

Tags und Links