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

Я хочу ускорить поиск глифов в моем приложении Cortex-M4 для тех шрифтов, которые интенсивно используются, добавив дополнительную таблицу поиска. То, что я сейчас имею, — упрощенное и псевдо-иш — это:

в fontname-font.cpp:

static const uint8_t someFont = {
headerbytes[knownHeaderSize],
glyph[knownGlyphCount]
};

Размер каждого глифа зависит от глифа. Некоторые в основном пустые (например, пробел), некоторые больше (например, ‘M’). Размер каждого глифа хранится в заголовке глифа, так что я могу перебрать шрифт и выяснить, по какому смещению (someFont[offset]) глиф с кодом code начинается.

в fontname-map.cpp:

static const uint16_t someFont_lut[knownGlyphCount];

так что я могу использовать someFont[someFont_lut[code]] если LUT включен.

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

Я хотел бы уменьшить интерфейс приложения до чего-то вроде

Glyph Font::operator[](const char& c);

где Glyph может быть просто указателем на глиф, хранящийся во флэш-памяти, или прокси-объектом, который можно использовать для извлечения данных глифа из флэш-памяти. Наличие и использование LUT должно быть скрыто за этим оператором.

Я использую gcc, и предложения могут быть специфичными для gcc. Какие шрифты должны содержать LUT, известно во время компиляции.


Добавлено: Я хотел бы, чтобы решение не позволяло мне смешивать глифы одного шрифта с LUT другого шрифта. я хочу уточнить если LUT используется, а не который то есть. Класс чтения шрифта должен найти его самостоятельно.

0

Решение

С вашей спецификацией вам просто нужно написать два класса шрифтов с одинаковым интерфейсом. Один использует медленный «operator []», а второй создает быстрый «operator []», учитывая LUT. Функции, которые используют шрифт, должны быть настроены на тип шрифта.

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

Поскольку шаблонное решение даже позволяет смешивать «фиксированные» шрифты, как описано в предыдущем разделе, с «динамическими» шрифтами, где вызываемая функция получает указатель на структуру данных (класс «динамический шрифт»), указывающий на символьные данные или символ данные и опционально LUT.

Если ваш главный вопрос касается не связывания LUT, если ваш код не использует его: просто скомпилируйте все файлы fontname-xxx.cpp в отдельные объектные файлы и положить их в статическую библиотеку. Когда вы используете эту библиотеку, компилятор выбирает только те объекты, на которые вы ссылаетесь в вашем приложении.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]