大量のリッチコンテンツ(画像、フォーマット)を大量のCPUを使用せずにコントロールにすばやく追加するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/148881

  •  02-07-2019
  •  | 
  •  

質問

wxWidgetsとVisual C ++を使用して、Unixの「tail -f」を使用するのと同様の機能を作成しています。 GUIでの豊富な書式設定(色、フォント、画像)。 wxMSWとwxMACの両方をターゲットにしています。

明白な答えは、wxTextCtrl :: SetDefaultStyle()およびwxTextCtrl :: WriteText()の呼び出しを使用して、wxTE_RICHでwxTextCtrlを使用することです。

ただし、リリースモードでコンパイルされた3ghzワークステーションでは、1行あたり平均1ミリ秒増加し、最終的に遅れるログを追跡し続けることができません。各行について、私は次のことをしています:

  1. SetDefaultStyle()の2つの呼び出し
  2. 2つが2つのWriteText()を呼び出します
  3. ウィジェットのFreeze()およびThaw()の呼び出し

これを実行すると、約20,000行を埋めた後、wxMSWを使用して1つのコアでCPUが100%になります。プログラムは、特定のしきい値に達すると明らかに遅くなり、さらに遅れます。

他のコントロール(wxListCtrl、wxRichTextCtrlなど)を使用できます。

役に立ちましたか?

解決 3

wxVListBoxから派生。ドキュメントから:

  

wxVListBoxは、リストボックスのようなコントロールであり、通常のリストボックスとは次の2つの主な違いがあります。は仮想リストボックスです)、そのアイテムはOnMeasureItem()によって決定される可変の高さを持つことができます(したがって、可変の高さの行を持つリストボックスでもあります)。

他のヒント

ビューの行数を制限することを検討しましたか?同様の問題が発生したときに、ビューに10,000行を超えないようにしました。下部にさらに行がある場合は、上部の行を削除します。これはWxWidgetsを使用しておらず、MacのネイティブCocoa UIを使用していましたが、問題は同じです。スタイル付きテキストビュー(色、書式設定、きれいな印刷)が大きくなると、下部にデータを追加するのがかなり遅くなります。

使用しているコントロールのように聞こえるのは、スローするデータの量に対して構築されたものではありません。カスタムコントロールの構築を検討します。考慮すべきことがいくつかあります:

  1. 新しい行が入力された場合、前の行を再レンダリングする必要はありません...それらは変更されず、新しいデータのためにレイアウトは変更されません。
  2. 一度に表示できる部分に加えて、いくつかのルックバック画面のみをメモリに保持するようにしてください。これにより、少し軽くなります...しかし、ユーザーがルックバックよりもさらに後方にスクロールして、すべてがシームレスに見えるようにするには、独自のスクロール管理を行う必要があります。
  3. 必ずしも一度に1行ずつ更新する必要はありません。新しいデータがある場合は、すべて取得して更新します。 10行を本当にすばやく取得し、画面を一度にすべて更新する場合、行ごとに行うオーバーヘッドの一部を節約できます。

これがお役に立てば幸いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top