1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/zlgopen-awtk

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
optimation.md 6.8 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 22:52 91e8897

Оптимизация

1. Оптимизационные подсказки

  • memcpy — самый быстрый способ копирования, поэтому для не прозрачных изображений рекомендуется сохранять формат, совпадающий с Framebuffer, чтобы можно было использовать memcpy для копирования.

Например, если формат FrameBuffer — BGR565, определите макрос WITH_BITMAP_BGR565.

  • Используйте JPG или непрозрачные PNG файлы в качестве фоновых изображений.
  • Вращение оказывает значительное влияние на производительность, и его следует избегать, если только нет аппаратного ускорения вращения.
  • Масштабирование также влияет на производительность. По возможности сохраняйте исходный размер изображения.
  • Избегайте использования 24-битных LCD, так как они могут привести к снижению производительности из-за отсутствия выравнивания по шине.
  • Если доступно аппаратное ускорение, убедитесь, что (полу)прозрачные изображения декодируются в форматы, поддерживаемые аппаратным обеспечением.

Для PXP/DMA2D аппаратного ускорения определите макрос WITH_BITMAP_BGRA.

  • Скорость memcpy важна для AWTK. Если скорость отображения не соответствует ожиданиям, проверьте скорость memcpy.

Если скорость memcpy низкая, проверьте правильность настройки памяти, используемой GUI (например, кэш).

  • В анимации окон самым быстрым является горизонтальное и вертикальное перемещение, а также всплытие снизу и сверху. Не используйте масштабирование и постепенное появление при отсутствии аппаратного ускорения.
  • В анимациях элементов управления самыми быстрыми являются горизонтальное перемещение и изменение значения, затем постепенное появление и исчезновение, а самыми медленными — масштабирование и вращение. PXP/DMA2D ускорение не может ускорить масштабирование и поворот, поэтому эти анимации подходят только для небольших изображений, если нет GPU.
  • SVG изображения медленнее обычных изображений, но при вращении и масштабировании SVG быстрее обычных изображений. Использование SVG изображений в сценариях, требующих вращения, может значительно повысить производительность.
  • Время, необходимое для рисования одного кадра, является важным показателем.

Можно проверить значение wm->last_paint_cost в src/base/window_manager.c:window_manager_paint_normal.

  • Метод исключения иногда может быстро определить узкое место в производительности.
  1. Подозреваете, что рендеринг шрифтов слишком медленный? Попробуйте вернуть lcd_draw_glyph напрямую и посмотрите на результат.

  2. Подозреваете, что рендеринг изображений слишком медленный? Верните lcd_draw_image напрямую и посмотрите на результат.

  3. Подозреваете, что заливка цветом слишком медленная? Верните lcd_fill_rect напрямую и посмотрите на результат.

  4. Подозреваете, что аппаратное ускорение неэффективно, попробуйте рендерить чисто программно и сравните время, затраченное на рендеринг одного кадра.

  • Использование трёх framebuffers позволяет избежать ожидания GUI и копирования, что может эффективно повысить частоту кадров. При наличии условий рекомендуется включить эту функцию.
  • Предположения часто ошибочны, используйте time_now_ms для измерения подозрительных мест.

2. Инструменты

Если определён глобальный макрос ENABLE_PERFORMANCE_PROFILE в проекте, lcd_profile будет собирать статистику времени для всех функций рисования (изображения, текст и заливка и т. д.). Если время рисования одного кадра превышает 25 мс, будет выведено следующее сообщение:

#####################################
src/base/lcd_profile.c:326
-------------------------------------
  total_cost=30
  draw_image_cost=18 times=1
  draw_text_cost=0 times=15
  fill_cost=0 times=15
  stroke_cost=0 times=15
  end_frame_cost=10
-------------------------------------

Также можно установить точку останова в функции lcd_profile_end_frame и получить более подробную статистическую информацию из объекта profile:

  uint32_t total_cost;
  uint32_t swap_cost;
  uint32_t flush_cost;

  uint32_t draw_image_cost;
  uint32_t draw_image_times;
  uint32_t draw_image_pixels;

  uint32_t draw_text_cost;
  uint32_t draw_text_times;
  uint32_t draw_text_chars;

  uint32_t fill_cost;
  uint32_t fill_times;
  uint32_t fill_pixels;

  uint32_t stroke_cost;
  uint32_t stroke_times;
  uint32_t stroke_pixels;

См. lcd_profile.c.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/zlgopen-awtk.git
git@api.gitlife.ru:oschina-mirror/zlgopen-awtk.git
oschina-mirror
zlgopen-awtk
zlgopen-awtk
master