Почему рендеринг многобайтовых последовательностей символов невероятно медленен?

11

Около недели назад я понял, что список файлов в µTorrent будет зависать меньше секунды, когда будет виден файл с длинным японским именем. Мне показалось это любопытным, но у меня не было времени беспокоиться об этом, тем более что он ограничивался только µTorrent.

Однако сегодня я понял, что это не так. Например, если я сохраню текстовый файл с длинным именем файла многобайтовых символов и открою его в блокноте, я получу странные результаты. Когда я пытаюсь изменить размер окна, все замедляется. Однако я могу отпустить захват окна и посмотреть, как мой курсор распадается на две части , одна из которых управляется мной, а другая является своего рода «призрачным курсором» из-за отсутствия лучшего слова, которое выполняет перетаскивающее движение, которое я первоначально сделал с помощью мышь. Это относится только к именам файлов такого рода, и я проверил это в других приложениях, кроме Notepad и µTorrent.

Я пытался найти подсказки относительно того, что вызывает это странное поведение, но я не могу ничего найти. Кто-нибудь здесь имеет представление о том, что происходит?

К сожалению, я не могу сделать снимок экрана, так как кажется, что все приложения для снимков экрана зависают, пока изменение размера не будет завершено, прежде чем делать снимок

Изменить: я записал видео, демонстрирующее проблему. Я не уверен, поможет ли это в определении причины, но это должно быть по крайней мере лучше, чем мое объяснение выше:

https://vimeo.com/58619918

Изменить 2: Вот пример файла в соответствии с запросом: Обратите внимание, что это просто пустой файл с длинным многобайтовым именем файла: http://goo.gl/bgnGP (А для тех из вас, у кого браузер не может обработать имя файла, вот zip-файл: https://dl.dropbox.com/u/55495248/multibyte.zip )

Merigrim
источник
Сначала я собирался загрузить его на YouTube, но, видимо, без «обновления» вашей учетной записи невозможно показать свое настоящее имя. Спасибо, не надо. Я надеюсь, что с Вимео все в порядке.
Меригрим
Не могли бы вы рассказать нам немного о компьютере? В частности, видеокарта, которую вы используете (или это видеокарта внутри чипа? Обновлены ли драйверы видео? Проблемы с рендерингом могут быть вызваны видео, а не Windows ....
woliveirajr
1
@woliveirajr Конечно. Вот раздетый DxDiag.txt (содержит информацию о процессоре, графическом процессоре, памяти и т. Д.): Pastebin.com/eYvS8mGL Я думаю, что прошел месяц или два с тех пор, как я обновил свои видеодрайверы, я попробую.
Меригрим
2
Попробуйте первый ответ на вопрос superuser.com/questions/371282/… и посмотрите, поможет ли это ...
woliveirajr
1
а также (по той же ссылке выше) заметка о support.microsoft.com/kb/2505438
woliveirajr

Ответы:

1

Я могу объяснить, как работает Unicode, но я не могу прямо ответить на ваш вопрос. У меня была медлительность для первой записи, но как только это будет сделано, она снова станет быстрой ...

Юникод состоит из того, что мы называем самолетами. Самолеты 256 символов. Во многих ситуациях шрифты обрабатывают одну плоскость, частично для того, чтобы избежать очень больших файлов, а также потому, что этого достаточно для многих языков (английский, французский, немецкий ...). Тем не менее, азиатские языки используют более крупные шрифты, которые охватывают несколько плоскостей. Для полного набора символов японского языка вы получите, если я прав, около 10 самолетов. Китайский больше (особенно традиционный китайский!)

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

Наконец, и это, вероятно, более вероятно, с чем вы сталкиваетесь, символы (или глифы), как правило, более сложные. Это означает больше времени для рендеринга персонажей. Хотя это может быть сделано с помощью видеокарты с OpenGL / D3D, для шрифтов это не так хорошо. Вы теряете много качества (хотя качество шрифта под MS-Windows ...), поэтому чаще всего это делает процессор.

Последнее замечание, хотя я действительно сомневаюсь, что это проблема, по умолчанию Win7 делает края окна полупрозрачными. Может быть, это добавляет к проблеме. Однако эта часть рендеринга, скорее всего, выполняется с помощью ускоренных 2D / 3D-функций на вашей видеоплате.

Алексис Уилке
источник
-1

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

64-битная версия может получить 64-битное имя за 1 вызов, обработать его за 1 вызов и сохранить в 1 вызове = 3 вызова.

32-битная версия должна работать с первыми 32 битами, затем с другими 32, а затем управлять обеими операциями:

получить 64-битное имя в 3 вызова, обработать его в 3 вызова и сохранить его в 3 вызова = 9 вызовов.

AskPGSV
источник
Извлечение и хранение символов - это лишь малая часть выполненной обработки.
vonbrand