Mniej więcej tydzień temu zdałem sobie sprawę, że lista plików w µTorrent zawiesza się na mniej niż sekundę, ilekroć widoczny jest plik o długiej japońskiej nazwie. Uważałem to za ciekawe, ale tak naprawdę nie miałem czasu się tym martwić, tym bardziej, że ograniczało się to tylko do µTorrent.
Jednak dzisiaj zdałem sobie sprawę, że tak nie jest. Jeśli na przykład zapiszę plik tekstowy z długą nazwą pliku wielobajtowego i otworzę go w Notatniku, otrzymam dziwne wyniki. Kiedy próbuję zmienić rozmiar okna, wszystko spowalnia do indeksowania. Mogę jednak zwolnić uchwyt w oknie i zobaczyć, jak mój kursor dzieli się na dwie części , z których jedna jest kontrolowana przeze mnie, a druga jest rodzajem „kursora-widma” z powodu braku lepszego słowa, które wykonuje ruch przeciągania, który pierwotnie wykonałem za pomocą mysz. Dotyczy to tylko nazw plików tego rodzaju i przetestowałem to również w aplikacjach innych niż Notepad i µTorrent.
Próbowałem szukać wskazówek, co powoduje to dziwne zachowanie, ale nic nie mogę znaleźć. Czy ktoś tu ma jakiś pomysł, co się dzieje?
Niestety nie mogę zrobić zrzutu ekranu, ponieważ wygląda na to, że wszystkie aplikacje zrzutów ekranu zawieszają się, dopóki zmiana rozmiaru nie zostanie zakończona przed zrobieniem zdjęcia ...
Edycja: Nagrałem film pokazujący problem. Nie jestem pewien, czy to pomoże zidentyfikować przyczynę, ale powinno to być przynajmniej lepsze niż moje wyjaśnienie powyżej:
Edycja 2: Oto przykładowy plik zgodnie z żądaniem: Zwróć uwagę, że jest to po prostu pusty plik o długiej wielobajtowej nazwie pliku: http://goo.gl/bgnGP (a dla tych z was, którzy mają przeglądarkę, która nie obsługuje nazwy pliku, oto plik zip: https://dl.dropbox.com/u/55495248/multibyte.zip )
Odpowiedzi:
Mogę wyjaśnić, jak obsługiwany jest Unicode, ale tak naprawdę nie mogę bezpośrednio odpowiedzieć na twoje pytanie. Miałem powolność przy pierwszym pisaniu, ale kiedy to się skończy, znów robi się szybko ...
Unicode składa się z tego, co nazywamy samolotem. Samoloty mają 256 znaków. W wielu sytuacjach czcionki obsługują jedną płaszczyznę, po części, aby uniknąć bardzo dużych plików, ale także dlatego, że wystarcza dla wielu języków (angielski, francuski, niemiecki ...). Jednak języki azjatyckie używają większych czcionek, które obejmują wiele płaszczyzn. Za kompletny japoński zestaw znaków dostaniesz, jeśli mam rację, około 10 samolotów. Chiński jest bardziej (szczególnie tradycyjny chiński!)
Podczas renderowania za pomocą takich czcionek należy wybrać odpowiednią czcionkę (jeśli jedna czcionka nie wystarcza do obsługi wszystkich znaków, system operacyjny przełącza się między czcionkami za Ciebie; to pod maską, ale się zdarza.) To jest czasochłonne. Ponadto, kiedy system po raz pierwszy pisze w tej czcionce, musi załadować go z dysku. Języki azjatyckie mają duże czcionki, co również wymaga czasu.
Wreszcie i prawdopodobnie bardziej prawdopodobne jest to, że napotykasz postacie (lub glify) są na ogół bardziej złożone. To oznacza więcej czasu na renderowanie postaci. Chociaż może to zrobić karta wideo z OpenGL / D3D, w przypadku czcionek nie jest to tak dobre. Tracisz dużo jakości (chociaż jakość czcionki w MS-Windows ...) Tak więc najczęściej robi to procesor.
Ostatnia uwaga, chociaż naprawdę wątpiłbym, że jest to problem, domyślnie Win7 sprawia, że krawędzie okna są półprzezroczyste. Może to być przyczyną problemu. Ta część renderowania jest jednak z pewnością wykonywana za pomocą przyspieszonych funkcji 2D / 3D na karcie wideo.
źródło
Jeśli twój komputer renderuje znak wielobajtowy, idzie wolniej, ponieważ być może musi wykonać więcej niż jedną instrukcję, aby przetworzyć znak.
Wersja 64-bitowa może uzyskać nazwę 64-bitową w 1 wywołaniu, przetworzyć ją w 1 wywołaniu i zapisać w 1 wywołaniu = 3 wywołania.
Wersja 32-bitowa będzie musiała współpracować z pierwszymi 32 bitami, a następnie z pozostałymi 32, a następnie zarządzać obiema operacjami:
pobierz 64-bitową nazwę w 3 połączeniach, przetwarzaj ją w 3 połączeniach i zapisz w 3 połączeniach = 9 połączeń.
źródło