在iOS中循环显示屏幕像素时,应用会冻结

时间:2014-04-23 11:36:43

标签: ios screen pixel

我正在使用for循环遍历屏幕的每个像素。

for (int x_axis=0; x_axis<screenWidth; x_axis++)
{
    for (int y_axis=0; y_axis<screenHeight; y_axis++)
    {
        // some code 
    }
}

现在发生的是,由于哪个应用程序冻结,它会通过屏幕的所有像素。有没有其他方法我可以遍历屏幕的每个像素,应用程序将不会冻结。请帮忙

好吧,我想要的是知道每个像素的颜色是什么,所以我使用这个2 for循环。有人可以说,我怎么能得到屏幕所有像素的颜色。我知道如何知道每个像素的颜色。但是,我想检查每个像素颜色,我将不得不遍历屏幕的所有像素。

2 个答案:

答案 0 :(得分:0)

也许你的代码很慢?如果您使用的是错误的算法,则可能需要几分钟才能遍历屏幕的所有像素。您可以在内部循环之前放置NSLog(@"looping. x_axis=%d", x_axis);之类的内容,以查看算法的速度有多快或者它在任何地方崩溃或只是懒散

答案 1 :(得分:0)

使用dispatch_async

创建新的调度队列(在主队列上执行代码会导致您的应用冻结)

dispatch_queue_t queue = dispatch_queue_create("My new Q",NULL);

然后像这样在这个队列上调度你的循环:

dispatch_async(queue, ^{
for (int x_axis=0; x_axis<screenWidth; x_axis++)
{
    for (int y_axis=0; y_axis<screenHeight; y_axis++)
    {
        // some code 
    }
}
});

这将使您的代码异步运行并且不会阻塞您的主线程,同时浏览屏幕上的每个像素都有点过分。如果您想确切了解运行代码需要多长时间,请使用以下代码更改上面的代码:

dispatch_async(queue, ^{
    NSDate *startTime = [NSDate date];
    for (int x_axis=0; x_axis<screenWidth; x_axis++)
    {
        for (int y_axis=0; y_axis<screenHeight; y_axis++)
        {
            // some code 
        }
    }
    NSLog(@"Time: %d", [[NSDate date] timeIntervalSinceDate:startTime]); //in seconds
    });

运行此循环将返回值:0.027331sec。如果我更换&#34; //某些代码&#34;同 [NSString stringWithFormat:@"X_AXIS:%d Y_AXIS:%d",x_axis, y_axis]并将其添加到数组中,时间为0.463264秒。因此,如果您要检查每个像素的颜色,则需要花费大量时间才能完成。

如果有帮助,请告诉我。