我有一個實現徒手繪製的視圖,但我有一個小問題。我注意到在iPad 3上所有的東西都變成了地獄,所以我試圖更新我的繪圖代碼(可能就像我應該做的第一件事),只更新被撫摸的部分。然而,打開後的第一次衝程以及閒置約10秒後的第一次衝程非常緩慢。在所有事情都「熱身」之後,它就像黃油一樣平滑,每個drawRect只需要大約0.15ms。我不知道爲什麼,但是整個視圖矩形被標記爲第一個drawRect髒,第一個drawRect空閒後(然後大約需要150 ms更新)。堆棧跟蹤顯示我的矩形是由CABackingStoreUpdate_
UIGraphicsGetCurrentContext()短生命週期
我試過繪製層如果矩形是巨大的,但後來我的整個背景一片空白(將重新出現,因爲我畫過舊區像樂透票)覆蓋。有沒有人有任何想法與UIGraphicsGetCurrentContext()?這是我能想象的唯一的麻煩。也就是說,我的觀點背景被上下文精靈拉下了,所以需要重新呈現自己。有什麼設置可以用來保持相同的上下文嗎?或者還有其他的東西在這裏......沒有必要在初始顯示之後更新完整的矩形。
我的drawRect很簡單:
- (void)drawRect:(CGRect)rect
{
CGContextRef c = mDrawingLayer ? CGLayerGetContext(mDrawingLayer) : NULL;
if(!mDrawingLayer)
{
c = UIGraphicsGetCurrentContext();
mDrawingLayer = CGLayerCreateWithContext(c, self.bounds.size, NULL);
c = CGLayerGetContext(mDrawingLayer);
CGContextSetAllowsAntialiasing(c, true);
CGContextSetShouldAntialias(c, true);
CGContextSetLineCap(c, kCGLineCapRound);
CGContextSetLineJoin(c, kCGLineJoinRound);
}
if(mClearFlag)
{
CGContextClearRect(c, self.bounds);
mClearFlag = NO;
}
CGContextStrokePath(c);
CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();
CGContextDrawLayerInRect(UIGraphicsGetCurrentContext(), self.bounds, mDrawingLayer);
NSLog(@"%.2fms : %f x %f", (CFAbsoluteTimeGetCurrent() - startTime)*1000.f, rect.size.width, rect.size.height);
}
您可能會嘗試重寫setNeedsDisplay和setNeedsDisplayInRect:因此您可以放置一個斷點並查看是否有某些事情意外使整個視圖無效。 –
(另外,非常有趣的問題。) –
@JesseRusak非常聰明的想法,但失效並不是調用的結果:(:(他們只在開始時被調用,從不再爲完整的矩形) – borrrden