2016-11-14 13 views
2

Я пишу графическую консоль, которая выделяет различные записи и сохраняет вещи при их вводе (в AS3), но я обнаружил, что после того, как тысячи записей, программа начинает отставать, а прокрутка медленная. Если я хочу, чтобы прокрутка была анимирована с ускорением, она становится еще медленнее.Какова наилучшая практика для отображения огромных журналов чата или консольных журналов в прокручиваемом окне? (AS3)

Как переместить гигантский блок объектов, которые являются моими сохраненными записями вверх и вниз? Должен ли я постепенно загружать сообщения, где находится пользователь? Как же полоса прокрутки справляется с этим?

ответ

2

вы должны создать пользовательский контейнер вместо TextField, было бы легче построить ускоренный скроллинг тоже

  • каждая запись журнала будет расширенная DisplayObject, который содержит все, что вы хотите так же, как надувать макеты в андроиде.

наиболее важная часть должна быть сокращение использования памяти:

  • можно хранить только простой текст журнальных enteries в чем-то вроде глобального массива и когда положение прокрутки достаточно близко, генерировать эти макеты, затем добавляя их в контейнер, чтобы показывать, и наоборот для удаления далеко позади чатов. однако этот процесс все еще работает с большой памятью во время выполнения.
  • так, как раз согласно концепции андроид DiskLruCache, можно хранить некоторую часть нашей невидимой информации, которая была бы слишком далеко от нашей позиции прокрутки на диск вместо памяти, используя SharedObject's.
2

Как переместить гигантский блок объектов, которые мои сохраненные записи до и вниз?

У вас нет. Как вы заметили, когда число Display Objects на DisplayList значительно увеличивается, накладные расходы памяти увеличиваются, а служебные данные об управлении Display Objects в конечном итоге приводят к ухудшению производительности. Вы не упоминаете никаких подробностей о том, как вы реализуете то, что у вас есть, поэтому мои комментарии будут общими.

Как это обрабатывается различными платформа компонентами списка в Flex, прошивке и я полагаю, Flash, чтобы отображать только минимальное количество объектов, необходимых, а также прокрутку, объекты перемешиваются и из список рендеринга. Дальнейшая оптимизация заключается в использовании «пула» объектов «шаблона», которые используются повторно, поэтому вы не платите штраф за время инициализации. Вероятно, существует фактическое имя для этой («... буферизации ...»), но я не знаю, что это (надеюсь, какой-то добрый человек предоставит ее и ссылку на более полное описание того, как она работает).

А как это работает - вы можете сделать это, выясняя, как пользователь прокручивает, какие объекты перемещаются за пределы экрана и могут быть переработаны, которые будут перемещаться по экрану и т. Д. Конечно, это все предполагает, что у вас есть ваши объекты, хранящиеся в структуре данных, например, и Array, ArrayList или ArrayCollection. В качестве альтернативы кодированию всего этого с нуля вы можете увидеть, будут ли компоненты DataGrid или List соответствовать вашим потребностям - они все это для вас помогут.

Flash Tutorial: The DataGrid Component (YOUTUBE видео)
Customize the List component
Много других примеров и ресурсов там.

(опять же, я работаю в Flex, где DataGrid и других компонентов на основе списков можно настроить широко используя «скины» и пользовательские средства визуализации элементов для визуального стиля - не уверен, если это то же самое в Flash)

+1

«* заплатите штраф за время инициализации *», насколько я видел, это скорее штраф времени уничтожения. Сборщик мусора продолжает накапливать мусор до достижения определенного порога. Затем он удаляет фактически удаляющие объекты, которые сами требуют некоторой производительности, что может привести к пропущенным кадрам. Предотвращение сбора объектов от GC, заставляя их оставаться в памяти и повторно использовать их, чтобы не хватать памяти, - это метод, называемый «объединение объектов». – null