在我的应用中,我必须在视图上实时绘制一些图像,这些图像会经常随着时间的推移而变化。这些图像是字典中包含的图像的子集。这是代码,总结一下:
-(void)drawObjects:(NSArray*)objects withImages:(NSDictionary*)images <etc>
{
// Get graphic context and save it
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
// Display objects in reverse order
for (int i = [objects count] - 1; i >= 0; i--) {
MyObject *object = [objects objectAtIndex:i];
// Check if object shall be visible
if (<test to check whether the image shall be visible or not>) {
// Get object image
UIImage* image = <retrieve image from "images", based on a key stored in "object">;
// Draw image
float x = <calculate image destination x>;
float y = <calculate image destination y>;
float imageWidth = <calculate image destination width>;
float imageHeight = <calculate image destination height>;
CGRect imageRect = CGRectMake(x - imageWidth / 2, y - imageHeight / 2, imageWidth, imageHeight);
[image drawInRect:imageRect];
}
}
// Restore graphic context
CGContextRestoreGState(context);
}
我的问题是这段代码很慢;当图像数量约为15(iPhone 4,iOS 4.3.5)时,执行循环大约需要700到800毫秒。我已经尝试了一下,似乎瓶颈是drawInRect调用,因为如果我排除它,一切都会大幅加速。
有人有建议吗?
答案 0 :(得分:2)
问题是(我认为)你实际上是在每一帧中绘制(创建屏幕表示)图像,因为drawInRect:
不知道你想重用图像您在最后一帧中显示的内容。但你不需要那样做。你只想绘制一次,然后转换它以改变它的位置和大小。
UIKit为您提供了便利:只需为UIImageView
设置框架,图像就会显示在您想要的位置和大小,而无需重新渲染图像数据。
您可以通过自己存储UIImageViews来进一步优化它,这样就不必在每次需要显示它们时重新创建它们。 Istead只是相应地设置了他们的hidden
属性。
答案 1 :(得分:0)
您的第一个答案:运行仪器,看看这部分实际上需要时间。 (是的,很可能是drawInRect:但它可能是你没有显示的“获取图像”)。