SFML Problem z powolnym wypisywaniem tekstu

0

Stworzyłem program, w którym jedno wykonanie pętli na moim komputerze trwało 140ms, natomiast na starszym sprzęcie program zwalniał do takiego poziomu, że nie dało się grać.

Zacząłem szukać przyczyny jaka funkcja jest aż tak czasochłonna, okazało się że najwięcej, bo aż 125ms potrzebuje funkcja odpowiedzialna za wypisywanie tekstu (nazw graczy, wyników, ogólnych statystyk).

Jedyny pomysł na jaki wpadłem, aby rozwiązać ten problem to stworzenie oddzielnego wątku i okna do wypisywania tych danych, ale jest to niewygodne dla gracza.

Czy zna ktoś przyczynę dlaczego rysowanie tekstu zabiera aż tyle czasu?
Czy jest jakaś metoda, aby np fragment okna był rysowany oddzielnie ( aby jeden wątek rysował planszę, a drugi wypisywał wyniki)?

2

Wild guess...

Nie ładujesz przypadkiem fontu przy każdym rysowaniu ?

1

@Bartłomiej Golenko zapewne podał Ci rozwiązanie, ale odpowiadając na Twoje pytanie czy da się rysować przez 2 wątki jednocześnie to odpowiedź brzmi nie. Zawsze tylko jeden wątek może rysować na ekranie na raz.

2

Weź użyj profilera a dostaniesz dokładną informację gdzie co zwiera dużo czasu.
Visual Studio ma bardzo dobry prolifer, który działa na dowolnym buildzie (najlepiej używać build reaslse, by wyniki były bardziej miarodajne).
Wtedy okaże się co jest głównym problemem rysowania tekstu i czy faktycznie font jest ładowany za każdym razem.

Rysowanie tekstu to dość skomplikowana sprawa:

  • najpierw trzeba kodowanie (np UTF-8) zamienić na znaki
  • załadować właściwy font a jak go nie ma to jego zastępstwo (oby tylko raz na długi czas).
  • potem do tych znaków przypisać glifów(często jeden znak to kilka glifów)
  • potem jeszcze ułożyć glify według ścisłych zasad, zawijając wiersze jeśli to konieczne

Dlatego renderowanie w grach tekstu jest często cachowane. Najprostsza metoda tekst narysować raz do obrazka i rysować obrazek (jak tekst się zmienia to aktualizujesz obrazek).
Przykładowo Qt dostarcza klasę do takich optymalizacji: QStaticText

1 użytkowników online, w tym zalogowanych: 0, gości: 1