2015-04-08 97 views
1

問題:我有一個小遊戲,你可以在另一個圖像上劃一個圖像。在刮擦的地方,上面的圖像變得不可見。整個事情被放入SpriteKit視圖。問題是,在較弱的設備(iPhone4)上,只有當用戶停止劃傷時纔會更新劃痕圖像。CGContext不立即更新

我假定圖像只在用戶沒有劃傷之前更新,直到圖像完全呈現並顯示。

有人可以建議一個更好的方式來立即看到刮擦。我知道刮擦消耗了很多性能,但我不介意它是否稍微滯後。

下面的代碼:

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 

UITouch *touch = [touches anyObject]; 
CGPoint currentPoint = [touch locationInView:self.view]; 


UIGraphicsBeginImageContext(self.view.frame.size); 

[_scratchImage drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 

CGContextMoveToPoint(UIGraphicsGetCurrentContext(), _lastPoint.x, _lastPoint.y); 
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); 
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 25.0f); 
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0); 

CGContextSetBlendMode (UIGraphicsGetCurrentContext(), kCGBlendModeClear); 

CGContextStrokePath(UIGraphicsGetCurrentContext()); 

_scratchImage = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

_lastPoint = currentPoint; 

SKTexture* scratchTexture = [SKTexture textureWithImage:_scratchImage]; 

_scratchSprite.texture = scratchTexture; 


} 

UPDATE

我結束了記錄點作爲正確答案建議。但不是更新的CADisplayLink回調我從SpriteKit一個

-(void)update(float currentTime) 

回調更新屏幕上的圖像(這是SpriteKit用例種類相同的)

我在更新方法看起來像其他代碼以下內容:

-(void)displayUpdated 
{ 


UIGraphicsBeginImageContext(self.view.frame.size); 

[_scratchImage drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 

CGMutablePathRef linePath = nil; 
linePath = CGPathCreateMutable(); 


CGPathMoveToPoint(linePath, NULL, _lastPoint.x, _lastPoint.y); 


for (NSValue* val in _recordedPoints) { 

    CGPoint p = [val CGPointValue]; 

    CGPathAddLineToPoint(linePath, NULL, p.x, p.y); 

    NSLog(@"%f, %f", p.x, p.y); 

    _lastPoint = p; 

} 
//flush array 
[_recordedPoints removeAllObjects]; 


CGContextAddPath(UIGraphicsGetCurrentContext(), linePath); 
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 25.0f); 
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0); 

CGContextSetBlendMode (UIGraphicsGetCurrentContext(), kCGBlendModeClear); 

CGContextStrokePath(UIGraphicsGetCurrentContext()); 

_scratchImage = UIGraphicsGetImageFromCurrentImageContext(); 

CGPathRelease(linePath); 

UIGraphicsEndImageContext(); 

SKTexture* scratchTexture = [SKTexture textureWithImage:_scratchImage]; 



_scratchSprite.texture = scratchTexture; 

} 

更高性能的代碼也將持有的上下文的引用,但我不能設法得到那工作。如果有人可以提出解決方案,我會很高興。儘管如此,iPhone 4的Framerate從5fps上升到25-30fps。

回答

0

我會嘗試以下方法:

  1. 測量Instruments.app Time Profiler
  2. 通過創建CGBitmapContext作爲實例變量加快繪圖速度。然後你可以在每一步中跳過[_scratchImage drawInRect:...]
  3. 分開繪圖和事件處理。現在,您將始終爲每個觸摸事件創建一個新的UIImage。這可能會更好地合併劃線,所以創建UIImage不會經常發生。例如。將線段放入隊列並從CADisplayLink中抽取回調。
+0

謝謝你的回答我會馬上試試。因爲我沒有足夠的聲望,所以我不能給你一個滿意的答覆 – ben

0

我不太瞭解SpriteKit,在UIView中,您應該將繪圖代碼放在drawRect方法中。它與SpriteKit相同嗎?