WEB开发网
开发学院手机开发iPhone 开发 通过 Objective C++ 强大功能提高 iPhone 程序的性... 阅读

通过 Objective C++ 强大功能提高 iPhone 程序的性能

 2010-02-10 00:23:00 来源:WEB开发网   
核心提示:CGFloat xMax = CGRectGetMaxX(aRect);CGFloat yMax = CGRectGetMaxY(aRect);CGPoint* begin = (CGPoint*)[_spotsData bytes];CGPoint* end = begin + _spotCount;NSUInteg

CGFloat xMax = CGRectGetMaxX(aRect);

CGFloat yMax = CGRectGetMaxY(aRect);

CGPoint* begin = (CGPoint*)[_spotsData bytes];

CGPoint* end = begin + _spotCount;

NSUInteger count = 0;

for (CGPoint* i = begin; i != end; ++i) {

if (i->x > xMin && i->y > yMin && i->x < xMax && i->y < yMax)

++count;

}

在没有改变基本算法的基础上,点计数的计算现在只需55毫秒,这大概比原来方法快了四倍。另一个好处是现在使用的内存是原来版本的一半。

第三种方法:算法优化

当然,还有许多聪明的方法来优化平面地图点的查询。例如,你可以使用四边形树来保存这些点。在本例中我使用了一种比较简单的解决方案,所以没有涉及数据存储的方式。我使用了C++的内置功能所以甚至不需要写任何代码来处理数据的存储。

sorted

我的设想是将数组中的位置从左至右分类。这样做的好处是确定指定正方形的左右边界十分快速(见下图)。当数组中边界已知时,仅需要检查边界间的点。

sorted2

所以此算法是有关快速寻找边界的。我们使用的是二进制搜索,它适用于已排序的数组。它并不检查每个值以找到匹配的位置,而是直接跳到数组的中点,检查其值是小于还是大于给点值,然后跳到剩余部分的中心点,重复以上步骤。使用这种方法,二进制搜索需要 log2(n)的时间来查找最佳元素。对于一个拥有230,000个位置的数组,只需22次搜索!回到代码,我们发现上述算法的实现是很简单的。当然,我们必须为数据库排序:

// comparison function for array sorting

NSInteger leftToRight(Spot* a, Spot* b, void* context) {

CGFloat xa = a.position.x;

CGFloat xb = b.position.x;

if (xa < xb)

return NSOrderedAscending;

return xa > xb ? NSOrderedDescending : NSOrderedSame;

}

...

上一页  1 2 3 4 5  下一页

Tags:通过 Objective 强大

编辑录入:coldstar [复制链接] [打 印]
赞助商链接