我目前正在为 Android 应用程序的一个子部分开发 AirPlay 接收器。我正在使用以下框架:
https://github.com/pentateu/DroidAirPlay
虽然这在某些中档设备(如 miPad)上运行良好,但我们需要让它在低规范定制设备上运行。定制设备解码 airplay 数据包的速度比 miPad 慢 10 到 20 倍。结果,音频数据包失去了时间同步,并且由于解码数据包所花费的时间,音频永远无法重新同步。
我正在研究 Play 商店中的其他一些 airplay 接收器应用程序,据我所知,它们往往基于 Shairport ( https://github.com/abrasive/shairport ) 用于 airplay 接收器方面。
**注意:**基于 Shairport 的框架似乎不会在低端设备上遇到同步问题。
我使用的框架主要基于 Shairport 框架,除了它是用 Java 编写的。
对于解码数据,C/C++是不是比Java强多了?
如果是这样,使用 NDK 通过 C 或 C++ 实现来引导 DroidAirPlay 框架的解码部分是否会大大提高性能?
提前致谢
马特
最佳答案
虽然 Java 确实可以编译为在虚拟机中运行的字节码,但它不一定比本地编译的可执行文件慢(或快),无论是否使用 C/C++。这完全取决于程序!
在这种情况下,Java 可能变慢的原因有很多:
- 解码实现可能只是编码/优化不佳? (这真的不是 Java 的错)
- Java 编译器可能会为 JVM 生成次优代码。
- Java 的一些语言结构对于这里的速度/资源需求来说太慢了。
- JVM 只是另一个抽象层和罪魁祸首
- 垃圾收集在其中?!
(我必须在这里说明,我不是 Java 专家!)
但是,我仍然不会说 Java 本质上比 C 或 C++ 慢。我相信你能找到 many-a benchmarks并在互联网上进行测试,将一种语言与另一种语言进行比较,有些人在一定程度上做出了声明(出于骄傲和 self ?)。但是这些测试只是特定的情况,通常测试一种更大的语言的特定方面(例如 HashMap 查找性能!)。
LLVM 有一个 three part blog post在 C 上以及为什么未定义的行为允许编译器生成仍然正确但更高效的代码,但代价是推断运行时安全检查或决定 i+1 总是 在 i 之后,完全忽略了 i 的存在整数溢出。如果程序员不小心,这可能会造成灾难性的后果。
用 Bjarne 自己的话来说 Abstraction and the C++ machine model :
C++ was designed to be a systems programming language and has been used for embedded systems programming and other resource-constrained types of programming since the earliest days.
因此,我相信 C 和 C++ 可以比 Java 更进一步,因为这种未定义的行为和对其施加的限制更少。 (还有内联汇编位,但这不是严格的 C!)
关于java - 在 Android 上用 Java 或 C/C++ 解码 Airplay 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38456208/