【发布时间】:2014-04-03 14:36:07
【问题描述】:
我正在开发 iOS 应用程序,该应用程序使用一千个对象的数组执行一些计算。对象具有 x 和 y 坐标的属性、x 和 y 轴的速度以及耦合其他 x-y 属性。有一些数学可以计算由数组中的对象表示的物理对象之间的交互。数学很简单,基本上是计算施加在物体上的力、速度和每个物体的位置变化 (x,y)。我在 Objective C 中使用常规标量数学编写了一个代码,它在 iPhone 5s 上运行良好,但在 iPhone 4、4s、5 和 iPad mini 等其他设备上却太慢了。我发现最耗时的操作是计算 2 点之间的距离和计算向量的长度,如下所示,其中涉及取平方根:
float speed = sqrtf(self.dynamic.speed_x,2)+pow(self.dynamic.speed_y,2));
所以,我必须做一些事情来加快计算速度。我重新编写了代码以使具有对象坐标的属性以及由 X 和 Y 分量呈现的速度等属性成为 GLKVector2 类型的向量。我希望它可以使变量的计算,如 2 个向量(或点,根据我的理解)之间的距离,由于使用 GLKVector2Distance、GLKVector2Normalize、GLKVector2Add 等特殊向量函数而显着加快向量的加法和减法。但是,它在性能方面并没有太大帮助,因为我相信,要将具有 GLKVector2 类型属性的对象放入数组中,我必须使用 NSValue,以及将 GLKVector2 值从对象中解码回来数组来执行向量计算。下面是对象实现中计算方法的代码:
GLKVector2 currentPosition;
[self.currentPosition getValue:¤tPosition];
GLKVector2 newPosition;
// calculations with vectors. Result is in newPosition.
self.currentPosition = [NSValue value:&newPosition withObjCType:@encode(GLKVector2)];
此外,当我重写代码以使用 GLKVector2 时,我收到了内存警告,并且在运行应用程序一段时间后有时会崩溃。
我花了几天时间试图找到一种更好的方法来更快地进行计算,我查看了 vecLib、openGL,但没有找到我可以理解的解决方案。我有一种感觉,我可能不得不考虑用 C 编写代码并将其以某种方式集成到目标 C 中,但我不明白如何在不使用 NSValue 数千次的情况下将其与对象数组集成。
如果有人能就我应该关注的方向提供建议,我将不胜感激?也许有一些可用的库可以在 Objective C 中轻松使用,并将一组对象存储在数组中?
【问题讨论】: