【发布时间】:2013-05-11 11:21:40
【问题描述】:
我正在构建一个光谱仪,想知道如何提高基于UIView 的代码的性能。我知道我无法从后台线程更新 iPhone/iPad 的用户界面,所以我使用 GCD 进行大部分处理。我遇到的问题是我的界面更新太慢了。
使用下面的代码,我尝试使用 32 个堆叠的 4x4 像素 UIViews 并更改它们的背景颜色(请参阅所附图像上的绿色方块)。该操作会为其他用户界面产生明显的滞后。
有没有办法我可以从某种后台线程“准备”这些颜色,然后要求主线程一次刷新界面?
//create a color intensity map used to color pixels
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
colorMap = [[NSMutableDictionary alloc] initWithCapacity:128];
for(int i = 0; i<128; i ++)
{
[colorMap setObject:[UIColor colorWithHue:0.2 saturation:1 brightness:i/128.0 alpha:1] forKey:[NSNumber numberWithInt:i]];
}
});
-(void)updateLayoutFromMainThread:(id)sender
{
for(UIView* tempView in self.markerViews)
{
tempView.backgroundColor =[colorMap objectForKey:[NSNumber numberWithInt:arc4random()%128]];
}
}
//called from background, would do heavy processing and fourier transforms
-(void)updateLayout
{
//update the interface from the main thread
[self performSelectorOnMainThread:@selector(updateLayoutFromMainThread:) withObject:nil waitUntilDone:NO];
}
我最终预先计算了一个包含 256 种颜色的字典,然后根据圆圈试图显示的值向字典询问颜色。试图动态分配颜色是瓶颈。
【问题讨论】:
-
所以你对你的应用进行了基准测试,结果证明这是瓶颈,对吧?
-
您表示您的视图是堆叠的。你的意思是只有其中一个是可见的吗?如果是,则解决方案可能是推迟对不可见视图的所有操作,除了下一个(或者如果您的用户可以通过各个视图快速切换,则为接下来的几个)。 WWDC 2012 上有一段视频介绍了如何构建并发用户界面。
-
几乎我有 256 列,每列有 32 个 UIViews(4px x 4px)。通过堆叠,我的意思是它们以 4 个像素为增量占据 128 个像素。每 200 毫秒左右我想做快速傅立叶变换并使用这些视图对结果频率进行颜色编码(只需更改它们的背景颜色)。
-
这听起来像你试图模拟一个有很多视图的情节......为什么不只有一个视图,而一个视图真正绘制一个真实的情节......你可以看看 coreplot
-
您使用的视图过多。 UIView 不是轻量级对象,管理屏幕上的许多视图会降低性能。正如其他评论者所建议的那样,至少对每个条的子组件使用核心图形或使用图层而不是视图来研究绘图。
标签: ios performance cocoa-touch graphics uiview