【问题标题】:iPhone detecting processor model / NEON supportiPhone 检测处理器型号/NEON 支持
【发布时间】:2010-12-08 17:24:45
【问题描述】:

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

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

  1. 一种检测处理器型号的方法 - 我想没有。
  2. 一种确定是否支持 ARM neon 指令的方法 - 从中​​我可以得出答案。
  3. 一种确定设备总存储大小的方法 - 将其与已知的设备模型结合起来可能会让我找到答案。

提前致谢:)

【问题讨论】:

  • 好问题!我刚刚查看了 Omap3 参考手册,协处理器寄存器中的指令集支持位无法从用户模式访问...
  • 目的是什么?看起来无论您尝试在应用程序中做出什么决定,都可能存在一种您可以测试的功能,而不是按处理器型号进行横向处理。
  • 我正在做密集的计算。我不确定我可以测试什么能力。我可以衡量性能并适应它,这听起来是个好方法,但恐怕在我的情况下这对我来说相当困难。我很难相信没有办法知道霓虹灯指令是否可用。

标签: iphone arm ipod-touch neon


【解决方案1】:

我能想到的一种解决方法是检测 OpenGL ES 2.0 是否可用,因为较新的处理器支持该功能。

有一个article at mobileorchard 告诉你怎么做。

【讨论】:

  • 谢谢,这实际上是实现这个 hack 的一种相当不错的方式。然而,一个缺点是确定 OpenGL ES 2.0 是否可用的唯一方法是调用 EAGLContext::initWithAPI 并检查返回值,这意味着将 OpenGL 引入我的项目。无论如何,除非我找到更好的方法,否则我可能会这样做。
  • 是的,我同意这很遗憾,而且可能只是为了确定设备功能而进行的繁重操作。
【解决方案2】:

不完全是您所要求的,但一种简单的解决方案是构建您的应用程序胖,以便它包含 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__

有一个类似的宏可用于检查(非 NEON)ARMv7 功能,我一时想不起来了。

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

【讨论】:

  • 我需要检查 sysctlbyname 是否可以为我提供我需要的信息。不幸的是,我手头没有配备新处理器的 iPod,所以我不能。有人试过这个吗?它可能是最终的方式,但它实际上取决于那里定义的内容。
  • 也很好奇这是否是一种可靠的方法 - 有人请确认这是否适用于 iPhone (3GS) 以及 iPod Touch (3rd)
  • __ARM_NEON__ 宏将由编译器在面向具有 NEON(包括 3gs 和 3rd gen touch)的 ARMv7 处理器时定义。
  • 除非在非常特殊的情况下,没有理由在运行时进行检查。也就是说,是的,该 API 在两个平台上都可用,并且可以使用。
  • @Pierre:一般来说,可执行文件大小只是应用程序总大小的一小部分。磁盘上的大部分空间被图形、声音、文本、nib 文件和其他在多个体系结构之间共享的资源所占用。尽管构建 fat 可能会使您的 mach-o 二进制文件的大小翻倍,但它通常只会导致整体应用程序大小的微小增加,并且通常值得为它带来的性能优势付出代价。
【解决方案3】:

我知道这很糟糕,但我想到的最好的方法是检测设备是否支持视频录制。目前只有基于 ARM7 的 iPhone 和 iPod 设备支持它,因此我猜这是一种合法的方式。

为此,请将 UIImagePickerController 的 availableMediaTypesForSourceType 与 kUTTypeMovie 上的 isSourceTypeAvailable 结合使用。

【讨论】:

    【解决方案4】:

    编辑:我撤回了这个答案,因为它留下了一个我后来意识到的明显漏洞:当我们在未来的某些硬件上获得未知子类型时该怎么办?这不是面向未来的。此外,鉴于 Apple 对使用未记录 API 的零容忍态度,该 API 记录状态的不确定性也无济于事。

    您应该使用 Stephen Canon 的答案并构建您的应用程序。目前,可靠、面向未来的运行时检测是不可行的(我向你保证,我很沮丧)。

    【讨论】:

      猜你喜欢
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多