Archive for May 2008

Wakacje

Wreszcie skończyły mi się matury, przyszedł czas na odpoczynek i kodzenie. Będę mógł zająć się czytaniem książek, z których pozostało mi aktualnie ok. 3000 stron ;). Z drugiej strony trzeba poszukać sobie jakiejś pracy na wakacje.

Już wcześniej postanowiłem, że napiszę klona tetrisa w 3D, więc biorę się do roboty, mam nadzieję, że szybko mi to pójdzie :).

Optymalizacje

Kod który piszemy nigdy nie jest idealny, zawsze można coś poprawić, przyspieszyć. Dowiedziałem się również, że czasami jednak warto zostawiać kod taki jak jest, np. pętle for:
for(int i = 0; i < cos; i++)
ponieważ kompilator potrafi to zoptymalizować sam, a wszelkie próby działań na własną rękę mogą tylko zaciemnić mu kod. Postanowiłem poszukać co podoba się kompilatorowi msvc i natrafiłem na dość ciekawą stronę: link. Nie jest to może dokładnie to czego szukałem, ale jest to coś, co może się bardzo przydać. Postaram się zagłębić w tę lekturę w chwili wolnego czasu.

Błąd kompilatora

Udało mi się wreszcie opanować kawałek kodu, który męczył mnie od 2 dni. Okazało się, że umieściłem w strukturze, która była agregatem, referencję. Następnie zainicjalizowałem obiekt takiej struktury jako agregat. Wszystko było ładnie, dopóki nie postanowiłem przestawić kompilacji z Debug na Release. Aplikacja zaczęła się sypać. Dzisiaj udało mi się wreszcie znaleźć ten błąd, który tkwił w referencji umieszczonej w agregacie, po jej usunięciu wszystko było ok.

Myślę, że jest to błąd kompilatora, który powinien przynajmniej ostrzegać o próbie inicjalizacji referencji w agregacie. Wynik takiej operacji jest niestety niezdefiniowany.

Książki za darmo

NVIDIA od jakiegoś czasu udostępnia książki na swojej stronie za darmo. Dotychczas w pełni ukazały się:

Dzisiaj NVIDIA udostępniła pierwsze trzy rozdziały kolejnych perełek, czyli GPU Gems 2. Kolejne rozdziały będą udostępniane po trzy, co tydzień, aż do 25 sierpnia, czyli do wielkiego wydarzenia jakim jest NVISION.

Myślę, że to wspaniały gest ze strony NVIDII, ponieważ te książki są doskonałym źródłem informacji dla ludzi zajmujących się programowaniem grafiki. Co prawda mam już książkę pt. Język Cg, ale pozostałych nie będę musiał kupować :).

SSE i SSE 2 w Visual 2008

Przeglądając opcje projektu w Visual C++ 2008 Express Edition natrafiłem na opcję, która umożliwia kompilatorowi użycie dodatkowych instrukcji procesora z zestawów SSE i SSE2. Niestety nie wiem, które co i jak kompilator może zoptymalizować, ale myślę, że warto ustawić tę opcję na minimum SSE. A nuż coś pomoże. Aby uaktywnić tę opcję należy wejść do opcji projektu -> C++ -> Code Generation -> Enable Enhanced Instruction Set.

Próba uruchomienia programu zoptymalizowanego pod instrukcje wyższego zestawu po prostu się nie powiedzie, ale w dzisiejszych czasach kiedy dostępny jest zestaw instrukcji SSE3, można sobie pozwolić na minimum SSE.

Sztuczny Device Lost w Viście

Zajmując się ostatnio moim silnikiem, natrafiłem na jedną bardzo ciekawą zaletę Visty. Otóż przypadkiem odkryłem jak sztucznie wywołać utratę urządzenia w DirectGraphics. Wystarczy do tego użyć Ctrl + Alt + Del, gdyż Vista w tym momencie przechodzi na ekran wyboru czynności, więc prawdopodobnie przejmuje całkowitą kontrolę nad urządzeniem, czego skutkiem (pewnie ubocznym) jest utrata urządzenia.

Mnie ta sztuczka się bardzo przydała, ponieważ dzięki temu wykryłem, że miałem problem z odzyskiwaniem urządzenia.

Assert

Ostatnio dowiedziałem się o bardzo fajnej funkcji jaką udostępnia biblioteka standardowa, czyli o funkcji Assert. Funkcja ta ma tę zaletę, że warunek, który jej przekazujemy jest sprawdzany tylko, gdy jest umieścimy definicje NDEBUG. Wtedy, gdy warunek zwróci fałsz, zostaje wyświetlone okienko, gdzie i kiedy miało zdarzenie. W przeciwnym wypadku, gdy nie zdefiniujemy NDEBUG, sprawdzanie warunku po prostu znika, dzięki czemu osiągamy większą wydajność.

Oczywiście standardowa makrodefinicja nie jest idealna, ponieważ wyświetla różne rodzaje okienka w zależności od tego, czy używamy main czy WinMain. Ale napisanie swojego odpowiednika tej funkcji nie nastręcza problemów, wystarczy się przyjrzeć makrodefinicji zawartej w pliku assert.h. Polecam również artykuł w książce Perełki Programowania Gier część pierwsza, rozdział 1.12. Są tam świetne porady na ten temat.