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

OSCHINA-MIRROR/walkline-micropython-new-fontlib

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Новая библиотека шрифтов для MicroPython

Описание проекта

Чтение и отображение пользовательских шрифтов с помощью MicroPython платы.

Получение полного проекта

Поскольку проект использует подмодуль FontMaker Client ветки binary и OLED Research, чтобы получить полный набор исходного кода требуется выполнить следующие действия.

Клонирование

$ git clone --recursive https://gitee.com/walkline/micropython-new-fontlib.git

Скачивание архивированного файла

Или если при клонировании не использовался параметр --recursive, выполните следующую команду для обновления подмодулей:

$ cd micropython-new-fontlib
$ git submodule update --init --recursive

Как использовать и тестировать

Генерация файла шрифта

Подробное описание генерации файла шрифта см. в документации проекта FontMaker Client.

Запустите следующий скрипт:

$ client/youyuan_16.cmd

Это создаст файл combined.bin. Информация о файле шрифта приведена ниже:| Параметр | Значение | Описание | | :-: | :-: | :-: | | Шрифт | Юный | | | Размер | 16 | пикселей | | Вес | Обычный | Без выделения жирным, курсивом или подчеркиванием | | Ширина символов | Фиксированная | | | Ширина | 16 | пикселей | | Высота | 16 | пикселей | | Горизонтальное смещение | 0 | пикселей | | Вертикальное смещение | 0 | пикселей | | Метод сканирования | Вертикальное сканирование | | | Порядок байтов | Нижний байт первым | |

Описание для шрифта и ширины символов можно было бы добавить, но в данном случае они не указаны в исходном тексте.#### Тестирование с компьютера

Запустите:

$ python fontlib.py

Это покажет информацию, включая:

  • Информацию о шрифте
  • Данные полученного шрифта
  • Предварительный просмотр печати шрифта

Комплексный вывод информации представлен ниже:

HZK Info: .//client/combined.bin
    размер файла : 261972
  высота шрифта : 16
    размер данных : 32
    метод сканирования : Вертикальное
   порядок байтов : Нижний байт первым
   количество символов : 7710

!: b'\x00\x00\x00\x00\x00\x00\x08\x00\x0c\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x00\x00\x08\x00\x08\x00\x00\x00'

☆: b'\x00\x00\x00\x00\x00\x80\x01\x80\x01\x80\x01@\x02@~? \x04\x10\x08\x0c\x10\x08\x10\x08\x90\x0bH\x148\x18\x08'

⒉: b'\x00\x00\x00\x00\x00\x00\x07\xc0\x08@\x00@\x00@\x00@\x00\x80\x01\x00\x01\x00\x02\x00\x04\x00\x0c\x08\x0f\xcc\x00\x00'

,: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\x000\x00 \x00'

Исходный текст представлен в виде байтовых данных, что указывает на то, что он может представлять собой данные шрифта или другой двоичной информации. В соответствии с правилами перевода, такие данные остаются без изменения.

Поэтому перевод будет таким же, как и исходный текст:

我: b'\x00\x00\x00@\x07PxH\x08D\x08D\x7f\xfe\x08D\x08D\t(\x0e0x0\x080\x08R\t\x8ax\x06'

ㄘ: b'\x00\x00\x00\x00\x00\x00\x01\x00\x01\x80\x00\x80\x01\x00\x03\xf0\x1d\x00\x01\x00\x02\xe0\x03`\x00@\x00\x80\x00\x00\x00\x00'

■: b'\x00\x00\x00\x00\x7f\xff\x7f\xff\x7f\xff\x7f\xff\x7f\xff\x7f\xff\x7f\xff\x7f\xff\x7f\xff\x7f\xff\x7f\xff\x7f\xff\x7f\xff'

B: b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x060\x068\x060\x06p\x07\xf0\x06\x18\x06\x18\x06\x18\x07\xf0\x00\x00\x00\x00'```markdown 中: b'\x00\x00\x01\x00\x01\x00\x01\x00?\xfc!\x04!\x04!\x04!\x04!\x04!\x04?\xfc\x01\x00\x01\x00\x01\x00\x01\x00'

爱: b'\x00\x00\x00\x00?\xf8\x11\x10\t\x10?\xfcD\x02B\x02\x1f\xf8\x04\x00\x07\xf8\x0e\x08\x13\x10 \xe0\x01\xe0\x1e\x1e'

β: b'\x00\x00\x00\x00\x00\x00\x01\xe0\x01\x10\x030\x02 \x02\xc0\x02\x06 \x04 \x04\x04`\x07\xc0\x0c\x00\x08\x00'

あ: b"\x00\x00\x00\x00\x03\x00\x03\x00\x02\xc0\x1f\x80\x02\x00\x06\x80\x07\xf0\x0c\x98\x15\x0c'\x0c&\x0c/\x088\x10\x01\xe0"

H: b'\x00\x00\x00\x00\x00\x00\xe7\x00B\x00B\x00B\x00B\x00~\x00B\x00B\x00B\x00B\x00\xe7\x00\x00\x00\x00\x00'

华: b'\x00\x00\x00\x00\x08@\x08H\x18p(\xc0+BHB\x08~\x01\x00\x01\x00\x7f\xfe\x01\x00\x01\x00\x01\x00\x01\x00'

ǚ: b"\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x08\x004\x00C\x00C\x00C\x00C\x00C\x00C\x00'\x00\x18\x00\x00\x00"

e: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<\x00B\x00~\x00@\x00@\x00B\x00<\x00\x00\x00\x00\x00'

l: b'\x00\x00\x00\x00\x00\x00p\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00|\x00\x00\x00\x00\x00'

о: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<\x00Б\x00Б\x00Б\x00Б\x00Б\x00<\x00\x00\x00\x00\x00'

 . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . .  . . . . . . . . . . @. . . . . . . .  . . . . . . . . . . . . . . . .  . . . . . . . . @@@. @. @. . . . . . . . . . . . . . .
 . . . . @. . . . . . . . . . .  . . . . . . . . . @@. . . . . . .  . . . . @. . . . @. . . . . .  . . . . . . . . . . . . . . . .  . @@@@. . . . @. . @. .  . . . . . . . @. . . . . . .
 . . . . @@. . . . . . . . . .  . . . . . . . . . @@. . . . . . .  . . . . @. . . . @. . . . . .  . . . . . . . . . . . . . . . .  . . . . @. . . . @. . . @. .  . . . . . . . @@. . . . .
 . . . . @. . . . . . . . . . .  . . . . . . . . @. @. . . . . .  . . . . . . . . . @. . . . . .  . . . . . . . . . . . . . . . .  . . . . @. . . . @. . . @. .  . . . . . . . . @. . . . .
 . . . . @. . . . . . . . . . .  . . . . . . @. . @. . . . . .  . . . . . . . . . @. . . . . .  . . . . . . . . . . . . . . . .  . @@@@@@@@@@@@@@.  . . . . . . . @. . . . . . .
 . . . . @. . . . . . . . . . .  . @@@@@@. . . @@@@@@ . . . . . . . . . @. . . . . .  . . . . . . . . . . . . . . . .  . . . . @. . . . @. . . @. .  . . . . . . @@@@@@. . .
 . . . . @. . . . . . . . . . .  . . @. . . . . . . . . . @. .  . . . . . . . . @. . . . . . .  . . . . . . . . . . . . . . . .  . . . . @. . . . @. . . @. .  . . . @@@. @. . . . . . .
 . . . . @. . . . . . . . . . .  . . . @. . . . . . . . @. . .  . . . . . . . @. . . . . . . .  . . . . . . . . . . . . . . . .  . . . . @. . @. . @. @. . .  . . . . . . . @. . . . . . .
 . . . . @. . . . . . . . . . .  . . . . @@. . . . . @. . . .  . . . . . . . @. . . . . . . .  . . . . . . . . . . . . . . . .  . . . . @@@. . . @@. . . .  . . . . . . @. @@@. . . . .
 . . . . @. . . . . . . . . . .  . . . . @. . . . . . @. . . .  . . . . . . @. . . . . . . . .  . . . . . . . . . . . . . . . .  . @@@@. . . . . @@. . . .  . . . . . . @@. @@. . . . .
 . . . . . . . . . . . . . . . .  . . . . @. . . @. . @. . . .  . . . . . @. . . . . . . . . .  . . . . . . . . . . . . . . . .  . . . . @. . . . . @@. . . .  . . . . . . . . . @. . . . . . .. @. . . . . . .
 . . . . @. . . . . . . . . . .  . . . @. @. . . . @@@. . .  . . . . @@@@@@. . @@. .  . . . @@. . . . . . . . . . . .  . . . . @. . @@. . . @. @.  . . . . . . . . . . . . . . . .
 . . . . . . . . . . . . . . . .  . . . @@. . . . . . . @. . .  . . . . . . . . . . . . . . . .  . . @. . . . . . . . . . . . .  . @@@@. . . . . . . . @@.  . . . . . . . . . . . . . . . . 
 . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .
 . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  @@@@. . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .
 @@@@@@@@@@@@@@@@ . . . . . . . . . . . . . . . . . . . . . . . .  @@@@. . . . . . . . . . . . . . . .  @@. . . . . . @@ . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . @@
 @@@@@@@@@@@@@@@@ . . . . . . . . . . . . . . . . . . . . . . . .  @@@@. . . . . . . . . . . . . . . .  @@. . . . . . @@ . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . @@
 @@@@@@@@@@@@@@@@ . . . . . . . . . . . . . . . . . . . . . . . . @@@@@@@. . . . . . . . . . . . . . .  @@. . . . . . @@ . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . @@
 @@@@@@@@@@@@@@@@ . . . . . . . . . . . . . . . . . . . . . . . . @@. . . . . . . . . @@. . . . . . . . .  @@. . . . . . @@ . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . @@
 @@@@@@@@@@@@@@@@ . . . . . . . . . . . . . . . . . . . . . . . . @@. . . . . . . . . @@. . . . . . . . .  @@. . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . @@
 @@@@@@@@@@@@@@@@ . . . . . . . . . . . . . . . . . . . . . . . . @@. . . . . . . . . @@. . . . . . . . .  @@. . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . @@
 @@@@@@@@@@@@@@@@ . . . . . . . . . . . . . . . . . . . . . . . . @@. . . . . . . . . @@. . . . . . . ..  @@. . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . @@
 @@@@@@@@@@@@@@@@ . . . . . . . . . . . . . . . . . . . . . . . . @@. . . . . . . . . @@. . . . . . . . .  @@. . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . @@
 @@@@@@@@@@@@@@@@ . . . . . . . . . . . . . . . . . . . . . . . . @@. . . . . . . . . @@. . . . . . . . .  @@. . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . @@
 @@@@@@@@@@@@@@@@ . . . . . . . . . . . . . . . . . . . . . . . . @@. . . . . . . . . @@. . . . . . . . .  @@. . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . @@
 @@@@@@@@@@@@@@@@ . . . . . . . . . . . . . . . . . . . . . . . . @@. . . . . . . . . @@. . . . . . . . .  @@. . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . @@
 @@@@@@@@@@@@@@@@ . . . . . . . . . . . . . . . . . . . . . . . . @@. . . . . . . . . @@. . . . . . . . .  @@. . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . @@
 @@@@@@@@@@@@@@@@ . . . . . . . . . . . . . . . . . . . . . . . .  @@@@. . . . . . . . . . . . . . . .  @@. . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . @@
 @@@@@@@@@@@@@@@@ . . . . . . . . . . . . . . . . . . . . . . . .  @@@@. . . . . . . . . . . . . . . .  @@. . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . @@
 @@@@@@@@@@@@@@@@ . . . . . . . . . . . . . . . . . . . . . . . .  @@@@. . . . . . . . . . . . . . . .  @@. . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . @@
```Пожалуйста, обратите внимание, что данный текст представляет собой визуальное представление символов и не является текстовой информацией для перевода. В соответствии с правилами, все элементы кода и специальные символы остаются без изменений.

........................................................
....@............
...@........@...
..@....@@....@..
..@.....@.....@.
.@......@.....@.
.@......@.....@@
.@......@......@
.@......@......@
.@......@......@
.@......@.....@.
..@.....@.....@.
..@.....@....@..
...@..@@@@...@..
...@........@...#### Тестирование с использованием разработочной платы 1

Рекомендуется использовать [AMPY Batch Tool](https://github.com/adafruit/ampy) (`ab` инструмент) для загрузки файлов и отладочных операций.

```bash
# Загрузка файла
$ ab

# Вход в режим REPL
$ ab --repl

# Выполнение файла на разработочной плате
# Используйте сочетание клавиш Ctrl-T
>>>
Выполнить файл на плате
    [1] /boot.py
    [2] /drivers/ssd1306.py
    [3] /fontlib.py
Выберите файл: 3
>>>

# Выполнение локального файла на разработочной плате
# Используйте сочетание клавиш Ctrl-R
>>> Выполнить локальный файл
    [1] fontlib.py
    [2] drivers/ssd1306.py
Выберите файл: 1
>>>

Тестирование с использованием разработочной платы 2

Это метод упрощения части кода, не относящегося к MicroPython, в файле fontlib.py, компиляции его в байт-код и последующего тестирования

# Загрузка файла
$ ab abconfig-mpy

Поскольку загружаемый файл уже содержит main.py, достаточно просто перезапустить плату и выбрать нужные опции по указанию, чтобы увидеть результат

Генерация шрифтов из символьных шрифтов

Методы см. в разделе Генерация шрифтов из символьных шрифтов

Выбор других языковых символов

Кодировка GB2312 включает в себя 682 полноклеточных символов, в том числе латинские буквы, греческие буквы, японские хирогана и катакана, а также русские кириллические буквыСимволы можно ввести через клавиатуру, но это может быть неудобно. Однако они могут быть просмотрены и скопированы непосредственно со страницы таблицы кодировки GB2312### О скорости

На примере текущего файла шрифта:

  • Название файла: combined.bin
  • Размер файла: 261,972 байт
  • Размер таблицы индекса GB2312: 17,672 байт
  • Размер пикселей: 16x16
  • Размер данных символа: 32 байт
  • Общее количество символов: 7710 (включая ASCII и GB2312)
  • Открытие файла шрифта при создании объекта FontLib, чтение информации заголовка, около 12 мс
  • Чтение данных символа "?" как заполнителя, около 5 мс
  • Вывод информации о файле шрифта, около 39 мс (что невероятно, рекомендуется не выводить информацию при реальном использовании)
  • Открытие файла шрифта перед поиском данных символа, около 12 мс
  • Поиск данных символа, около 12 мс на каждый символ
  • Данные символов хранятся в Dict, Unicode значение символа используется как ключ, время выполнения считается небольшим
  • Время отображения символа не учтено

О повышении скорости

Факторы, влияющие на скорость отображения, включают:

  • Чтение данных шрифта из шрифт-файла
  • Отображение на OLED экране

Что касается отображения, библиотека MicroPython, предоставляющая драйвер SSD1306, уже использует FrameBuffer для управления данными. Я доверяю способностям официальной команды, поэтому предположу, что скорость отображения достигла своего максимума.

Что касается чтения данных, первоначальный подход был направлен на выполнение базовой функциональности, следовательно, процесс чтения выглядел так:1. Открытие файла с шрифтами 2. Выбор одного символа 3. "Партиционированное" поиск смещения символа в таблице индексов 4. "Перемещение" к найденному смещению для чтения данных шрифта 5. Возврат к шагу 2 до полной загрузки всех символов

"Партиционированное" означает: при открытии файла в Python нет возможности для прямого поиска, поэтому требуется сначала прочитать содержимое файла, чтобы найти нужное значение. Для устройства с ограниченной памятью одновременное чтение всего файла вызывает ошибку "переполнение памяти". Поэтому данные должны читаться порциями.

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

Для увеличения скорости было решено выполнять поиск всех символов во время каждого "партиционированного" чтения, тем самым снижая количество операций "партиционирования".

Проведённый анализ показал, что использование read вместо seek может повысить эффективность "перемещения", но это также имеет серьёзный недостаток — даже если данные, полученные через read, не используются, они всё равно занимают место в памяти, что делает этот метод менее эффективным на устройстве.

Сравнение скоростей чтения трёх методов (в миллисекундах)Информация о файле с шрифтами:

  • Размер файла: 500 024 байта
  • Общее число символов: 8 932
  • Размер данных: 54 байта
Исходный метод Новый метод (seek) Новый метод (read)
Открытие файла с шрифтами 27.51 26.22 61.21
Число символов Исходный метод Новый метод (seek) Новый метод (read)
240 13.09 6.50 159.28
227 16.05 8.22 /
767 Ошибка "переполнение памяти" Ошибка "переполнение памяти" /

Примечание: среднее время выполнения

Здесь число символов включает повторяющиеся символы, а фактическое количество уникальных символов будет меньше.

Скорость чтения также зависит от относительного положения символов в таблице индексов; символы, расположенные ближе к началу таблицы, будут находиться быстрее, чем те, что расположены дальше. Чтение слишком большого объёма данных за один раз также может привести к переполнению памяти, поэтому в реальных условиях не рекомендуется читать слишком много данных за один раз.

Ручное вызывание сборщика мусора (gc.collect()) должно быть использовано с осторожностью; это не всегда полезно, и иногда может привести к обратному эффекту.

Для автоматически собираемых объектов, таких как переменные внутри функций, можно избежать необходимости ручной активации сборщика мусора.

Декоратор для отслеживания времени выполнения```python от utime импортировать ticks_us, ticks_diff

def cal_time(fn): def wrapper(*args,**kwargs): start_time = ticks_us() f = fn(*args,**kwargs) print('%s() время выполнения: %sms' % (fn.name, ticks_diff(ticks_us(), start_time) // 1000)) return f return wrapper


### О тестировании скорости

Был создан отдельный файл для тестирования скорости `fontlib_test.py`. Обнаружено явление, связанное с кэшированием, но детали реализации мне неизвестны.

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

* Чтение всех символов за один раз
* Разделение чтения всех символов на части

Результаты отдельного тестирования этих двух методов представлены ниже:

```docs
### Метод: загрузка всего сразу
### 240 символов, получено 111 символов: 1145.765 мс, среднее: 10.32221 мс
### Метод разделенного чтения
### 0 получено 18 символов: 201.403 мс, среднее: 11.18906 мс
...
### 9 получено 22 символа: 169.531 мс, среднее: 7.705955 мс
### 240 символов, получено 197 символов: 1760.472 мс, среднее: 9.978033 мс

Однако одновременный тест этих двух методов показал следующие результаты:

### Метод: загрузка всего сразу
### 240 символов, получено 111 символов: 1145.765 мс, среднее: 10.32221 мс

### Метод разделенного чтения
### 0 получено 18 символов: 110.468 мс, среднее: 6.137111 мс
...
### 9 получено 22 символа: 125.306 мс, среднее: 5.695727 мс
### 240 символов, получено 197 символов: 1170.494 мс, среднее: 6.635651 мс

При изменении порядка тестирования результаты остаются аналогичными:```docs

Разделенный метод чтения

0 получено 18 символов: 201.403 мс, среднее: 11.18906 мс

...

9 получено 22 символа: 169.531 мс, среднее: 7.705955 мс

240 символов, получено 197 символов: 1760.472 мс, среднее: 9.978033 мс

Метод: загрузка всего сразу

240 символов, получено 111 символов: 565.726 мс, среднее: 5.096631 мс

Заключение состоит в том, что независимо от того, загружается ли всё за один раз или по частям, если данные шрифтов для всех символов загружаются заранее, то последующий доступ к этим данным будет значительно быстрее. Однако очевидно, что эта оптимизация не имеет практического значения.

Контакты для сотрудничества и общения

  • Электронная почта: walkline@163.com
  • Группа общения в QQ:
    • Walkline IoT: 163271910
    • Shensai IoT: 31324057

Zouxian IoT Shell IoT

```

Комментарии ( 0 )

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

Введение

Описание недоступно Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/walkline-micropython-new-fontlib.git
git@api.gitlife.ru:oschina-mirror/walkline-micropython-new-fontlib.git
oschina-mirror
walkline-micropython-new-fontlib
walkline-micropython-new-fontlib
master