11

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

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

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

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

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

https://vimeo.com/58619918

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

2 ответа2

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 вызовов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .