November 2008

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

# MMX i SSE

Sat
29
Nov 2008

Osobny temat w rozdziale MSDN Library "Compiler Intrinsics" stanowią funkcje i typy do obsługi SIMD, czyli rozszerzeń wektorowych procesora (MMX, 3DNow!, SSE).

Na temat wsparcia procesorów dla tych instrukcji wektorowych założyłem dyskusję na forum. Koniec końców myślę jednak, że przyspieszenie obliczeń za ich pomocą (np. przez przerobienie wektorów i macierzy w bibliotece matematycznej na użycie SSE) nie jest takie proste. Przeszkodą jest np. wymagane dla typów __m64 i __m128 wyrównanie odpowiednio do 8 i 16 bajtów, które nie pozwala czytać sobie tych wektorów ot tak swobodnie, z dowolnych danych binarnych.

Comments | #algorithms #c++ #visual studio Share

# Compiler Intrinsics

Thu
27
Nov 2008

Pod hasłem Compiler Intrinsics kryje się w MSDN Library bardzo ciekawy rozdział. Opisuje niskopoziomowe funkcje, których dostarcza sam kompilator i które pozwalają wykorzystywać różne instrukcje asemblera bez sięgania po wstawki w tym trudnym języku, zwyczajnie jako funkcje C++. Pośród tych funkcji są np. wspomagające programowanie równoległe (jak _ReadWriteBarrier, _InterlockedCompareExchange), __emul mnożąca liczby 32-bitowe do liczby 64-bitowej, _rotl przesuwająca bity z zawinięciem czy __cpuid zwracająca informacje o możliwościach procesora.

Także wiele funkcji biblioteki standardowej C posiada swoje implementaje jako intrinsics, które powinny zamieniać się na instrukcje asemblera zamiast wywołań. Należą do nich np. abs, sin, pow, strlen, strcpy. Trzeba tylko je włączyć za pomocą #pragma intrinsic lub /Oi (Generate Intrinsic Functions).

W praktyce to nie jest takie proste. Zadeklarowanie strcpy jako intrinsic przyspieszyło wprawdzie mój test z 2.5439 do 2.4976 sekundy, ale ta funkcja kompiluje się do asemblerowego rep movs w konfiguracji Release niezależnie od jej zadeklarowania jako intrinsic. Z kolei cosf tak czy siak zamienia się na wywołanie call.

Comments | #c++ #visual studio Share

# Przewijanie konsoli

Sun
23
Nov 2008

Kiedy piszemy konsolę w postaci zwykłego systemowego okienka z kontrolką RichEdit, powstaje pytanie, czy podczas dodawania nowego komunikatu przewijać ją na dół. Jeśli nie, to będzie denerwujące dla użytkownika, który chciałby stale widzieć najnowsze komunikaty. Jeśli tak, to będzie denerwujące dla tego, kto chciałby przeczytać konkretny komunikat mimo pojawiania się nowych. Co więc zrobić? Przycisk, który pozwoli zablokować przewijanie konsoli?

Moim zdaniem najlepiej jest zrobić tak, jak to robi Visual C++ choćby w okienku Output - przewijać, jeśli kursor jest na końcu i nie przewijać, jeśli użytkownik umieści go gdzieś wyżej. W C# z kontrolką typu RichTextBox można to zrobić tak:

public void OutputLine(string Text, Color c) {
  int SelectionStart = RichTextBox1.SelectionStart;
  bool SelectionAtEnd =
    (SelectionStart == RichTextBox1.Text.Length) &&
    (RichTextBox1.SelectionLength == 0);

  RichTextBox1.SelectionStart = RichTextBox1.Text.Length;
  RichTextBox1.SelectionLength = 0;

  RichTextBox1.SelectionColor = c;
  RichTextBox1.AppendText(Text + "\r\n");

  if (SelectionAtEnd)
    RichTextBox1.ScrollToCaret();
  else
    RichTextBox1.SelectionStart = SelectionStart;
}

Konsola w C#

Comments | #.net #gui Share

# World of Goo

Sat
22
Nov 2008

Gry w stylu Indie mają swój urok - oryginalny gameplay i zakręcona fabuła to zupełnie co innego, niż fotorealistyczna grafika i epicki rozmach produkcji AAA. Pisałem już kiedyś chyba o tym, jak fajny jest Gish i Darwinia. Teraz skończyłem przechodzić kolejną wciągającą grę - World of Goo.

Ci, którzy śledzili Experimental Gameplay Project pamiętają pewnie jedną z najpopularniejszych produkcji z tej strony - Tower of Goo. World of Goo to rozwinięcie tego pomysłu w grywalną produkcję logiczno-zręcznościową 2D opartą na fizyce, w której jest do przejścia wiele etapów i w której autorzy zastosowali masę ciekawych pomysłów (różne rodzaje kulek!). Humor i fabuła też robią swoje :)

PS: Ścieżka dźwiękowa z gry też jest warta posłuchania. Leży w plikach OGG i ma w sumie ponad 20 minut.

NOWE: Ścieżka dźwiękowa jest dostępna do pobrania za darmo: World of Goo Soundtrack.

Comments | #games Share

# Efekty wolumetryczne #2

Tue
18
Nov 2008

Mgła wolumetryczna, ciąg dalszy. Jako funkcję gęstości wygenerowałem sobie tym razem porządną teksturę wolumetryczną - szum Perlina, tilowalny na wszystkie 3 strony. Jeśli komuś może się przydać, umieściłem ją tutaj: NoiseVolume.dds (ma rozmiar 32x32x32, jest w formacie DDS L8, plik zajmuje 32 KB). Dodałem też modulowanie gęstości przez odległość od określonego punktu lub płaszczyzny, tak żeby mgła mogła zanikać w danym kierunku.

Comments | #rendering Share

# Efekty wolumetryczne

Sun
16
Nov 2008

Odgrzebałem dzisiaj swój framework z wakacji, który służy do eksperymentowania i poeksperymentowałem z efektami wolumetrycznymi próbując otrzymać coś w rodzaju mgły. Rysuję bryłę wypukłą, a dla każdego piksela śledzę promień od kamery przez ten punkt wgłąb bryły. Wzdłuż tego promienia kilka razy próbkuję jakąś funkcję gęstości od (x,y,z). To tak jakbym liczył numerycznie całkę. Najlepiej to wygląda, kiedy gęstość jest po prostu odczytywana z przefiltrowanej tekstury wolumetrycznej zawierającej zwykły szum. Największym problemem było ustalić, jaką głębokość ma bryła w danym miejscu ekranu. Rozwiązałem to renderując głębokość tylnych ścianek obiektu (CullMode = CW) do osobnej tekstury R32F, którą potem odczytuję.

Comments | #rendering Share

# Programujesz w C czy w C++?

Sun
16
Nov 2008

Dziś będzie refleksja, do której skłoniła mnie niedawna rozmowa na Gadu-Gadu. Wielu z tych, którzy pisali w C albo uczyli się go na studiach, a nawet niektórzy autorzy książek wyznają podział na C i C++ tak ścisły, że wszelkie pisanie własnych kontenerów, używanie łańcuchów typu char* czy zmiennych i funkcji globalnych, a nawet wskaźników nazywają językiem C. C++ kojarzy im się wyłącznie z jak najintensywniejszym stosowaniem programowania obiektowego i biblioteki STL.

Tymczasem ja nigdy nie używałem języka C i nie mam zamiaru. Stale programuję w C++, a mimo tego używam czasem funkcji globalnych, piszę nieraz własne struktury danych i nie przepadam za strumieniami biblioteki standardowej. Dlatego uważam, że takie nazywanie wszystkiego co nie-obiektowe i nie-STL-owe programowaniem w C jest trochę przesadzone.

Pokażcie mi z resztą bibliotekę przeznaczoną dla C++, która wykorzystuje wszystkie cechy tego języka (klasy, łańcuchy i kontenery STL, strumienie i wyjątki) zamiast dostarczać swoich własnych rozwiązań w tym zakresie albo używać starego podejścia z C. Niewiele takich jest, a mimo tego nie nazywamy wszystkich pozostałych bibliotekami do C.

Comments | #c++ #stl Share

# CommonLib 8.1

Mon
10
Nov 2008

Moja najważniejsza chyba amatorska produkcja - biblioteka CommonLib - doczekała się następnej wersji. W skończonej dzisiaj wersji 8.1 największymi zmianami jest dodanie wielu funkcji bitowo-matematycznych (głównie na podstawie artykułu Bit Twiddling Hacks) i funkcji geometrycznych do kolizji różnego rodzaju brył (głównie na podstawie książki Real-Time Collision Detection). Oto lista nowości.

Comments | #libraries #c++ #productions Share

# Kompresja tekstur DXT

Sat
08
Nov 2008

W amatorskich grach tekstury zapisujemy zwykle w "tradycyjnych" formatach plików, np. TGA. Ci, którzy piszą w DirectX mają ten komfort, że ich biblioteka potrafi sama z siebie wczytywać różne formaty plików. Pośród nich jest DDS - naturalny format DirectX-a, którego możliwości są takie jak różnorodność formatów dostępnych dla tekstur przechowywanych w pamięci. Programy graficzne można skłonić do obsługi tego formatu instalując darmową wtyczkę (do Photoshopa, do GIMP-a). Można też konwertować tekstury na ten format za pomocą DirectX Texture Tool - programu dołączonego do DX SDK.

Pośród formatów, w jakich może być obrazek zapisany w pliku DDS (jak i wczytana z niego do pamięci tekstura) warto wymienić formaty skompresowane DXT. Stosowana w nich kompresja używa bardzo ciekawego algorytmu, w niczym niepodobnego do np. JPEG. Każdy blok 4x4 teksele jest zapisany w postaci dwóch kolorów R5G6B5 oraz, dla każdego teksela, dwóch bitów mówiących o interpolacji między tymi kolorami. W ten sprytny sposób można w takim bloku zapisać równie dobrze płynny gradient, co ostrą krawędź. Format DXT1 służy do tekstur nieprzezroczystych lub z 1-bitowym kanałem Alfa, a DXT5 obsługuje zróżnicowane wartości Alfa. DXT1 poświęca 8 bajtów na blok, a DXT5 - 16 bajtów na blok. Niestety, do kompresji normal map żaden z nich się nie nadaje i dlatego badacze próbują na różne sposoby rozwiązać ten problem.

Podsumowując, warto stosować format pliku DDS, a użycie odpowiedniego formatu tekstury zaoszczędzi miejsca zarówno na dysku, jak i w pamięci karty graficznej (tam też tekstury DXT leżą nadal w postaci skompresowanej!), bez zauważalnej straty jakości.

Formaty tekstur DDS

Comments | #rendering Share

# Total Commander a foldery specjalne

Thu
06
Nov 2008

Total Commander to świetny manager plików. Pozwala zarządzać plikami tak jak naprawdę wyglądają na dysku. Jednak czasem instalują się w systemie specjalne foldery, na Pulpit lub do wnętrza Mój komputer. Dotyczy to na przykład oprogramowania do komórek i palmtopów. Total Commander nie pozwala eksplorować wirtualnego drzewa powłoki Windows, w którym na samej górze jest Pulpit. Czy wobec tego w programie nie ma dostępu do takich folderów specjalnych?

Okazuje się, że jednak Total Commander potrafi poruszać się po przestrzeni tych folderów powłoki. Trzeba tylko uciec się do prostej sztuczki (którą pokazał mi kolega z pracy Piotrek - pozdro!) - utworzyć gdzieś na dysku zwykły skrót LNK do takiego folderu, a potem w Total Commanderze "wejść" do niego klawiszem Enter.

Swoją drogą, Christian Ghisler mógłby do swojego programu dorobić jedną ważną funkcję - asynchroniczne odświeżanie listy plików, tak żeby przedłużające się listowanie komputerów w Otoczeniu sieciowym czy innym folderze nie zawieszało całego programu. Twórcy przeglądarek internetowych już dawno wprowadzili takie rozwiązania.

Comments | #software Share

# Funkcje do kolizji

Mon
03
Nov 2008

Zachęcony notką na blogu Yarpena kupiłem sobie książkę Real-Time Collision Detection (Christer Ericson). Teraz czytam ją wrzucając znalezione funkcje do modułu matematycznego mojej biblioteki CommonLib. Żeby je testować, napisałem sobie prosty program z Direct3D, który pokazuje kolidujące bryły:

Jak pisałem już kiedyś, w programowaniu (szczególnie tam gdzie jest matematyka) występuje tajemnicze zjawisko, które powoduje, że skopiowany kod - choćby nie wiem jak gotowy do użycia - zwykle nie działa. Pojawiają się różne błędy zmuszając do podjęcia wysiłku jego zrozumienia, żeby te błędy naprawić. Wczoraj to zjawisko dało o sobie znać w wyjątkowo niezwykły sposób. Kompilator pokazał błąd:

error C2146: syntax error : missing ';' before identifier '-'

Dłuższą chwilę zajęło mi stwierdzenie, że powodem jest sam znak minusa, który w skopiowanym kodzie nie jest prawdziwym minusem, ale jakimś znakiem specjalnym, który minus przypomina. Mimo tych trudności nie poddaję się - metoda Kopiego-Pasta rządzi! :)

Comments | #math Share

# WD Raptor: Nieudany zakup

Sat
01
Nov 2008

Kupując rok temu nowy komputer pomyślałem sobie, że tym co najbardziej wszystko spowalnia jest w dzisiejszych czasach prędkość dysku. W końcu uruchamianie systemu, włączanie programów, ładowanie planszy w grach - to są te chwile, w których procesor czeka na wczytanie plików.

Początkowo chciałem zbudować sobie macierz dysków RAID. Po małym rozeznaniu stwierdziłem jednak, że sprawa nie jest prosta. Po pierwsze, RAID 0 jest szybki, ale mało bezpieczny, bo awaria któregokolwiek z dysków powoduje utratę danych. Po drugie, szybki i bezpieczny RAID 5 nie jest obsługiwany przez płyty główne, a jedynie przez dodatkowe kontrolery kosztujące od 1000 zł. Po trzecie, taki RAID od płyty głównej nie działa sam z siebie - trzeba go instalować w systemie, co może być kłopotliwe, kiedy ma się trzy różne systemy operacyjne.

Postanowiłem więc być sprytniejszy i kupić sobie superszybki dysk, który ma 10000 RPM (obrotów na minutę - zwykłe dyski do pecetów mają 7200 RPM). Kupiłem WD Raptor 74 GB płacąc za niego niemało. Teraz z całym przekonaniem chciałbym przyznać i przestrzec - to nie był dobry zakup. Taki dysk faktycznie jest szybszy, ale przyrost prędkości nie jest aż tak duży, żeby zrekompensować wysoką cenę (w tej chwili za nieco ponad 200 zł można kupić zwykły dysk o pojemności 500 GB). Co najgorsze, Raptor okropnie hałasuje charcząc podczas czytania i pisania tak jak te stare dyski sprzed 10 lat. W dzień to jest fajne, bo słychać kiedy dysk pracuje bez spoglądania na lampkę, ale w nocy nie daje spać.

BTW: Chce ktoś kupić dysk? 74 GB, bardzo szybki, cichy i tani ;) Zapraszam do mojej aukcji: Allegro: WD Raptor 74 GB, 10000 RPM - WD740ADFD.

Comments | #hardware #shopping Share

[Download] [Dropbox] [pub] [Mirror] [Privacy policy]
Copyright © 2004-2024