January 2008

Uwaga! Informacje na tej stronie mają ponad 3 lata. Nadal je udostępniam, ale prawdopodobnie nie odzwierciedlają one mojej aktualnej wiedzy ani przekonań.

22:38
Thu
31
Jan 2008

Zespół Aspergera

Ktoś przyniósł ostatnio na kanał #warsztat link do hasła Wikipedii omawiającego Zespół Aspergera. To rodzaj autyzmu, który charakteryzują przede wszystkim:

Czyżby nauka odkryła i nazwała to, co komputerowcy mają na myśli mówiąc, że ktoś jest nerdem? Ten pomysł nie jest nowy. Mówi o tym choćby intrygujący artykuł na portalu Wired - The Geek Syndrome. W Sieci można też znaleźć wiele notek blogowych na ten temat. O cierpienie na ten zespół podejrzewa się m.in. Isaaca Newtona, Alberta Eisteina, a nawet... Richarda Stallmana i Billa Gatesa!

Nie ma chyba sensu diagnozować się w tym kierunku - w końcu to i tak jest nieuleczalne. Z resztą kto z nas chciałby wyleczyć się z programowania? Jeśli jednak, to można spróbować metod ludowych - jeden z nas stwierdził na kanale, że lekarstwem jest etanol :)

Comments (0) | Tags: humor psychiatry | Author: Adam Sawicki | Share

11:09
Tue
29
Jan 2008

Metoda szablonowa zamiast rzutowania

Wpadłem ostatnio na pomysł, żeby się z wami podzielić drobnym rozwiązaniem, które wymyśliłem i które stosuję od dawna w swoim kodzie. Jako przykład weźmy manager zasobów. U mnie jest jeden ogólny, a każda klasa zasobu dziedziczy ze wspólnej klasy bazowej IResource. Są więc klasy pochodne takie jak D3dTexture czy FmodSound. Zasobów używam przez wskaźnik, ale ponieważ ich lista jest zapisana w pliku tekstowym, trzeba taki wskaźnik najpierw pobrać na podstawie nazwy. Trzeba przy tym zrzutować otrzymany zasób w dół na określony typ pochodny. Można to zrobić tak:

res::D3dTexture *Tex =
  (res::D3dTexture*)res::g_Manager->MustGetResource(L"Potwór01");
Tex->Cośtam();

lub bezpieczniej ze względu na typ:

res::D3dTexture *Tex =
  dynamic_cast<res::D3dTexture*>(res::g_Manager->GetResource(L"Potwór01"));
if (Tex == NULL) throw Error(...);
Tex->Cośtam();

Mój pomysł polega na napisaniu metody szablonowej, która ukryje rzutowanie:

template <typename T>
T * MustGetResourceExf(const wstring &Name)
{
  return static_cast<T*>(MustGetResource(Name));
}

I jej wersji wolniejszej ale bezpieczniejszej:

template <typename T>
T * MustGetResourceEx(const wstring &Name)
{
  IResource *R = MustGetResource(Name);
  if (typeid(*R) != typeid(T)) throw Error(...);
  return static_cast*lt;T*>(R);
}

Używa się ich tak:

res::D3dTexture *Tex =
  res::g_Manager->MustGetResourceEx<res::D3dTexture>(L"Potwór01");
Tex->Cośtam();

Prawda, że bardziej eleganckie? :) Gdyby ktoś pytał, przedrostek "Must" oznacza u mnie, że w przypadku nieznalezienia zasobu o podanej nazwie rzucony zostaje wyjątek, w przeciwieństwie do metod bez niego, które w takim przypadu zwracają NULL.

Comments (1) | Tags: c++ algorithms | Author: Adam Sawicki | Share

13:30
Sun
27
Jan 2008

Konwersja między liczbą a łańcuchem w C# - z kropką

C# to piękny język, ale ostatnio natrafiłem na mały problem. Podczas konwersji liczby typu float na łańcuch typu string i odwrotnie, jako symbol dziesiętny domyślnie używany jest polski przecinek zamiast powszechnie przyjętej na świecie kropki. To jest problem, bo co jeśli na przykład tekstowy plik konfiguracyjny dołącozny do programu zawiera liczbę rzeczywistą zapisaną z kropką, a na komputerach użytkowników w zależności od ustawień międzynarodowych funkcja do konwersji będzie szukała przecinka czy jeszcze innego znaku?

Winne temu są oczywiście ustawienia kraju/języka (zwane w .NET "culture", w C/C++ "locale"). W C i C++ można spotkać to samo zjawisko, ale tam w programach trzeba to "locale" ręcznie ustawić posługując się funkcją setlocale czy też klasą locale z nagłówka <locale>. Domyślnie aktywne jest ustawienie angielskie. Aby w C# dokonać prawidłowej konwersji, trzeba zrobić tak:

1. Utworzyć obiekt klasy CultureInfo. Dla nas ważne jest, że on implementuje interfejs IFormatProvider. Przekazany do konstruktora łańcuch pusty oznacza "Invariant culture", a w praktyce obyczaje tekstowe dla języka angielskiego.

IFormatProvider FormatProvider =
  new System.Globalization.CultureInfo("");

2. Konwersja łańcucha na liczbę typu float z użyciem tego obiektu może wyglądać tak:

bool Result = float.TryParse(
  MyString,
  System.Globalization.NumberStyles.Float |
  System.Globalization.NumberStyles.AllowThousands,
  FormatProvider,
  out MyFloat);

3. Przykładowa konwersja liczby na łańcuch wygląda natomiast tak:

StringBuilder SB = new StringBuilder();
SB.AppendFormat(FormatProvider, "Number={0}", MyFloat);

Comments (2) | Tags: .net | Author: Adam Sawicki | Share

09:19
Fri
25
Jan 2008

Uroki moderowania forum

Władza to nic przyjemnego :) Duża odpowiedzialność, a nigdy nie zadowoli się wszystkich. Pełniąc honory moderatora forum.gamedev.pl obserwuję zwiększone ostatnio zainteresownie pracą moderatorów. Nasze grono podzieliło się na tych bardziej pobłażliwych dla początkujących/lamerskich pytań i tych, którzy chcą ostro walczyć o poziom forum. Ja należę raczej do tych pierwszych. Pośród użytkowników forum również daje się zauważyć ten podział. Dla zainteresowanych tematem:

Comments (0) | Tags: warsztat | Author: Adam Sawicki | Share

21:26
Mon
21
Jan 2008

Biblioteka do dźwięku inna niż FMOD

Przez kilka dni moja strona nie działała, ale już działa. Najprawdopodobniej padł serwer baz danych. Został naprawiony bez mojej interwencji. Stać za tym mogły zmiany w związku z tym, że moja firma hostingowa - dawniej i365.pl - to teraz domenomania.pl.

Myślałem ostatnio o bibliotekach dźwiękowych. Wiadomo, że najwypaśniejszy jest FMOD, ale znajomość tylko jego to nienajlepsza inwestycja na przyszłość, bo ta biblioteka, podobnie jak BASS, jest darmowa tylko do zastosowań niekomercyjnych. Inne dość oczywiste rozwiązanie to DirectSound, ale on niestety jest tak niskopoziomowy, że trzeba mu ręcznie wypełniać bufory z próbkami i nie ma mowy o wbudowanej obsłudze nawet plików WAV, a co dopiero MP3 czy OGG. O ile dobrze wiem, w OpenAL jest podobnie.

W tym kontekście ciekawym znaleziskiem jest Audiere. To biblioteka darmowa i wolna (licencja GNU LGPL), przenośna na Linuksa i całkiem funkcjonalna, a przy tym bardzo prosta w użyciu. Posiada interfejs obiektowy w C++. Obsługuje m.in. formaty WAV i OGG (co więcej potrzeba w programowaniu gier? :) Niestety coś za coś - nie posiada funkcji do dźwięku 3D itd.

Przy okazji uświadomiłem sobie, jak ważna jest dla biblioteki dobra dokumentacja. Wzorem w tej dziedzinie może być Microsoftowy MSDN Library albo Sunowa dokumentacja Javy. Po drugiej stronie leży całkowity brak dokumentacji i konieczność studiowania plików nagłówkowych z kodem. Dokumentacja generowana przez Doxygen jest zwykle gdzieś pośrodku. Pomyślałem sobie, że może kiedyś napiszę porządną dokumentację do mojego CommonLib - szczegółowy opis każdej funkcji za pomocą Doxygen plus podręcznik/tutorial.

Comments (0) | Tags: sound libraries | Author: Adam Sawicki | Share

11:37
Wed
16
Jan 2008

Programowanie gier, Vista i inne sprawy

Dawno nic nie pisałem na blogu, ale to nie znaczy, że nie robiłem nic ciekawego. Co u mnie nowego? Zbliża się koniec semestru ze wszystkimi tego konsekwencjami... Poza tym trochę grałem w WoW... Trochę też oczywiście programowałem.

Przekonałem się częściowo do Unicode i przeportowałem całą moją bibliotekę CommonLib i trochę innego kodu na wsparcie dla tej technologii. Na razie nie będę publikował nowej wersji biblioteki, bo wolę ją najpierw dopracować i przetestować w jakimś projekcie.

Wczoraj czytałem o tym, jak pisać programy, żeby działały bez problemu na Windows Vista na kontach z ograniczonymi uprawnieniami. Straciłem wiele czasu na przeglądanie różnych długaśnych materiałow, m.in. elektronicznej książki Windows Vista Developer Story. Wreszcie trafiłem na krótki i treściwy artykuł w DirectX SDK - User Account Control for Game Developers. W skrócie sprawa wygląda tak:

Comments (0) | Tags: windows | Author: Adam Sawicki | Share

15:19
Wed
09
Jan 2008

DirectX 10 jest fajny

Zająłem się ostatnio Direct3D 10 i bardzo mi się podoba. API jest piękne, a karta GeForce 8800 GT ma ogromną moc obliczeniową. Zrzucenie balastu wstecznej kompatybilności zawsze wychodzi na dobre. Szkoda tylko, że wymaga tak nowoczesnego sprzętu i co gorsza, Windowsa Vista. Moje pierwsze eksperymenty:

A to jest 750000 wierzchołków na klatkę generowane w pełni na GPU (bez żadnego bufora, tekstury czy innych danych podawanych do shadera), z użyciem instancingu i obliczeń na liczbach całkowitych:

Comments (0) | Tags: rendering directx | Author: Adam Sawicki | Share

16:54
Mon
07
Jan 2008

TFQ7 src - update 01

Udostępniając kod źródłowy mojego silnika - The Final Quest - nie zauważyłem, że do dokumentacji trafił opis starego shadera z poprzedniej wersji. Specyfikacja tego aktualnego pozostała w nieudostęnionym katalogu z projektami. Chyba nikt tego nie zauważył :) ale i tak przepakowałem archiwum. Można już pobrać plik TFQ7_1-1_src_update_01.zip (1007.67 KB). Dokumentację shadera głównego znajdziecie w pliku doc\Engine\MainShader.txt.

Comments (0) | Tags: productions engine rendering | Author: Adam Sawicki | Share

13:02
Sun
06
Jan 2008

Sonda - najlepszy format artykułów

Dawno nic nie pisałem. Co u mnie słychać? Od kilku dni intensywnie uczę się Direct3D 10. Więcej o tym napiszę wkrótce.

Tymczasem przyszła mi do głowy następująca sprawa. Otóż gdybym kiedyś jeszcze miał ochotę napisać jakiś artykuł (czego nie wykluczam, ale też niczego nie obiecuję), to w jakim formacie preferowalibyście go przeczytać? Zapraszam czytelników mojego bloga do głosowania i komentowania.

Comments (0) | Tags: teaching web | Author: Adam Sawicki | Share

15:05
Wed
02
Jan 2008

Lepsze białe, czy czarne tło?

Białe tło z czarnym tekstem, czy czarne tło i białe litery? To odwieczny problem i niekończący się spór. Ja jestem zwolennikiem białego tła - po prostu czytanie tekstu na takim tle mniej mnie męczy. Odnoszę wrażenie, że obecnie takie dominuje na "nowoczesnych" stronach WWW. Jednak zwolennicy jednego i drugiego podejścia mają swoje argumenty. Przykładowo, białe tło jest podobno bardziej naturalne, bo przypomina papier. Z kolei czarne tło to mniej światła świecącego użytkownikowi z monitora w oczy.

Czy to naprawdę kwestia gustu? Czy nie ma jednej prawidłowej, naukowo udowodnionej odpowiedzi? Zróbmy eksperyment. Przeczytajcie fragmenty tekstu z przykładowej wiadomości na forum, którą przerobiłem dostosowując kolory i napiszcie, który fragment czytało się lepiej.

Comments (1) | Tags: graphics | Author: Adam Sawicki | Share

STAT NO AD [Stat] [Admin] [STAT NO AD] [pub] [Mirror] Copyright © 2004-2017 Adam Sawicki
Copyright © 2004-2017 Adam Sawicki