菜鸟教程小白 发表于 2022-12-12 10:55:46

ios - 使用后台线程更新界面的更快方法


                                            <p><p>我正在构建光谱仪,想知道如何提高基于 <code>UIView</code> 的代码的性能。我知道我无法从后台线程更新 iPhone/iPad 的用户界面,所以我使用 GCD 进行大部分处理。我遇到的问题是我的界面更新太慢了。 </p>

<p>使用下面的代码,我尝试使用 32 个堆叠的 4x4 像素 <code>UIView</code> 并更改它们的背景颜色(请参阅所附图像上的绿色方 block )。该操作会为其他用户界面产生明显的滞后。 </p>

<p>有没有办法让我从某种后台线程“准备”这些颜色,然后让主线程一次刷新界面?</p>

<p> <img src="/image/cehlI.png" alt="enter image description here"/> </p>

<pre><code>//create a color intensity map used to color pixels
static dispatch_once_t onceToken;
dispatch_once(&amp;onceToken, ^{
    colorMap = [ initWithCapacity:128];

    for(int i = 0; i&lt;128; i ++)
    {
       forKey:];
    }


});

-(void)updateLayoutFromMainThread:(id)sender
{
    for(UIView* tempView in self.markerViews)
    {
      tempView.backgroundColor =];
    }

}
//called from background, would do heavy processing and fourier transforms
-(void)updateLayout
{

    //update the interface from the main thread
    ;


}
</code></pre>

<p>我最终预先计算了 256 种颜色的字典,然后根据圆圈试图显示的值向字典询问颜色。试图动态分配颜色是瓶颈。 </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>,是的,有几点。</p>

<p>虽然您不应该在主线程上处理 UIView,但您可以在使用它们之前在后台线程上实例化 View 。不确定这是否会对您有所帮助。然而,除了在后台线程上实例化 View 之外,UIView 实际上只是 CALayer 对象的元数据包装器,并且针对灵 active 而非性能进行了优化。 </p>

<p>最好的办法是在后台线程上绘制图层对象或图像对象(这是一个较慢的过程,因为绘制使用 CPU 和 GPU),将图层对象或图像传递给主线程,然后将预渲染的图像绘制到您的 View 层(更快,因为进行了简单的调用以让图形处理器将图像直接传送到 UIView 的后备存储)。</p>

<p>看到这个答案:</p>

<p> <a href="https://stackoverflow.com/questions/410313/how-to-render-to-offscreen-bitmap-then-blit-to-screen-using-core-graphics" rel="noreferrer noopener nofollow">Render to bitmap then blit to screen</a> </p>

<p>代码:</p>

<pre><code>- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawImage(context, rect, image);
}
</code></pre>

<p>执行速度远快于以相同方法执行其他绘图操作,例如绘制贝塞尔曲线。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 使用后台线程更新界面的更快方法,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/16496548/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/16496548/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 使用后台线程更新界面的更快方法