Информация об изменениях

Сообщение Быстрый рендер текста средствами Qt возможен? от 24.06.2021 7:29

Изменено 24.06.2021 7:30 A.J.

Быстрый рендер теста средствами Qt возможен?
Приветствую!
Уже постил это на stackoverflow, но похоже что там мало специалистов по Qt, может тут кто подскажет)

Суть задачи: мне нужно быстро рисовать текст средствами Qt Widgets.

По сути, нужна функция, аналогичная функции WinAPI TabbedTextOut (то есть, не нужно переносить слова или считать высоту).

QPainter.drawText поразил медлительностью. Он в целом не очень быстр, но рендер некоторых символов Unicode
(смайликов) занимает вплоть до 500мс (на Ryzen 3900x)! Похоже, что там под капотом делается много чего ненужного.

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

Что я пробовал:
— Готовить отрендеренный текст заранее в рабочем потоке (в пуле потоков), в виде QImage.
Работает неплохо, но быстрая прокрутка тем не менее быстро исчерпывает кэш и приводит к затыкам.
Кроме того, кэш из QImage занимает много памяти.

— QML ListView. На самом деле это не намного быстрее, и со своими сложностями, так что я бы
предпочел решение только для виджетов.

— QStaticText. По-прежнему не решает проблему исчерпания кеша.
— QTextLayout. То же самое, кэш быстро заканчивается.

P.S. Qt 5.15 на Windows 10.

Спасибо!
Быстрый рендер текста средствами Qt возможен?
Приветствую!
Уже постил это на stackoverflow, но похоже что там мало специалистов по Qt, может тут кто подскажет)

Суть задачи: мне нужно быстро рисовать текст средствами Qt Widgets.

По сути, нужна функция, аналогичная функции WinAPI TabbedTextOut (то есть, не нужно переносить слова или считать высоту).

QPainter.drawText поразил медлительностью. Он в целом не очень быстр, но рендер некоторых символов Unicode
(смайликов) занимает вплоть до 500мс (на Ryzen 3900x)! Похоже, что там под капотом делается много чего ненужного.

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

Что я пробовал:
— Готовить отрендеренный текст заранее в рабочем потоке (в пуле потоков), в виде QImage.
Работает неплохо, но быстрая прокрутка тем не менее быстро исчерпывает кэш и приводит к затыкам.
Кроме того, кэш из QImage занимает много памяти.

— QML ListView. На самом деле это не намного быстрее, и со своими сложностями, так что я бы
предпочел решение только для виджетов.

— QStaticText. По-прежнему не решает проблему исчерпания кеша.
— QTextLayout. То же самое, кэш быстро заканчивается.

P.S. Qt 5.15 на Windows 10.

Спасибо!