2009-07-04 17 views
6

Gram w pygame (na Debianie/Lennym). Wygląda na to, że działa dobrze, z wyjątkiem denerwującego łzawienia blits (tryb pełnoekranowy lub okienkowy).Jak uniknąć łzawienia za pomocą pygame w systemie Linux/X11

Używam domyślnego sterownika SDL X11. Googling sugeruje, że jest to znany problem z SDL, że X11 nie zapewnia funkcji vsync (nawet z ekranem utworzonym z flagami FULLSCREEN|DOUBLEBUF|HWSURFACE), a zamiast tego powinienem użyć sterownika "dga".

Jednak działa

SDL_VIDEODRIVER=dga ./mygame.py 

rzuca w Pygame inicjalizacji z

pygame.error: No available video device 

(mimo xdpyinfo pokazując rozszerzenie XFree86-DGA obecny).

A więc: jaka jest sztuczka polegająca na uzyskiwaniu niezrewolucjonowanych flipów bez łez? Czy to działa, czy działa dga lub jakiś inny mechanizm?

+1

Masz odpowiedni sterownik jądra do karty graficznej. W przypadku X11 potrzebny jest zarówno sterownik jądra, jak i biblioteka X11, aby uzyskać do niego dostęp. Jeśli czegoś brakuje, drugi będzie działał, ale będzie bezużyteczny. – SingleNegationElimination

+0

Jestem trochę zaskoczony tym, że http://packages.debian.org/lenny/libxxf86dga1, który wydaje się dostarczać DGA w X11, nie wspomina nic o modułach jądra (co by to pokazało jak w lsmod?). O ile warto, używam sterownika nv xorg ze starą 5-kartową kartą AGP NVidia. – timday

Odpowiedz

4

Moim ostatecznym rozwiązaniem było przejście na Pyglet, które wydaje się obsługiwać OpenGL znacznie lepiej niż Pygame i nie ma żadnych problemów z migotaniem.

+1

Pyglet jest również dużo bliższy interfejsowi API i innym bibliotekom graficznym dla innych języków i nowoczesnych technologii. – Jotham

+0

[Gloss] (http://www.tuxradar.com/gloss) to kolejna opcja, jeśli nie chcesz iść całą drogę. Łączy OpenGL w łatwych klasach i metodach i ładnie gra wzdłuż Pygame. – fbmd

4

Najlepszym sposobem na ograniczenie do minimum szarpnięć jest utrzymanie częstotliwości ramki tak blisko częstotliwości ekranu, jak to możliwe. Biblioteka SDL nie ma funkcji vsync, chyba że używasz OpenGL przez nią, więc jedynym sposobem jest przybliżenie liczby klatek na sekundę. Podwójny bufor sprzętowy SDL nie jest gwarantowany, chociaż ładnie działa. Rzadko widziałem to w akcji.

Z mojego doświadczenia z SDL trzeba korzystać z OpenGL, aby całkowicie wyeliminować łzawienie. To trochę korekty, ale rysowanie prostych tekstur 2D nie jest aż tak skomplikowane i dostajesz kilka innych dodanych bonusów, które możesz zaimplementować, jak obrót, skalowanie, mieszanie i tak dalej.

Jeśli jednak nadal chcesz korzystać z renderowania oprogramowania, zalecam aktualizację w postaci brudnego prostokąta. Przyzwyczajenie się do tego jest nieco trudniejsze, ale oszczędza mnóstwo przetwarzania, co może ułatwić aktualizację aktualizacji i pozwala uniknąć wyświetlania całego ekranu (chyba że przewijasz cały obszar gry lub coś takiego). Oprócz czasu potrzebnego na narysowanie bufora jest minimalny czas, który może zapobiec zderzeniu, które ma miejsce podczas aktualizacji ekranu, co jest przyczyną rozdzierania.

Powiązane problemy