大佬教程收集整理的这篇文章主要介绍了ios – 如何缓存CGContextRef,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我想过CGBitmapContext,但这是否意味着我需要在每次缩放后拆除并设置新的上下文?问题是在视网膜显示器上,线条画太慢(在iPad 2上它是如此),特别是在缩放时绘制. App Store中有一个名为GoodNotes的应用程序,可以很好地证明这是可行的,并且可以顺利完成,但我无法理解他们是如何做到的.这是我到目前为止的代码(今天大部分时间的结果):
- (void)drawRect:(CGRect)rect { CGContextRef c = UIGraphicsGetCurrentContext(); CGContextSetLineWidth(c,mLineWidth); CGContextSetAllowsAntialiasing(c,true); CGContextSetShouldAntialias(c,true); CGContextSetLineCap(c,kCGLineCapRound); CGContextSetLineJoin(c,kCGLineJoinRound); //Protect the local variables against the multithreaded nature of CATiledLayer [mLock lock]; NSArray *pathsCopy = [mstrokes copy]; for(UIBezierPath *path in pathsCopy) //**Would like to cache these** { CGContextAddPath(c,path.CGPath); CGContextstrokePath(c); } if(mCurPath) { CGContextAddPath(c,mCurPath.CGPath); CGContextstrokePath(c); } CGRect pathBounds = mCurPath.bounds; if(pathBounds.size.width > 32 || pathBounds.size.height > 32) { [mstrokes addObject:mCurPath]; mCurPath = [[UIBezierPath alloc] init]; } [mLock unlock]; }
其次,我认为你可以通过在上下文中添加所有路径并完全抚摸它们来避免多次调用CGContextstrokePath.
[mLock lock]; for ( UIBezierPath *path in mstrokes ) { CGContextAddPath(c,path.CGPath); } if ( mCurPath ) { CGContextAddPath(c,mCurPath.CGPath); } CGRect pathBounds = mCurPath.bounds; if ( pathBounds.size.width > 32 || pathBounds.size.height > 32 ) { [mstrokes addObject:mCurPath]; mCurPath = [[UIBezierPath alloc] init]; } [mLock unlock]; CGContextstrokePath(c);
CGContextRef只是一个用于绘图操作的画布.您无法缓存它,但您可以使用路径的扁平位图图像创建CGImageRef并重用该图像.这对缩放没有帮助(因为您需要在细节级别更改时重新创建图像),但在用户绘制非常长的路径时可以提高性能.
关于该主题,有一个非常有趣的WWDC 2012会议视频:Optimizing 2D Graphics and Animation Performance.
以上是大佬教程为你收集整理的ios – 如何缓存CGContextRef全部内容,希望文章能够帮你解决ios – 如何缓存CGContextRef所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。