菜鸟教程小白 发表于 2022-12-12 21:12:43

ios - 更流畅的手绘体验(iOS)


                                            <p><p>我正在制作一个与数学相关的事件,用户可以在其中尝试解决数学问题时用手指绘制草图。但是,我注意到当我快速移动手指时,线条明显滞后于我的手指。我想知道是否有一些地方我忽略了性能,或者 <code>touchesMoved</code> 只是不够(如果你不快速移动,它会非常流畅和美妙)。我正在使用 <code>UIBezierPath</code>。首先,我在我的 init 方法中创建它,如下所示:</p>

<pre><code>myPath=[init];
myPath.lineCapStyle=kCGLineCapSquare;
myPath.lineJoinStyle = kCGLineJoinBevel;
myPath.lineWidth=5;
myPath.flatness = 0.4;
</code></pre>

<p>然后在drawRect中:</p>

<pre><code>- (void)drawRect:(CGRect)rect
{
    ;
    if(baseImageView.image)
    {
      CGContextRef c = UIGraphicsGetCurrentContext();
      ;
    }

    CGBlendMode blendMode = self.erase ? kCGBlendModeClear : kCGBlendModeNormal;
    ;
}
</code></pre>

<p>baseImageView 是我用来保存结果的,这样我就不必绘制很多路径(一段时间后变得非常慢)。这是我的触摸逻辑:</p>

<pre><code>-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

    UITouch *mytouch=[ objectAtIndex:0];
    ];

}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{   
    UITouch *mytouch=[ objectAtIndex:0];
    ];
    ;
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{   
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0f);
    CGContextRef c = UIGraphicsGetCurrentContext();
    ;

    baseImageView.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    ;
    ;
}
</code></pre>

<p>此项目将作为企业应用程序发布,因此它只会安装在 iPad 2 上。目标 iOS 是 5.0。任何有关如何提高速度的建议都将不胜感激。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>当然,您应该首先在 Instruments 下运行它并寻找您的热点。然后您需要进行更改并重新评估以查看其影响。否则你只是在猜测。也就是说,一些经验笔记:</p>

<ul>
<li>向路径中添加大量元素会变得非常昂贵。如果您的 <code>addLineToPoint:</code> 原来是热点,我不会感到惊讶。这是给我的。</li>
<li>我可能会渲染成 CGLayer,而不是使用 UIImageView 来支持您的系统。 CGLayer 已针对渲染到特定上下文进行了优化。</li>
<li>为什么要累积路径而不是在每一步都将其渲染到图层中?这样,您的路径将永远不会超过两个元素(move、addLine)。通常使用两阶段方法,以便您可以处理撤消等操作。</li>
<li>确保您关闭了所有不需要的 UIBezierPath 功能。特别是,请查看文档中的“访问绘图属性”部分。您可以考虑切换到 CGMutablePath 而不是 UIBezierPath。当配置相同时,它实际上并没有更快,但它的默认设置会关闭更多的东西,所以默认情况下它会更快。 (您已经设置了其中的大部分;您需要在 Instruments 中进行一些实验,看看它们会产生什么影响。)</li>
</ul></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 更流畅的手绘体验(iOS),我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/10797037/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/10797037/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 更流畅的手绘体验(iOS)