All Blog Entries

All blog entries, ordered from most recent. Entry count: 1198.

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

Pages: > 1 ... 72 73 74 75 76 ... 150 >

# 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

# Potęga breakpointów w Visual C++

Wed
29
Oct 2008

Używanie debuggera to podstawa efektywnego programowania. Na stawianiu breakpointów, pracy krokowej i podglądaniu wartości zmiennych nie trzeba jednak poprzestawać. Warto wiedzieć, że w Visual C++ można kliknąć prawym klawiszem myszy w czerwone kółeczko breakpointa i otwierają się wtedy nowe możliwości. Pośród nich jest "Condition", które pozwala wpisać warunek zatrzymania czy "Hit Count", które pozwala zatrzymać program tylko co któreś wejście do zaznaczonej instrukcji.

Najciekawsze jednak jest polecenie "When Hit", które zamienia pułapkę w zdarzenie powodujące zalogowanie komunikatu do okienka Output. Można wtedy wpisać swój dowolny komunikat używając specjalnych zmiennych m.in. z nazwą funkcji bieżącej, funkcji nadrzędnej oraz dowolnego wyrażenia z wykorzystaniem dostępnych w danym miejscu zmiennych. Dzięki temu można wstawiać do programu drukowania kontrolne bez modyfikowania źródła i przekompilowania swojego programu.

Visual C++ Breakpoint When Hit

Comments | #visual studio Share

# Elementarne algorytmy - pomysł na artykuł

Sun
26
Oct 2008

Dawno, dawno temu wymyśliłem pewien artykuł dla początkujących. Zauważyłem bowiem, że między tematami najczęściej podejmowanymi w nauce programowania - opanowaniem języka programowania i opanowaniem bardziej zaawansowanych tematów, jak biblioteka graficzna czy algorytmika - istnieje pewna luka i wielu adeptów ma z tym problem. Chodzi o 1. podstawowe struktury danych, 2. projektowanie i używanie własnych formatów plików oraz 3. elementarne algorytmy i sztuczki programistyczne.

Dwa pierwsze tematy opisałem w jakimśtam stopniu 4 lata temu w artykule Struktury danych i formaty plików. Trzeci chciałem opisać w ubiegłe wakacje, ale wyjaśnienie wszystkich zebranych zagadnień w dostatecznie dokładny i przystępny sposób kosztowałoby zbyt dużo pracy. Dlatego jedyne co zrobiłem to teraz spisałem wreszcie i opublikowałem sam "projekt" tego artykułu (co samo w sobie było niemałym zadaniem) - Elementarne algorytmy.txt.

Comments | #algorithms #ideas #teaching Share

# Visual C++ - rozszerzenia Microsoftu

Tue
14
Oct 2008

Visual C++ oferuje wiele rozszerzeń do standardu języka C++. Jeżeli tylko można sobie pozwolić na ograniczenie się do kompilatora Microsoftu, warto z nich korzystać. Na przykład:

Przykłady użycia:

char sz[128];
sprintf_s(sz, _countof(sz), "Liczba=%u", 123);

void KlasaPochodna::Metoda() {
  __super::Metoda();
  ...
}

Dużo oferują też dyrektywy preprocesora #pragma. Na przykład pragma pack pozwala ustawić wyrównanie dla pól struktury czy klasy, once zastępuje tradycyjne zabepieczanie nagłówków za pomocą #ifndef, deprecated służy do zadeklarowania identyfikatora jako niezalecanego, a push_macro i pop_macro pozwala zapamiętywać i przywracać definicję makra.

Comments | #c++ #visual studio Share

# Crash Dump

Fri
03
Oct 2008

Życie programu w Windows nie kończy się wraz z błędem ochrony pamięci albo dzieleniem przez zero. Takie błędy można łapać, a co więcej, można z nich tworzyć tzw. Crash Dump - plik DMP, który wysłany do programisty może mu pomóc zlokalizować problem.

Należy objąć swój kod w sekcję __try { ... } __except ( MojaFunkcja( GetExceptionInformation() ) ) { }, a w swojej funkcji wywołać MiniDumpWriteDump pochodzącą z biblioteki Dbghelp. Ta biblioteka z kolei rozprowadzana jest jako Debugging Tools for Windows, ale do użycia tej funkcji wystarczy wersja domyślna z Windows XP.

Potem plik DMP można otworzyć w Visual C++ (rozszerzenie jest z nim domyślnie skojarzone). Trzeba jeszcze posiadać plik PDB z symbolami (powstaje w czasie kompilacji obok EXE/DLL) i już można zobaczyć gdzie wystąpił błąd, analizując np. stos wywołań Call Stack. Można nawet ściągnąć symbole do bibliotek systemowych. Ścieżki do symboli ustawia się w Tools > Options > Debugging > Symbols, lokalizacja z symbolami od bibliotek systemowych to http://msdl.microsoft.com/download/symbols.

Niestety sprawa nie jest taka prosta. Dodatkowo można na przykład postawić tzw. "Symbol Server" (to po prostu specjalny katalog zarządzany przez dedykowane programy z pakietu Debugging Tools for Windows), a podczas używania tych mechanizmów pojawia się wiele problemów (może ktoś coś poradzi na mój problem? :)

Comments | #c++ #winapi Share

Pages: > 1 ... 72 73 74 75 76 ... 150 >

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