Как мне быстро добавить большое количество богатого контента (изображения, форматирование) к элементу управления, не используя тонны процессора?

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

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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

  1. Два вызова SetDefaultStyle()
  2. Два вызова two WriteText()
  3. Вызов для замораживания () и размораживания() виджета

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

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

Это было полезно?

Решение 3

Производный от wxVListBox.Из документов:

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top