我在静止图像上应用GPUImageKuwaharaFilter过滤器。这是一个非常昂贵的操作,processImage需要相当长的时间才能完成。我想向用户展示processImage剩余多少的进度。有没有办法可以实现这个目标?
由于这项工作取得了近似进展,我尝试使用NSTimer并定期增加进度条。但是,由于某种原因,一旦我启动processImage,NSTimer就会被阻止。有没有办法在processImage在后台运行时保持UI和NSTimer免费?
答案 0 :(得分:1)
不幸的是,测量单个着色器的进度并不是一个很好的方法。将着色器应用于纹理四边形实际上是原子操作,无论是成功还是失败(如果着色器花费的时间比OpenGL ES驱动程序看门狗允许的时间长)。通过渲染图像确实没有进展的概念。
关于计时器你可能遇到的问题是,像这样一个令人难以置信的强化着色器,它会有效地阻塞整个系统直到它完成。它至少会在界面中造成很大的障碍,因为它需要在GPU可以进行任何其他类型的显示更新之前完成渲染。
我不知道如何改善着色器本身。即使在台式机GPU上,这种特殊的着色器也很慢,而且在iPhone 5S之前的设备上也很糟糕。在这个操作的固定半径版本中有一个粗略的尝试来优化它,但即便如此,我相信还有改进的余地。