Чтение и отображение пользовательских шрифтов с помощью 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
>>>
Это метод упрощения части кода, не относящегося к MicroPython, в файле fontlib.py
, компиляции его в байт-код и последующего тестирования
# Загрузка файла
$ ab abconfig-mpy
Поскольку загружаемый файл уже содержит main.py
, достаточно просто перезапустить плату и выбрать нужные опции по указанию, чтобы увидеть результат
Методы см. в разделе Генерация шрифтов из символьных шрифтов
Кодировка GB2312 включает в себя 682 полноклеточных символов, в том числе латинские буквы, греческие буквы, японские хирогана и катакана, а также русские кириллические буквыСимволы можно ввести через клавиатуру, но это может быть неудобно. Однако они могут быть просмотрены и скопированы непосредственно со страницы таблицы кодировки GB2312### О скорости
На примере текущего файла шрифта:
- Название файла:
combined.bin
- Размер файла:
261,972
байт- Размер таблицы индекса GB2312:
17,672
байт- Размер пикселей:
16x16
- Размер данных символа:
32
байт- Общее количество символов:
7710
(включая ASCII и GB2312)
Факторы, влияющие на скорость отображения, включают:
Что касается отображения, библиотека MicroPython
, предоставляющая драйвер SSD1306
, уже использует FrameBuffer
для управления данными. Я доверяю способностям официальной команды, поэтому предположу, что скорость отображения достигла своего максимума.
Что касается чтения данных, первоначальный подход был направлен на выполнение базовой функциональности, следовательно, процесс чтения выглядел так:1. Открытие файла с шрифтами 2. Выбор одного символа 3. "Партиционированное" поиск смещения символа в таблице индексов 4. "Перемещение" к найденному смещению для чтения данных шрифта 5. Возврат к шагу 2 до полной загрузки всех символов
"Партиционированное" означает: при открытии файла в Python нет возможности для прямого поиска, поэтому требуется сначала прочитать содержимое файла, чтобы найти нужное значение. Для устройства с ограниченной памятью одновременное чтение всего файла вызывает ошибку "переполнение памяти". Поэтому данные должны читаться порциями.
Проблема данного метода заключается в том, что каждый символ требует поиска начального положения в таблице индексов, что является нерациональным использованием времени.
Для увеличения скорости было решено выполнять поиск всех символов во время каждого "партиционированного" чтения, тем самым снижая количество операций "партиционирования".
Проведённый анализ показал, что использование read
вместо seek
может повысить эффективность "перемещения", но это также имеет серьёзный недостаток — даже если данные, полученные через read
, не используются, они всё равно занимают место в памяти, что делает этот метод менее эффективным на устройстве.
Сравнение скоростей чтения трёх методов (в миллисекундах)Информация о файле с шрифтами:
Исходный метод | Новый метод (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 )