【问题标题】:App freezes when looping through the pixels of screen in iOS在iOS中循环通过屏幕像素时应用程序冻结
【发布时间】:2014-04-23 11:36:43
【问题描述】:

我正在使用 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 循环。请有人说,我怎样才能得到屏幕所有像素的颜色。我知道如何知道每个像素的颜色。但是,我想检查每个像素的颜色,我必须遍历屏幕的所有像素。

【问题讨论】:

  • 你在循环中执行什么?更多代码会有所帮助。
  • 检查像素颜色。但这没关系。我的问题是如何减少这个循环执行的时间。
  • 您的代码并不意味着您正在遍历像素。请提取您的问题
  • 评论你的//一些代码。我的意思是功能并运行它并检查它是否崩溃

标签: ios screen pixel


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    使用 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。如果我将“//一些代码”替换为 [NSString stringWithFormat:@"X_AXIS:%d Y_AXIS:%d",x_axis, y_axis] 并将其添加到数组中,时间为 0.463264 秒。因此,如果您要检查每个像素的颜色,则需要很长时间才能完成。

    如果这有帮助,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多