1

drawRect固定幅で2本のテキスト線が描かれたカスタムメソッドのビューがあります。このビューは、テキストの位置とテキストの内容が常に変化する状態で、毎秒約16タイマーの速度で絶えず再描画されています。また、どの背景でもはっきりと見えるようにテキストを描画する必要があります。そのために、次のことを行います。

CGContextSetTextDrawingMode(ctx, kCGTextStroke);        // Border mode
[string drawAtPoint:point withFont:font];
CGContextSetTextDrawingMode(ctx, kCGTextFill);          // Text mode
[string drawAtPoint:point withFont:font];

このコードは、固定線幅の境界線モードでテキストを描画してから、同じ位置で塗りつぶしモードでテキストを再度描画します。このようにして、各文字の周りに白い境界線が付いた青いテキストが表示されます。

結果は、パフォーマンスを除いて私にとって絶対に満足のいくものです。Time Profilerを使用すると、ビュー全体の描画に費やされる時間の約70%が、境界線(ストローク)モードでのテキストの描画の実行に費やされることに気付きました。ただし、塗りつぶしモードでの描画には、ビュー全体の描画時間の3%しかかかりません。ビューの再描画の頻度を考えると、これは効率的ではないと思います。

では、各文字を境界線で囲んだテキストをより効率的に描画する方法を知っている人はいますか?

4

1 に答える 1

4

2つのオプション:

  1. 輪郭を描く代わりに影を使用します。CGContextSetShadowWithColor
  2. CGLayerを使用して、文字列の画像とそのアウトラインをキャッシュします。CGLayerCreateWithContext

2の説明:

描画テキストは、文字が1つの色で塗りつぶされる標準的なケースに合わせて高度に最適化されています。個々のグリフ(文字)は、毎回アウトラインからレンダリングされるわけではありません。代わりに、グリフはキャッシュされて再利用されるバッファリングされた画像に一度だけ描画されます。

アウトラインの描画はめったにないため、このモードではグリフのキャッシュやその他の最適化はおそらくありません。したがって、アイデアは自分でキャッシュを行うことです。文字列全体を1つの画像に描画し、その画像を保持して、drawRect:メソッド内のテキストの代わりに描画します。

これを行う方法にはいくつかのオプションがあります。

  1. CGBitmapContextを使用する
  2. 使用するUIGraphicsBeginImageContext
  3. 使うCGLayer
于 2012-07-11T23:05:41.550 に答える