2015-10-20 23 views
6

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.

+0

Podaj [mcve]. – Meefte

Odpowiedz

4

W tym konkretnym przypadku występuje błąd w sterowniku OpenGL na platformie, z którą pracuję. Wpływa na odczyty FBO. Ustawienie QML_USE_GLYPHCACHE_WORKAROUND = 1 w środowisku wymusza Qt, aby zachować dodatkową kopię pamięci podręcznej glifów w pamięci RAM (ponieważ nie można jej odczytać ze sprzętu graficznego po dodaniu nowych glifów).

Wynika z tego, że podczas renderowania będzie poprawne (ponieważ używamy drugiej pamięci podręcznej, która nie jest uszkodzona) wydajność będzie nieco spadła, ponieważ istnieje dodatkowa kopia procesora i pamięć podręczna glifów będzie używać dwa razy więcej pamięci. Jakość renderingu pozostaje nienaruszona.

Wsparcie Qt było w stanie wskazać mi właściwy kierunek i zakwalifikować implikacje związane z QML_USE_GLYPHCACHE_WORKAROUND.

+0

"Wydajność ulegnie nieznacznemu pogorszeniu" Dostrzegam coś, co wydaje się polepszać wydajność, podczas renderowania różnych tekstów co 50 milisekund, które byłyby zatrzymywane czasami bez GLYCHCHACHE_WORKAROUND, z tym, że renderowanie tekstu wydaje się działać bardziej konsekwentnie. – SketchBookGames

+0

"Jakość renderowania jest niezmieniona", w związku z czym wyniki renderowania również nieznacznie się zmieniają. w jednym z przykładów moja zawartość ContentWidth wynosiła 500, a obecnie 502, a contentHeight 40, a teraz 46 – SketchBookGames

Powiązane problemy