Ich arbeite gerade an einem AirPlay-Empfänger für einen Teil einer Android-Anwendung. Ich verwende den folgenden Rahmen:
Obwohl dies bei einigen Mid-Range-Geräten wie dem miPad hervorragend funktioniert, müssen wir dies auf einem speziellen Gerät mit niedriger Spezifikationsrate durchführen. Das benutzerdefinierte Gerät entschlüsselt die Airplay-Pakete 10x bis 20x langsamer als das miPad. Als Ergebnis verlieren die Audiopakete die Zeitsynchronisation und aufgrund der Zeit, die zum Decodieren der Pakete benötigt wird, kann das Audio niemals erneut synchronisieren.
Ich habe mir ein paar andere Airplay-Receiver-Apps im Play Store angeschaut, und von dem, was ich sehe, basieren sie eher auf Shairport ( Ссылка <) / a>) für die Seite des Airplay-Empfängers.
** Hinweis: ** Die auf Shairport basierenden Frameworks scheinen das Synchronisationsproblem auf dem Low-End-Gerät nicht zu erleiden.
Das Framework, das ich verwende, basiert stark auf dem Shairport-Framework, abgesehen davon, dass es in Java geschrieben ist.
Ist C / C ++ zum Dekodieren von Daten weit besser als Java?
Wenn ja, würde ich den Dekodierungsteil des DroidAirPlay-Frameworks über eine C- oder C ++ - Implementierung mit dem NDK anweisen, mir einen großen Leistungsschub zu geben?
Vielen Dank im Voraus
Matt
Es stimmt zwar, dass Java zu Bytecode kompiliert, der in einer virtuellen Maschine ausgeführt wird, aber nicht unbedingt langsamer (oder schneller) als eine nativ kompilierte ausführbare Datei, ob nun C / C ++ oder nicht. Alles hängt vom Programm ab!
Es gibt eine Reihe von Gründen, warum Java in diesem Fall langsamer sein könnte:
(Ich muss hier erwähnen, dass ich kein Experte für Java bin!)
Ich würde jedoch immer noch nicht so weit gehen, Java intrinsisch langsamer zu nennen als C oder C ++. Ich bin sicher, dass Sie viele-a-Benchmarks und Tests im Internet finden, die eine Sprache mit einer anderen Sprache vergleichen, und einige machen Ansprüche auf eine bestimmter Grad (aus Stolz und Ego?). Aber diese Tests sind nur spezifische Fälle, in der Regel testen spezifische Aspekte einer größeren Sprache (Hash-Map-Lookup-Leistung zum Beispiel!).
LLVM hatte einen dreiteiligen Blogpost zu C und warum undefiniertes Verhalten es dem Compiler erlaubt, immer noch korrekten, aber effizienteren Code auf Kosten der Laufzeit-Sicherheitsprüfung zu generieren oder zu entscheiden, dass i + 1 immer nach i kommt und die Existenz eines Integer-Überlaufs völlig ignoriert . Wenn der Programmierer nicht vorsichtig ist, kann dies verheerende Folgen haben.
In den Worten von Bjarne selbst in Abstraktion und dem C ++ Maschinenmodell :
C ++ wurde entwickelt, um eine Systemprogrammiersprache zu sein und wurde für verwendet Programmierung eingebetteter Systeme und andere ressourcenbeschränkte Typen von Programmierung seit den frühesten Tagen.
Ich glaube daher, dass C und C ++ aufgrund dieses undefinierten Verhaltens und weniger Einschränkungen weiter als Java weiterverfolgt werden können. (Und da ist auch das Inline Assembly Bit, aber das ist nicht unbedingt C!)
Tags und Links java android c++ android-ndk airplay