以前の結果に満足できなかったので、ズームしてもぼやけないフリーハンドの描画ビューを作成するように依頼されました。これが可能だと想像できる唯一の方法は、を使用するCATiledLayer
ことです。そうしないと、ズーム時に線を描くときに遅すぎるためです。現在、毎回すべての行を再描画するように設定していますが、前の行の結果を (適切にスケーリングする必要があるためピクセルとしてではなく) コンテキストなどで キャッシュできるかどうかを知りたいです。
CGBitmapContext について考えましたが、ズームするたびに破棄して新しいコンテキストを設定する必要があるということでしょうか? 問題は、Retina ディスプレイでは、線の描画が遅すぎることです (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];
}
プロファイリングによると、これまでで最もホットな機能は次のとおりです。GCSFillDRAM8by1