Warum ist das Rendern von Multibyte-Zeichenfolgen unglaublich langsam?

11

Vor ungefähr einer Woche wurde mir klar, dass die Dateiliste in µTorrent weniger als eine Sekunde lang hängen bleibt, wenn eine Datei mit einem langen japanischen Dateinamen sichtbar ist. Ich fand es merkwürdig, aber ich hatte zu diesem Zeitpunkt keine Zeit, mir darüber Sorgen zu machen, zumal es nur auf µTorrent beschränkt war.

Heute habe ich jedoch festgestellt, dass dies nicht der Fall ist. Wenn ich zum Beispiel eine Textdatei mit einem langen Namen einer Multibyte-Zeichendatei speichere und sie im Editor öffne, erhalte ich einige seltsame Ergebnisse. Wenn ich versuche, die Größe des Fensters zu ändern, wird alles langsamer. Ich kann jedoch das Fenster loslassen und sehen, wie sich mein Cursor in zwei Teile teilt , wobei einer von mir gesteuert wird und der andere eine Art "Geistercursor" ist, da kein besseres Wort vorhanden ist, das die Ziehbewegung ausführt, die ich ursprünglich mit dem gemacht habe Maus. Dies gilt nur für Dateinamen dieser Art, und ich habe sie auch in anderen Anwendungen als Notepad und µTorrent getestet.

Ich habe versucht, nach Hinweisen zu suchen, was dieses seltsame Verhalten verursacht, aber ich kann nichts finden. Hat hier jemand eine Idee, was los ist?

Leider kann ich keinen Screenshot davon machen, da anscheinend alle Screenshot-Anwendungen hängen bleiben, bis die Größenänderung abgeschlossen ist, bevor die Aufnahme gemacht wird ...

Bearbeiten: Ich habe ein Video aufgenommen, das das Problem demonstriert. Ich bin mir nicht sicher, ob dies bei der Identifizierung der Ursache hilfreich sein wird, aber es sollte zumindest besser sein als meine obige Erklärung:

https://vimeo.com/58619918

Bearbeiten 2: Hier ist eine angeforderte Beispieldatei: Beachten Sie, dass es sich lediglich um eine leere Datei mit einem langen Multibyte-Dateinamen handelt: http://goo.gl/bgnGP (Und für diejenigen unter Ihnen, die einen Browser haben, der den Dateinamen nicht verarbeiten kann, hier die folgende eine Zip-Datei: https://dl.dropbox.com/u/55495248/multibyte.zip )

Merigrim
quelle
Ich wollte es zuerst auf YouTube hochladen, aber anscheinend ist es unmöglich, ohne dein Konto zu "aktualisieren", um deinen richtigen Namen anzuzeigen. Nein Danke. Ich hoffe Vimeo geht es gut.
Merigrim
Können Sie uns einige Details zum Computer mitteilen? Insbesondere die Grafikkarte, die Sie verwenden (oder sind es diese Videoboards im Chip? Sind die Videotreiber aktualisiert? Rendering-Probleme können durch Videos verursacht werden, nicht durch Windows ...
Woliveirajr
1
@ Woliveirajr Sicher. Hier ist eine abgespeckte DxDiag.txt (enthält Informationen zu CPU, GPU, Speicher usw.): pastebin.com/eYvS8mGL Ich glaube, es ist ein oder zwei Monate her, seit ich meine Grafiktreiber aktualisiert habe. Ich werde es versuchen.
Merigrim
2
Versuchen Sie die erste Antwort auf die Frage superuser.com/questions/371282/… und sehen Sie, ob es hilft ...
woliveirajr
1
und auch (im selben Link oben) den Hinweis über support.microsoft.com/kb/2505438
woliveirajr

Antworten:

1

Ich kann erklären, wie mit Unicode umgegangen wird, aber ich kann Ihre Frage nicht direkt beantworten. Ich hatte beim ersten Schreiben Langsamkeit, aber sobald das erledigt ist, wird es wieder schnell ...

Unicode besteht aus dem, was wir Flugzeuge nennen. Flugzeuge bestehen aus 256 Zeichen. In vielen Situationen verarbeiten Schriftarten eine Ebene, teilweise um sehr große Dateien zu vermeiden, aber auch, weil dies für viele Sprachen (Englisch, Französisch, Deutsch ...) ausreicht. In asiatischen Sprachen werden jedoch größere Schriftarten verwendet, die mehrere Ebenen abdecken. Für einen vollständigen japanischen Zeichensatz würden Sie, wenn ich richtig bin, ungefähr 10 Flugzeuge erhalten. Chinesisch ist mehr (besonders traditionelles Chinesisch!)

Beim Rendern mit solchen Schriftarten müssen Sie die entsprechende Schriftart auswählen (wenn eine Schriftart nicht ausreicht, um alle Zeichen zu verarbeiten, wechselt das Betriebssystem für Sie zwischen den Schriftarten; das ist unter der Haube, aber es passiert.) Das ist zeitaufwändig. Wenn das System diese Schriftart zum ersten Mal schreibt, muss es von der Festplatte geladen werden. Asiatische Sprachen mit großen Schriftarten brauchen auch Zeit.

Schließlich, und das ist wahrscheinlich wahrscheinlicher, was Sie begegnen, sind die Zeichen (oder Glyphen) im Allgemeinen komplexer. Das bedeutet mehr Zeit zum Rendern der Zeichen. Obwohl dies mit der Videokarte mit OpenGL / D3D möglich ist, ist dies für Schriftarten nicht so gut. Sie verlieren viel Qualität (obwohl die Schriftqualität unter MS-Windows ...). Dies wird also meistens vom Prozessor durchgeführt.

Ein letzter Hinweis, obwohl ich wirklich bezweifle, dass dies ein Problem ist, macht Win7 die Fensterkanten standardmäßig halbtransparent. Es könnte sein, dass das Problem noch größer wird. Dieser Teil des Renderns wird jedoch mit Sicherheit mit beschleunigten 2D / 3D-Funktionen auf Ihrer Videokarte ausgeführt.

Alexis Wilke
quelle
-1

Wenn Ihr PC ein Multibyte-Zeichen rendert, wird es langsamer, da möglicherweise mehr als eine Anweisung ausgeführt werden muss, um das Zeichen zu verarbeiten.

Eine 64-Bit-Version könnte den 64-Bit-Namen in einem Aufruf erhalten, ihn in einem Aufruf verarbeiten und in einem Aufruf = 3 Aufrufen speichern.

Eine 32-Bit-Version muss mit den ersten 32 Bit und dann mit den anderen 32 Bit arbeiten und dann beide Vorgänge verwalten:

Holen Sie sich den 64-Bit-Namen in 3 Aufrufen, verarbeiten Sie ihn in 3 Aufrufen und speichern Sie ihn in 3 Aufrufen = 9 Aufrufen.

AskPGSV
quelle
Das Abrufen und Speichern von Zeichen ist nur ein winziger Teil der durchgeführten Verarbeitung.
vonbrand