Moja aplikacja umożliwia użytkownikowi przełączanie języków w locie. Widzę, że około 10% czasu, w którym użytkownik przełącza się na chiński lub japoński, glify tekstu interfejsu są renderowane nieprawidłowo.Dlaczego mój tekst QJ CJK jest renderowany z uszkodzonymi glifami?
Ta aplikacja działa pod Linuksem na platformie iMX6. Używa Qt 5.5.0. QML służy do renderowania interfejsu użytkownika. Zepsuty tekst jest renderowany za pomocą kontrolki QML Text.
Example of corrupt font rendering
Czcionka używana w pytaniu Źródło Hans Sans Regular. Próbowałem ładowania tego przy użyciu FontLoader QML i ładowanie go po stronie C++ do bazy danych czcionek aplikacji (obie metody wykazały problem). Próbowałem już używać (bardzo mocno powiązanych) czcionek Noto; taki sam problem.
Nigdy nie widziałem korupcji renderowania tekstu podczas używania Roboto do tekstów innych niż CJK i, jak wspomniano, działa to częściej niż w przypadku CJK/Source Hans Sans.
Uszkodzenie jest interesujące, ponieważ wygląda na renderowanym poziomie bitmapy, a nie na poziomie definicji glifu (zauważ, że niektóre glify mają poprawioną dolną połowę, ale górna połowa jest uszkodzona).
Korupcja czasami się rozwija. To prowadzi mnie do myślenia, że pamięć podręczna bitmapy Glif jest nadpisywana dalej (tylko teoria, ponieważ nie jestem pewien, jak Qt renderuje czcionki). Pomyślałem, że może to być kolekcja śmieci QML robiąca coś dziwnego, ale ładowanie czcionki po stronie C++ nie miało znaczenia.
Mam zamiar spróbować użyć "renderowania natywnego" dla elementów sterujących Tekstem QML.
Czy ktoś to widział wcześniej? Czy ktoś może potwierdzić, że FreeType służy do zarządzania/renderowania czcionek w Qt 5.5.0? Czy istnieją sposoby wpływania na sposób zarządzania pamięcią podręczną bitmapy czcionki?
Dzięki!
Aktualizacja: użycie "renderType: Text.NativeRendering" nie wyeliminowało problemu (chociaż korupcja manifestowała się nieco inaczej). I, biorąc pod uwagę ograniczenia tego trybu, skończyło się generalnie słabo renderowanym tekstem (miękkie, słabe skalowanie itp. - as documented).
Aktualizacja 2: Zbudowałem Qt z (o ile wiem) wszystkich glifów buforuje niepełnosprawnych - shouldDrawCachedGlyphs() zwraca wartość false w moim lokalnym zbudować dla czterech przypadków tej rozmowy udało mi się znaleźć - - ale wciąż napotykamy na uszkodzenie glifu.
Aktualizacja 3: Próbowano przełączania korzystanie z oprogramowania (nie OpenGL) QT Szybki 2 renderujący ustawiając QMLSCENE_DEVICE = softwarecontext per docs; Zniszczenie glifów wciąż miało miejsce.
Podaj [mcve]. – Meefte