Как быстро добавить большой объем расширенного содержимого (изображения, форматирование) в элемент управления без использования тонны ЦП? - PullRequest
2 голосов
/ 29 сентября 2008

Я использую wxWidgets и Visual C ++ для создания функциональности, аналогичной использованию Unix "tail -f" с богатым форматированием (цвета, шрифты, изображения) в графическом интерфейсе. Я нацеливаюсь как на wxMSW, так и на wxMAC.

Очевидный ответ - использовать wxTextCtrl с wxTE_RICH, используя вызовы wxTextCtrl :: SetDefaultStyle () и wxTextCtrl :: WriteText ().

Однако на моей рабочей станции 3 ГГц, скомпилированной в режиме выпуска, я не могу следить за журналом, который растет в среднем на 1 мс на строку и в конечном итоге отстает. Для каждой строки я беру на себя:

  1. Два вызова SetDefaultStyle ()
  2. Два вызова два WriteText ()
  3. вызов Freeze () и Thaw () виджета

При выполнении этого мой процессор переходит на 100% на одном ядре с помощью wxMSW после заполнения примерно 20 000 строк. Программа заметно медленнее, когда достигает определенного порога и отстает.

Я открыт для использования других элементов управления (wxListCtrl, wxRichTextCtrl и т. Д.).

Ответы [ 3 ]

1 голос
/ 29 сентября 2008

Рассматривали ли вы ограничение количества строк в представлении? Когда у нас была похожая проблема, мы просто убедились, что в поле зрения никогда не попадает более 10 000 строк. Если в нижней части появляется больше строк, мы удаляем линии сверху. Это не было использование WxWidgets, это было использование собственного пользовательского интерфейса Какао на Mac, но проблема та же. Если стилизованное текстовое представление (с цветами, форматированием и красивой печатью) становится большим, добавление большего количества данных внизу становится довольно медленным.

0 голосов
/ 24 октября 2009

Получено из wxVListBox. Из документов:

wxVListBox - это элемент управления, подобный списку, со следующими двумя основными отличиями от обычного списка: он может иметь произвольно огромное количество элементов, потому что сам не хранит их, но использует обратный вызов OnDrawItem () для их отрисовки (поэтому он является виртуальным списком), и его элементы могут иметь переменную высоту, как определено OnMeasureItem () (поэтому это также список со строками переменной высоты).

0 голосов
/ 02 октября 2008

Похоже, что элемент управления, который вы используете, просто не создан для объема данных, которые вы на него бросаете. Я хотел бы рассмотреть возможность создания пользовательских элементов управления. Вот некоторые вещи, которые вы можете принять во внимание:

  1. Когда появляется новая строка, вам не нужно повторно отображать предыдущие строки ... они не меняются, и компоновка не изменится из-за новых данных.
  2. Старайтесь сохранять только видимую часть плюс несколько экранов просмотра в памяти одновременно. Это сделало бы его немного легче ... но вам нужно будет выполнить собственное управление прокруткой, если вы хотите, чтобы пользователь мог прокручивать дальше, чем вы оглядываетесь назад, и все это казалось бы плавным.
  3. Не обязательно обновлять по одной строке за раз. Когда появятся новые данные, возьмите их все и обновите. Если вы действительно быстро наберете 10 строк и обновите экран одновременно, вы можете сэкономить на некоторых расходах, делая это построчно.

Надеюсь, это поможет.

...