Tuesday, September 30, 2008

Czas na OpenGL :)

Miałem do czynienia z DirectX za czasów DX7. Pamiętam, że z DX8 były problemy (Microsoft Visual Studio się wywalało przy kompilacji i trzeba było ściągać/instalować nową wersję). A z OpenGL... problemów nie było :)

Dlaczego OpenGL? Dlaczego nie DirectX?
Wydajność podobna.
DirectX jest nieprzenośny - ale przyjemny w implementacji.
OpenGL jest przenośny - ale mniej przyjemny w implementacji. Czyżby?
DirectX jest bardziej obiektowy. Jeśli nie używamy klas - wybieramy OpenGL.
DirectX wymaga sprzętu. Jeśli chcemy aby nasz kod można było odpalić bez najnowszej karty graficznej XXX model 999999 - wybieramy OpenGL.
Jeśli chcemy stworzyć małym kosztem grę dla Windows/XBox - wybieramy DirectX.
To tylko wierzchołek góry lodowej :D

Jak?
Właśnie czytam najnowszą specyfikację jeszcze nie zaimplementowanego OpenGL 3.
OpenGL nie ma wbudowanej obsługi plików ani podobnych. Wymaga nieco więcej pracy. Ale w zamian daje większą kontrolę.
Istnieją biblioteki GLU, GLUT, GLX. Dają... sporo. Ale można się obejść i bez nich.
Zaleta (?) OpenGL to nie-klasowy interfejs. Wywołujemy procedury/funkcje i tyle.
W DirectX tworzymy interfejsy, klasy, rozszerzamy je.... i gubimy się w klasach jeśli nie mamy języka obiektowego (np. MASM32).
Za czasów DX8 należało stworzyć interfejs DX5, później DX6, później DX, DX8.... koszmar. Ale poprawili się.
A OpenGL... on działa :)

Brak ci wiedzy i umiejętności? Zacznij z OpenGL - start jest łatwiejszy.

Masz wiedzę i umiejętności? Baw się z DirectX.

Masz duże wiedzę i umiejętności - wróć do OpenGL - daje możliwości takie same jak DirectX, lecz jest przenośny i fajniejszy.

W planach mam jakiś krótki tutorial o OpenGL. Na razie sam czytam i uczę się. Ale może kilak drobiazgów.

1. Aby zachować aktualny "stan świata" używany pushmatrix i popmatrix.

2. Aby stworzyć nowy obiekt (2D lub 3D) tworzymy świat i go konfigurujemy, po czym wpisujemy w BEGIN(); ... END(); kod tworzenia obiektów 3D. Wybór typów obiektów jest szeroki. Ustawiamy vertexy (trójwymiarowe położenia pixeli) oraz ich kolor (odpowiednik 2D to kolor piksla). Dodatkowo możemy ustawić mgłę czy też teksturę. Kolor to PrimaryColor i SecondaryColor. Kolor może się składać np. z wartości RGBA (Red, Green, Blue, Alpha - RGB pozwala wybrać dowolną barwę a wartość A przezroczystość obiektu). I wektory normalne do powierzchni - czyli informacje o tym, jak się od obiektu odbija światło.

3. Chyba już i tak wystarczająco skomplikowałem. Starczy na dziś :)

Wstęp do Oracle

Od kilku miesięcy pracuję z bazą danych Oracle, a dokładniej z danymi w niej gromadzonymi (w tym ładowanymi z plików .CSV za pomocą ORA*LOADERa) oraz procedurami składowanymi PL/SQL.
Moje początki były ciężkie. ALe uczę się szybko - zawsze się szybko uczyłem gdy mnie coś interesowało. Mam nadzieję, że poniższe wskazówki okażą się dla kogoś pomocnymi.

1. Nie bój się tworzenia nowych tabel. Oracle jest w stanie udźwignąć ich na prawdę wiele.

2. Nigdy nie twórz tabel typu "CREATE TABLE (AttributeName VARCHAR(100),AttributeValue(100)". Baza danych Oracle nie jest obiektem C++ - nie dodaje się do niego atrybutów. Jeśli myślisz na sposób C++ - to musisz się nauczyć myśleć inaczej aby sprawnie korzystać z Oracle.
Jeśli stworzysz taką tabelę to m.in. tracisz możliwość kontrolowania wartości, jakie są wpisywane do bazy (np. tylko dane numeryczne... albo ścieżki do plików... albo...).

3. Nie używaj typu VARCHAR - Oracle wyraźnie zachęca do używania typu VARCHAR2 i ostrzega, że VARCHAR zostanie za jakiś czas zmieniony.

4. Nigdy nie twórz zapytań rodzaju "SELECT 1 FROM AuthTable WHERE Username = 'zdzisiek' AND Password = 'ala ma kota'". Chyba, że chcesz stworzyć kod podatny na ataki typu SQL-iniection.
Poprawna forma to: "SELECT 1 FROM AuthTable WHERE UserName = :UserName AND PasswordHash = :PassHash" USING username,passHash.

5. Nigdy nie zapisuj w bazie danych haseł - co najwyżej ich hash. Chyba że masz do czynienia z jednym z tych nielicznych wyjątków, gdzie hasło trzeba zapisać.
Jeśli zapiszesz hasło i ktoś włamie się do bazy - pozyska hasła, które użytkownicy zapewne wykorzystali również w innych miejscach.

6. Metoda w 4. pozwala wykorzystać mechanizm cache bazy danych. Jeśl Oracle zobaczy 2 identyczne zapytania - wykorzysta jeden obiekt do ich obsłużenia - co jest szybsze niż tworzenie odrębnego obiektu.
Zapytania "SELECT 1 FROM Dual" i "SELECT 2 FROM Dual" są różne.
Zapytania "SELECT :1 FROM Dual" USING 1 oraz "SELECT :1 FROM Dual" USING 2 są "takie same".

7. Skoro już wspomniałem o tabeli Dual - jest to tabela stworzona po to, aby wyciągnąć jeden wiersz danych z bazy. Nie z tabeli - z bazy. Patrz na Dual jako na pustą skrzynkę z jednym pustym wierszem. Możesz w ten wiersz wrzucić dowolny inny wiersz - ale tylko jeden.
Przykład: SELECT SYSDATE FROM Dual"

8. Punkt 6. odnosi się do PL/SQL, PERL, Python, oraz wszelkich innych języków. ZAWSZE!

9. Oracle jest drogi. Jeśli nie masz kasy - wybierz PostGreSQL. Jeśli jednak cię na to stać - uderz w Oracle. To na prawdę fajna bazka - choć jak wszystko - tak i ona posiada pewne ograniczenia.

10. Oracle wprowadził typy BLOB i CLOB. Mogą one przechowywać duże ilości danych. Zanim jednak ich użyjesz przemyśl to 10x - korzystanie z nich jestdużo wolniejsze niż np. VARCHAR2.

To na tyle na dzisiaj.