All blog entries, ordered from most recent. Entry count: 1198.
# 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;
}

# 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.
# 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.
# 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ę.
# 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.
# 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.