私は現在、描画アプリケーションを開発しようとしています。私が遭遇した問題は、アプリのパフォーマンスを最適化することです。CGImageの上に線を描く
私はUIView
をサブクラス化しました。ユーザーの入力を検出しています。
最初にCoreGraphicsを使用してすべての線をdraw(_ rect: CGRect)
メソッドで描画しようとしましたが、線数が10 000+のとき、その遅延が非常に目立つようになりました。それで、私はCGImageを作成して、毎回draw(...)
サイクル後に次の描画サイクルが来たら、そのCGImageの上に新しいラインを置くことにしました。したがって、すべての前のラインを再び描画せず、貴重な時間を節約します。
touchesBegan()
とtouchesMoved()
の方法で改行を登録してから、self.needsDisplay()
に電話しています。
これは私が現在使用していますコードです:
var mainImage: CGImage?
var newLines: [Line]
override func draw(_ rect: CGRect) {
let context = UIGraphicsGetCurrentContext()
//context?.translateBy(x: 0, y: bounds.height)
//context?.scaleBy(x: 1, y: -1)
if let image = mainImage {
context?.draw(image, in: bounds)
}
for line in newLines {
context?.setStrokeColor(UIColor.black.cgColor)
context?.setLineWidth(1)
context?.move(to: line.previousLocation)
context?.addLine(to: line.location)
context?.strokePath()
}
newLines = []
mainImage = context?.makeImage()
}
を今の問題は、私が描くラインは2つの部分に分割されており、垂直方向にミラーリングされていることです。 (Image split vertically)。ここでは、直線と曲線の2つの連続した線を描いています。奇妙なことは、もし私がUIView
の半分を反転させた場合、それらの線はそれらの間に隙間なく連続的に揃えられることである。
前述のコード(context?.translateBy(x: 0, y: bounds.height)
とcontext?.scaleBy(x: 1, y: -1)
)から2行のコメントを外した場合、image would look like this。
唯一の間違ったことは、画面の下側に描画し、上側に結果を得ることです。
どうすれば修正できますか?私の問題の適切な解決策は何ですか?
ありがとうございました!
はい、本当に!私の翻訳と縮尺線の後に 'context?.saveGState()'を追加し、 'context?.restoreGState()'を追加することで、画像が完全に描画されます!ありがとう! – Kansway