2008-08-25:

Metaball, Python+Pygame+Psyco i SDL+C++

python:c++:easy

Przez ostatnie kilka dni trwał zlot Vexillium, i mogę spokojnie napisać że był bardzo inspirujący. Między innymi miałem okazję poprowadzić krótką prelekcję na temat old-schoolowych efektów graficznych 2D. Na prelekcji między innymi pojawiły się metaball'e, wraz z niezbyt piękną, ale jak najbardziej działającą implementacją "edukacyjną" (całkowicie niezoptymalizowaną) w SDL+C++ (screen z metaballi widać po lewej). Dodam że całkowity brak optymalizacji tak doskwierał (14 FPS u mnie), że aż stworzyłem wersję na 4 rdzenie. Linki do obu kodów - jednowątkowego i wielowątkowego - są dostępne na końcu posta, a na dniach pojawią się w dziale z kodami (było by szybciej, ale jeszcze takiego działu nie zrobiłem ;p).

Na zlocie podyskutowaliśmy też chwilę o JIT'ach, i powstało pytanie czy Python ma JIT. Okazuje się że normalnie nie, ale jest dostępny zewnętrzny JIT o nazwie Psyco, który obsługuje się bezpośrednio z poziomu kodu skryptu. Wystarczy w swoim kodzie dodać import psyco, oraz wskazać które funkcję mają być kompilowane - psyco.bind(funkcja), lub podać wszystko do kompilacji - psyco.full(), i tyle. Nie trzeba zmieniać interpretera, nie trzeba go patchować, nic z tych rzeczy - po prostu instalacja lub kompilacja+instalacja Psyco, import, i działa.

Muszę przyznać że metoda działania Psyco przypadła mi do gustu, więc postanowiłem przetestować ją w praktyce. Zrobiłem więc port metaballi do Pythona (również 0 optymalizacji), i sprawdziłem jak dużą różnicę robi Psyco. Okazało się iż metaballe w Pythonie bez optymalizacji chodzą z prędkością (hmm wolnością?) jednej klatki co około 2.5 sec. Po zaimportowaniu Psyco i zbindowaniu paru funkcji czas renderingu jednej klatki spadł do 1.1 sec, a zbindowanie całości zmniejszyło go o kolejną dziesiątą część sekundy. Same metaballe może super szybkie się nie stały, ale zysk "za friko" 250% szybkości na tak prostym programie (coś koło 90 linijek nie licząc komentarzy) jest na prawdę niezły! Dodam że do renderingu metaballi użyłem liba pygame, całkiem przyjemnie się w nim klepie (screen po prawej).

OK, na dzisiaj tyle.
P.S. Wrzuciłem do menu link do RSSa, który z jakiegoś niewyjaśnionego powodu wcześniej się tam nie pojawił. Za parę dni powinno mi się udać zrobić jakiś dział z kodami i advisory, i poprzenosić jakieś stare rzeczy.

Kod:
metaballs.cpp (7kb, wymagany libSDL)
metaballs.exe (7kb, wymagana dll'ka od libSDL)
metaballs_4c.cpp (9kb, wymagany libSDL)
metaballs_4c.exe (7kb, wymagana dll'ka od libSDL)
metaballs.py (5kb, wymagany pygame)
metaballs_psyco.py (5kb, wymagany pygame i psyco)

Comments:

2009-05-23 18:19:21 = przemek1234
{
A czy umiałbyś przeportować na do języka C# (którego lepije umiem od C++ [znam tylko podstawy C++]) albo ewentualnie do Java.
}
2009-05-28 08:46:59 = Gynvael Coldwind
{
@przemek1234
Hehe umieć to bym umiał, ale raczej z uwagi na brak czasu nie będę portował powyższego do innych języków, sorry ;<
}
2009-08-20 20:32:13 = przemek1234
{
Po odpowiednim doborze flag kompilacji udało mi się uzyskać 54 FPS. Kompilator: MinGW; System: Vista x64
}
2009-08-21 09:24:24 = Gynvael Coldwind
{
@przemek1234
Z ciekawości, jakie flagi użyłeś i która wersja MinGW ?;>
}
2009-08-22 19:30:57 = przemek1234
{
MinGW 5.1.4, a flagi dobrałem następujące:
"-O3 -march=prescott -mmmx -msse -msse2 -msse3"
}
2009-08-24 21:42:25 = Gynvael Coldwind
{
@przemek1234
Thx ;> Testne potem
}
2011-06-23 20:53:14 = kamil
{
Spróbuj z flagami: -march=native oraz -O2 (albo -O3, IMO różnica nie powinna być zbyt duża), opcja "native" automatycznie dobierze architekturę do aktualnie używanej
}

Add a comment:

Nick:
URL (optional):
Math captcha: 6 ∗ 9 + 10 =