我想将a的内容设置为CALayer图像.它CALayer有一个contents属性该属性的文档说"一个层可以将此属性设置为CGImageRef,以显示图像作为其内容." 但该属性id在Xcode中采用了以下问题我得到以下问题:
语义问题:从'CGImageRef'(又名'struct CGImage*')分配给'id'的指针类型不兼容
如果只需要一个属性,我如何分配CGImageRef给contents属性id?我在这里错过了什么?
我刚买了新的iPad(3),目前正在测试使用CoreGraphics的高分辨率版本的绘图应用程序.
在普通的1024x768模式下,iPad在性能上或多或少相似 - 在快速绘制时只有轻微的延迟.
但是,当我尝试在高分辨率画布(2048x1536)上绘画时,该应用程序变得非常缓慢且滞后.这是因为CoreGraphics主要是由CPU计算的(我认为它不比iPad2快得多)并且还需要多做4倍的工作?
我基本上改变了我的绘图程序
UIGraphicsBeginImageContext(CGSizeMake(1024, 768));
Run Code Online (Sandbox Code Playgroud)
至
UIGraphicsBeginImageContextWithOptions(CGSizeMake(1024, 768), NO, 0.0);
Run Code Online (Sandbox Code Playgroud)
为了实现视网膜绘图,线条非常漂亮和清晰,图像在2048x1536中保存.但如上所述,延迟和滞后使其无法用作绘图工具.
除了在openGL中重写我的应用程序(由于时间限制和早期在关键混合模式下尝试不成功而不是一个选项),我可以做些什么来优化在新iPad上以视网膜模式运行的CoreGraphics应用程序?
所以我在这个过程中有一个基本的绘图应用程序,允许我绘制线条.我绘制到屏幕外的位图,然后显示图像drawRect.它工作但速度太慢,用你的手指画出来后更新大约半秒钟.我从本教程中获取了代码并对其进行了调整,http://www.youtube.com/watch?v = UFWeMIL-Nu8&feature = relmfu,正如您在评论中所看到的那样,人们也说它太慢但是那个家伙没有'回答.
那么我怎样才能加快速度呢?或者有更好的方法吗?任何指针将不胜感激.
继承了我的代码DrawView.m.
-(id)initWithCoder:(NSCoder *)aDecoder {
if ((self=[super initWithCoder:aDecoder])) {
[self setUpBuffer];
}
return self;
}
-(void)setUpBuffer {
CGContextRelease(offscreenBuffer);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
offscreenBuffer = CGBitmapContextCreate(NULL, self.bounds.size.width, self.bounds.size.height, 8, self.bounds.size.width*4, colorSpace, kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);
CGContextTranslateCTM(offscreenBuffer, 0, self.bounds.size.height);
CGContextScaleCTM(offscreenBuffer, 1.0, -1.0);
}
-(void)drawToBuffer:(CGPoint)coordA :(CGPoint)coordB :(UIColor *)penColor :(int)thickness {
CGContextBeginPath(offscreenBuffer);
CGContextMoveToPoint(offscreenBuffer, coordA.x,coordA.y);
CGContextAddLineToPoint(offscreenBuffer, coordB.x,coordB.y);
CGContextSetLineWidth(offscreenBuffer, thickness);
CGContextSetLineCap(offscreenBuffer, kCGLineCapRound);
CGContextSetStrokeColorWithColor(offscreenBuffer, [penColor CGColor]);
CGContextStrokePath(offscreenBuffer);
}
- (void)drawRect:(CGRect)rect {
CGImageRef cgImage = CGBitmapContextCreateImage(offscreenBuffer);
UIImage *image …Run Code Online (Sandbox Code Playgroud) UIView我的应用程序中有自定义视图(继承自).自定义视图覆盖
- (void) drawRect:(CGRect) rect
问题是:drawRect:在iPad 3上的执行时间比在iPad 2上执行的时间长许多倍(在iPad 3上大约0.1秒,在iPad 2上大约0.003秒).它慢了约30倍.
基本上,我正在使用一些预先创建的图层并在其中绘制它们drawRect:.最后一个电话
CGContextDrawLayerAtPoint(context, CGPointZero, m_currentLayer);
Run Code Online (Sandbox Code Playgroud)
占用大部分时间(约占总时间的95%drawRect:)
什么可能会使事情变得如此缓慢,我该如何解决问题呢?
更新:
没有直接涉及的线程.我确实setNeedsDisplay:在一个线程中调用并drawRect:从另一个线程调用,但就是这样.锁也是如此(没有使用锁).
视图会重新绘制以响应触摸(它是着色书应用程序).在iPad 2上,我可以在触摸和更新屏幕之间获得合理的延迟.我想在iPad 3上实现同样的目标.