【问题标题】:brightness control slider is really slow in responding in ios亮度控制滑块在 ios 中的响应速度真的很慢
【发布时间】:2013-09-24 20:33:11
【问题描述】:

我真的需要帮助。

我正在创建简单的图像处理应用程序,我从相机胶卷中加载图像或拍照。我有一个亮度控制(滑块),可以调整图像的亮度。问题是滑块在模拟器上实时工作,但在 ipad 上的响应延迟很小。我已经尝试了所有方法,但似乎没有任何运气。

请帮忙。我见过其他应用程序,其中滑块可以顺利运行,没有任何延迟。我做错了什么?

谢谢

【问题讨论】:

  • 不幸的是,StackOverflow 上的大多数人都没有心灵感应,因此如果您需要帮助解决此问题,您可能需要发布一些实际代码。
  • 您还应该发布有关您的开发环境和您正在测试的平台(硬件、iOS 版本等)的详细信息。
  • 您的问题解决了吗?我也遇到同样的问题,能帮忙吗?

标签: ios controls brightness


【解决方案1】:

我将对最初问题中遗漏的一些内容进行猜测。

1)澄清一下,问题是:滑块的移动不顺畅。 2) 此外,由于或与此 UI 粗糙度相结合,图像的更改存在延迟。

我不确定您的实现是什么样的,但是,听起来您在主线程上做了太多工作和/或太多。

那么,下面是一个正常运行的实现可能会做什么:

- (void)sliderChanged:(UISlider *)sender
{
    [self adjustImageBrightnessWithValue:sender.value;
}

- (void)adjustImageBrightnessWithValue:(CGFloat)value
{
    [self cancelCurrentWork]; // Maintain a reference to an operation and cancel it
    [self adjustImageBrightnessAsyncWithValue:(CGFloat)value originalImage:self.imageView.image completion:^(UIImage *finalImage)
    {
        self.imageView.image = finalImage;
    }
}

adjustImageBrightnessAsyncWithValue 接受一个值、原始图像和完成块。它创建一个操作(通过 NSOperation 或 NSOperationQueue,可能两者都有)并跟踪该操作。该操作将算法应用于背景中的原始图像。完成后,完成块在主线程上的图像视图中设置最终图像。

在主线程上发生的唯一事情是:获取滑块更改回调、取消之前的工作、开始新的工作以及设置最终图像。其他一切都应该在后台发生。取消工作是针对用户移动滑块太快而无法在值再次更改之前修改图像的情况的优化。一旦滑块没有改变足够长的时间来进行修改,结果将是可见的。滑块应始终平滑,因为没有任何东西阻塞主线程。

编辑

使用操作队列... 声明一个成员变量:

NSOperationQueue *m_queue;

...

在 init 方法中初始化它:

m_queue = [NSOperationQueue new];
m_queue.maxConcurrentOperationCount = 1; // So it only does one brightness calculation at a time and there are no concurrency issues.

...

- (void)adjustImageBrightnessWithValue:(CGFloat)value
{
    [m_queue cancelAllOperations];
    [m_queue addOperationWithBlock:^
    {
        UIImage *adjustedImage = [mainimage brightness:value]; // Not sure where this method is coming from, but this code assumes it returns a copy of mainimage with the brightness adjusted.
        dispatch_async(dispatch_get_main_queue(), ^
        {
            imageview.image = adjustedImage;
        });
    }];
}

另外,顺便说一句,您可以看看 GPUImage,在此讨论:http://nshipster.com/gpuimage/,了解众多快速、强大的图像修改技术/API。

【讨论】:

  • 大家好,感谢您的快速回复。这是我的代码code (IBAction)sliderAction:(id)sender event:(id)event { UISlider *slider = (UISlider *)sender;浮动 fBrightness = slider.value; UITouch *touchEvent = [[event allTouches] anyObject]; if (touchEvent.phase == UITouchPhaseMoved){ [imageview setImage:[mainimage brightness:fBrightness]]; } }
  • 是的,你不需要检测触摸。如果执行了 sliderAction 回调,则滑块值发生了变化。而且,在后台线程上执行 [mainimage brightness:fBrightness] 并将其设置在主线程上。您应该使用对并发操作有限制的 NSOperationQueue,这样您就不会最终产生过多的线程。我将编辑我的答案以包含一些代码。
【解决方案2】:

使用

slider.isContinuous = false

这样就可以解决问题了。

【讨论】:

    猜你喜欢
    • 2015-02-09
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    相关资源
    最近更新 更多