私は最近UserControl
のRichTextBox
とPreviewTextInput
とPreviewMouseUp
のようなカップルイベントを持つ単純なRTFエディタを開発しています。RichTextBox - UIのサイズ変更によって膨大なCPU負荷が発生する
私は少し気になりました。 RichTextBox
のパフォーマンスは、UIのサイズが変更され、RichTextBox
にはラッピングアルゴリズムを起動させるテキストがたくさんあるときはいつもひどいです。
これは、あまり最適化されていない(たとえそうでなくても)かのように、アプリケーションに本当にかすかな感触を与えます。
最初に、テキストを選択しているときにこのパフォーマンスヒットが発生したので、SelectionChanged
イベントを使用する代わりに、PreviewMouseUp
イベントを使用して選択をフェッチしました。
さらにテストした結果、サイズ変更によっても大きな負荷が発生することがわかりました。 そして、3.8GHzで動作するクアッドコアCPUを搭載した負荷が5%〜30%の範囲で話しています。
はさらにそれをテストするために、私は私のRichTextBox
をコメントアウトすることを決めただけではありません定義されたプロパティ
<RichTextBox/>
、ウィンドウにこれを挿入するテキストを充填した後にウィンドウのサイズを変更して新しいRichTextBox
を含めますラッピングアルゴリズムが30%の使用量まで同じように再現されました。
私はこの問題について調査してみました、そしてほとんどの人は、ラッピングを防止するために、高い値にPageWidth
を設定推薦することになった:
richTextBox1.HorizontalScrollBarVisibility = ScrollBarVisibility.Visible;
richTextBox1.Document.PageWidth = 1000;
私はWinFormsを使って作成したものであり、簡単に折り返しを行うことができました。また、新しいWPFバージョンでも使用したいと思います。
誰もこの問題に直面しましたか? もしそうなら、正しい方向にハードウェア上のこの大きな歪みを取り除くことを教えてください。
私はWPFが大好きなのでちょっと悲しいですが、実際には最適化されていない、またはWinFormsに比べて実用的でないオブジェクトが見つかりました。RichTextBox
は、これらのケースのもう1つのようです:(
テキストの膨大な量のために申し訳ありませんが、私は本当にこれがきちんと場合には他のいくつかの貧しい人々の魂がこの問題に直面し、あなたたちは、私がこれまで試したかを確認するために文書化したいと思った。
私がResize Callを取得している明らかな選択方法については面白くないと思いますが、私はあまりにも疲れていると思います。あなたのコードにbtwを呼び出そうとしているところにエラーがあります。以下はそれを修正します:Dispatcher。呼び出し(新しいアクション(()=> {})); –
ちなみに、PCのパフォーマンスによっては、実際にはイベントがサイズ変更されているかどうかはわかりませんが、私の場合は300msを多かれ少なかれ使用しなければならないため、Timersを使用するのは危険です。それは間違いなく正しい方向に私を指摘し、私は自分の必要性に合わせてそれを変更し、最終的にタイマーを取り除くつもりです。ありがとう。 –
また、パフォーマンス上の理由を知ることに興味があれば、これは50%のオーバーヘッドを減らすのに役立ちましたが、多くのテキストが内部にある場合はサイズを変更しながら15%の使用率になりました。IMO RichTextBoxは面倒なこれは、ラップアルゴリズムがこれらの問題の原因となっている唯一の要因ではないように思われるからです。私は正しい方向に向いてくれてありがとうございます;) –