在iPhone上利用ARM SIMD进行游戏向量/矩阵运算的正确方法是什么?

3

我正在为游戏制作一个利用iPhone上SIMD单元的向量/矩阵库。我该怎么做?我搜索了一些资料,现在我知道几个选项:

  • 苹果公司的Accelerate框架(包括BLAS+LAPACK+...),适用于iPhone OS 4
  • ARM的OpenMAX实现库
  • GCC自动向量化功能

哪种方式最适合用于游戏的向量/矩阵库?

5个回答

2
你应该假设GCC不会自动向量化你的代码,因为这似乎很不可能发生!像保罗所说的那样,为了从你的iPhone中获得最佳性能,你应该尽可能多地使用NEON SIMD指令编写自己的ARM汇编代码。但是,这假设你了解ARM汇编语言以及NEON、时间延迟等。所以,如果你不想学习ARM汇编语言,那么苹果公司的Accelerate框架和ARM的OpenMAX库都有许多已经用NEON SIMD指令编写的ARM汇编语言函数。
因此,如果你能使用Accelerate或OpenMAX,它们都应该非常好。我还没有比较过这两个库,看看哪一个实际上更快,但我认为ARM的OpenMAX比苹果的实现略快,因为ARM设计了NEON规范!但它们应该都运行非常快。

谢谢回复。我现在选择了Accelerate框架。当时它还没有推出。不过你的回答对其他人也会有帮助! - eonil

2

不错。现在Bullet几乎成为开源免费物理引擎的事实标准了。 - eonil
我是否可以仅使用Bullet数据类型(如btScalar、btVector、btMatrix、btQuaternion等)编写所有与图形相关的内容,然后使用btTransform.getOpenGLMatrix()函数绘制OpenGL ES基元,这样就足够了吗?或者我需要进行其他优化? - rraallvv

1
要做好这件事,您可能需要编写自己的SIMD例程。使用gcc中的Neon C内置函数而不是汇编语言可以减轻这样做的痛苦。

1

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接