0

我从一个问题跌跌撞撞地遇到了另一个问题:解决了第一个问题,现在当手指在屏幕上移动时,我的粒子轨迹被延迟到触摸位置之后。

当我通过覆盖初始化 CAEmitterLayer 时效果很好

+ (Class) layerClass 
{
    //configure the UIView to have emitter layer
    return [CAEmitterLayer class];
}

和初始化

fireEmitter = (CAEmitterLayer*)self.layer; 

我把它改成了

fireEmitter = [CAEmitterLayer layer];
fireEmitter.frame = self.bounds;
[self.layer addSublayer:fireEmitter];

现在发射器单元像艺妓一样在远处跟随移动的接触点

这是为什么?因为我改变了发射器现在发射的层?请帮忙!谢谢

4

1 回答 1

1

您每秒只能获得这么多的触摸事件,并且您每秒只能在屏幕上绘制一定次数。让我们做一些数学运算。

假设您可以在 166 毫秒内沿对角线在整个屏幕上移动手指(滑动速度非常快)。还假设您正在渲染足够的粒子以将设备从 60 FPS 减慢到 30 FPS(每个渲染周期 33 毫秒)。这意味着您在滑动屏幕所需的时间内只会收到大约 5 次触摸回调。反过来,这意味着您只会在每 100 个像素左右的手指移动时获得一个触摸事件。

因此,即使您假设您收到的触摸位置的延迟为零(实际上没有),您也只能经常获得它们,以至于您几乎总是会有一些明显的延迟。减少这种延迟的唯一方法是提高帧速率(通过使用更少/更小的粒子或切换到可以更好地扩展粒子数量的技术,例如 OpenGL)。您应该首先使用 Instruments 来验证帧速率实际上是您的问题。

注意:我[CATransaction setDisableActions:YES]在设置发射器位置时测量了使用的效果,没有发现差异,所以这不仅仅是使用隐式动画的问题。

于 2012-06-07T15:49:19.977 回答