使用 CATransform3D 性能不佳
Posted
技术标签:
【中文标题】使用 CATransform3D 性能不佳【英文标题】:Bad performance using CATransform3D 【发布时间】:2012-04-10 12:43:32 【问题描述】:我正在尝试使用 CALayer 3d 变换创建 3D 用户界面。我已经想出了实现这一点的基本技术,但是我的实时性能很差。具体来说,用户应该能够交互地“平移”界面“场景”。
在下面的 sn-p 中,“模型”是我要设置动画的层。 “相机”是一个 CATransform3D 矩阵,我通过应用触摸转换不断更新它。
该方法有效,但平移非常缓慢。如果我使用 CGAffineTransform 取消注释该部分,我将获得快速且响应迅速的平移 - 但我失去了平移时应该发生的视角变化。
- (void)didPan:(UIPanGestureRecognizer*)pan
if (pan.state==UIGestureRecognizerStateChanged)
CGPoint p = [pan translationInView:self.view.window];
camera = CATransform3DTranslate(camera, p.y, 0, -p.x);
model.transform = CATransform3DConcat(camera, modelView);
// CGAffineTransform tA = self.view.transform;
// tA = CGAffineTransformTranslate(tA, p.x, p.y);
// self.view.transform = tA;
[pan setTranslation:CGPointZero inView:self.view.window];
如何提高渲染性能?
【问题讨论】:
【参考方案1】:好的,我自己解决了:问题是隐式动画。每个 model.transform = ... 调用都会触发一个隐式动画,导致行为非常缓慢。在创建“模型”层时禁用转换键的隐式动画,解决了问题:
model.actions = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNull null], @"transform",
nil];
现在一切都很快。
【讨论】:
【参考方案2】:我还想出了一种更简洁的方法来应用相机变换,如下所示:
camera = CATransform3DTranslate(camera, p.x, p.y, 0);
mainLayer.sublayerTransform = CATransform3DConcat(camera, CATransform3DPerspective);
mainLayer
是我的视口,CATransform3DPerspective
是一个常量 CATransform3D,定义如下:
CATransform3D const CATransform3DPerspective =
1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, -1.0/500.0,
0.0, 0.0, 0.0, 1.0
;
这样,我什至不必再禁用隐式动画 - 它就可以工作。
【讨论】:
以上是关于使用 CATransform3D 性能不佳的主要内容,如果未能解决你的问题,请参考以下文章
NSFetchedResultsController 性能不佳
使用 nHibernate 选择具有许多子集合的实体的性能不佳