iPhone检测处理器型号/ NEON支持

yon*_*evy 10 iphone arm ipod-touch neon

我正在寻找一种方法来在运行时区分配备新ARM处理器的设备(如iPhone 3GS和一些iPod 3G)以及配备旧ARM处理器的设备.我知道我可以使用uname()来确定设备型号,但由于只有部分iPod接触3G的ARM处理器得到了提升,这还不够.

因此,我正在寻找其中一个:

  1. 一种检测处理器模型的方法 - 我想没有.
  2. 一种确定是否支持ARM霓虹灯指令的方法 - 从中​​我可以得出答案.
  3. 确定设备总存储容量的方法 - 将其与已知的设备模型相结合,可能会让我找到答案.
  4. <ENTER RANDOM IDEA>

提前致谢 :)

Ste*_*non 12

不完全是你所要求的,但一个简单的解决方案是构建你的应用程序胖,以便它包含ARMv6和ARMv7的可执行代码.如果这样做,相应的代码将自动在处理器上运行,您无需进行任何运行时检查.实际上,您可以让加载程序为您执行运行时检测.

为此,将XCode项目中的Architectures设置从"Standard(armv6)"更改为"Optimized(armv6 armv7)"

然后,在您的实现中,您执行此操作:

#if defined __ARM_NEON__
    // Code that uses NEON goes here
#else  // defined __ARM_NEON__
    // Fallback code without NEON goes here
#endif // defined __ARM_NEON__
Run Code Online (Sandbox Code Playgroud)

有一个类似的宏,你可以用来检查(非NEON)ARMv7功能,我不记得我的头脑.

如果您真的想要进行运行时调度,请查看libc 中的sysctlbyname函数.具体来说,我认为查找HW_MACHINE_ARCH参数可能对您有用.

  • 当针对具有NEON(包括3gs和第3代触摸)的ARMv7处理器时,编译器将定义`__ARM_NEON__`宏. (2认同)

pgb*_*pgb 5

我能想到的一个解决方法是检测OpenGL ES 2.0是否可用,因为新的处理器能够实现这一点.

mobileorchard上有一篇关于如何做的文章.