Zabawa w DIY Audio
Dziś nietypowy wpis (nie związany z programowaniem). Dodałem nowy projekt do działu Projekty - są to kolumny głośnikowe wykonane od zera. Więcej szczegółów znajdziecie w opisie projektu.
Przy okazji uzbroiłem stronę w galerię i wrzuciłem kilka zdjęć. Co prawda mogłem wykorzystać np. Picase, ale coś mnie podkusiło żeby napisać swój skrypt i nie odparłem się pokusie ;)
Tagi: DIY Audio | Dodaj komentarz
Przenoszę...
... stronę tu: jakubduracz.com. Mimo że nie często tu piszę (a jeśli już), to obsługa/edycja wpisów czy szablonów na bloggerze mnie irytuje. Postawiłem na własny, minimalistyczny CMS z prostym językiem formatowania tekstu (WYSiWG to koszmar, a CMS-y pokroju Wordpress/Blogger/... to stanowczo overkill jak na moje potrzeby).
//~
Tagi: Inne | Komentarze (1)
Przyspieszanie Frustum Culling
Dziś mały tip o optymalizacji Frustum Culling(zdefiniowany jest na 6 płaszczyznach) dla OBBox i AABBox (Prostopadłościan dowolnie zorientowany i 'wyrównany' do osi układu współrzędnych). Zacznę od struktury boxów:
Najprostszym sposobem na sprawdzenie zawierania takich boxów w frustumie jest sprawdzenie zawierania każdego z jego wierzchołków dla każdej z 6 płaszczyzn frustuma. Żeby to troszkę przyspieszyć wyznaczam jeden wierzchołek (punkt p), który jest "najdalej" wysunięty względem normalnej danej płaszczyzny i sprawdzam relację tego punktu względem tej płaszczyzny. Jeśli dany wierzchołek znajduje się "nad" płaszczyzną - box znajduje się w zasięgu widzenia. Większość tego typu implementacji np. http://www.lighthouse3d.com/opengl/viewfrustum/index.php?gatest3 oblicza niepotrzebnie czy box przecina się z płaszczyzną - co narzuca niepotrzebny drugi test punkt-płaszczyzna i jest w większości przypadków niepotrzebne.
Wyliczanie punktu p dla AABBox:
Wyliczanie punktu dla OBBox:
Dysponując takim punktem p, wystarczy sprawdzić czy znajduje się on "nad" płaszczyznami frustuma. Przykładowy kod sprawdzający:
Wykonałem prosty programik testowy, gdzie można sobie sprawdzić działanie tego kodu: frustm.culling.2.zip
Jak widać na tym screenie - przyrost wydajnosci jest, ale oczywiście nie ma większego sensu się bawić w takie optymalizacje - chyba że "dla sportu" ;)
Tagi: Programowanie Engine Optymalizacja | Komentarze (1)
Kod z przyszłości
Wczoraj spotkała mnie ciekawa niespodzianka. Podczas testowania silnika przy każdej zmianie jednego pliku i próbie skompilowania i uruchomienia programu testowego (który znajduje się w tej samej solucji co silnik i jest zależny od silnika) prawie cały silnik kompilował się od początku. Opcja Minimal Build (czy coś takiego) była włączona... skasowanie plików tymczasowych nie pomogło (chyba że były jeszcze jakieś których nie zauważyłem), restart VS też nic, pozostało ręcznie kompilowanie modyfikowanego pliku i linkowanie zamiast po prostu wciśnięcia F5. Pomyślałem że mu przejdzie np. po restarcie komputera :] Przed wyłączeniem komputera i pójściem spać włączyłem backup dysku... dodam że mój backup kopiuje tylko pliki które mają "nowszą" datę modyfikacji. spojrzałem na log, w którym lista zaktualizowanych plików kopii była pusta, mimo że modyfikowałem kilka plików. Od razu popatrzyłem na da datę systemową, która wskazywała na 2006 rok i podobną godzinę do tej która wtedy była w rzeczywistości (sic!), przyczyną zmiany daty był podłączony dysk przenośny USB który nie wiem czemu przy każdym starcie komputera resetował datę (bez dysku już było ok). Po ustawieniu daty na prawidłową od razu uruchomiłem VS - tym razem IDE kompilowało tylko te pliki które były NAPRAWDĘ zmienione od ostatniej kompilacji, a nie te które tylko mają od tej daty kompilacji "nowszą" datę :)
PS. Wg. mnie Visual Studio powinien się połapać że data systemowa może być zła, skoro kompiluje pliki które zostały zmodyfikowane w "przyszłości".
Tagi: Inne Visual Studio | Dodaj komentarz
Method Chaining
Dziś napiszę o często stosowanej przeze mnie (i ogólnie w programowaniu wysokopoziomowym) technice programowania, mianowicie - "Method Chaining". Główną jej zaletą jest zwiększenie czytelności kodu, który staje się czytelniejszy i po prostu krótszy. Dobry przykład zastosowania tej techniki znajdziemy w bibliotece jQuery, albo w standardowej bibliotece C++ (choć przez przeładowanie operatorów << i >> można jej od razu nie dostrzec). Polega ona na wywoływaniu kilku funkcji na rzecz danego obiektu w jednej instrukcji. np.:
Powyższy przykład bez zastosowania Method Chaining wyglądał by tak:
Działanie kodu jest proste: każda wywołana funkcja w "łańcuchu" zwraca jako rezultat adres/referencję do obiektu dla którego jest wywoływana (wskaźnik this). Poniżej inny przykład z jakiegoś mojego kodu:
Kod ten kolejno wykonuje jakieś operacje na modelu o nazwie geometry, czyli kolejno: zmienia skalę modelu, dokonuje transformacji, następnie jest rotacja o zadany kąt według jakiegoś wektora, na koniec wyliczenie wektorów normalnych i wykonanie wcześniej ustalonych obliczeń funkcją apply. Jak widać kod jest bardziej skondensowany i czytelniejszy, a samo jego pisanie jest szybsze i przyjemniejsze (zwłaszcza z pomocą narzędzi typu InteliSense). Przykładowa implementacja klasy Geometry może wyglądać tak:
Jak widać kod jest bardzo prosty - całą robotę wykonuje instrukcja return *this - czyli jak wspomniałem - zwracanie referencji do obiektu na którym dalej chcemy wywoływać następną funkcję. Należy pamiętać w powyższym kodzie o odpowiednim ustawieniu flag 'todo_*' i zapamiętywaniu danych wejściowych niezbędnych do zakończenia obliczeń. Dzięki funkcji Apply bardzo łatwo można wprowadzić spore optymalizacje: zamiast osobno przechodzić dane modelu dla policzenia kolejno kilku transformacji na modelu, można na raz dokonać obliczeń raz przechodząc dane.
Technika ta oczywiście nie ogranicza się tylko do wywoływania funkcji jednego obiektu - spore możliwości pokazuje gdy wywołujemy łańcuch metod na kilku różnych obiektach, wspaniale upraszczając kod. Na koniec zamieszczam jeszcze kilka imponujących przykładów z wykorzystaniem biblioteki jQuery które zainspirowały mnie do napisania tej notki:
Powyższy przykład szuka wszystkich pod-elementów wypunktowania ul o klasie first i zmienia kolor tła na czerwony dla tych z klasą foo i na zielony dla pod-elementów z klasą bar.
Kod ten wybiera jakiś formularz do logowania (o identyfikatorze login), później ukrywa wszystkie labele o klasie optional tego formularza. Ustawia czerwoną ramkę na pole tekstowe hasła formularza i ustawia mu jeszcze callback wywoływany przy wysłaniu formularza.
Dodatkowo funkcja end pozwala na przedłużenie łańcucha metod cofając wskaźnik elementu na którym pracujemy zwracając referencję do swojego rodzica. Nie trzeba zapamiętywać żadnych wyszukanych zmiennych, czy wyszukiwać elementów kilka razy - wszystko jest wykonane za pomocą jednego łańcucha metod.
przykłady pochodzą z:
Tagi: Programowanie | Komentarze (1)
Preloading obrazków w jQuery
Dziś mały tip Javascript/jQuery. Kod ten pozwala na wykrycie momentu załadowania do pamięci pobranego obrazka na stronie internetowej. Dodaje go tutaj bo trochę sie nad tym męczyłem, a może się komuś przydać (w programowaniu 'webowym' jestem nowicjuszem ;) ). Od razu przejdę do kodu i krótkiego omówienia co się w tym kodzie dzieje:
- (1) na początku sam obrazek jest pusty (var image=new Image()), taki obrazek oczywiscie nie jest widoczny - istnieje tylko w pamieci
- (2) funkcja jQuery: load - definiuje funkcje ktora bedzie uruchomiona po zaladowaniu obrazka (callback)
- (3) następnie ustawiamy atrybut 'src' naszego pustego obrazka na odpowiednia wartość (ścieżka i nazwa pliku do obrazka) (attr('src',imgSrc). Po zmianie atrybutu src obrazek sie laduje, gdy sie zaladuje - uruchamiany jest wczesniej zdefiniowany callback
- (4) w funkcji callback-a mozna przypisac zaladowany obrazek z pamieci przypisujac docelowemu elementowi img atrybut 'src' z nasza nazwa pliku (imgSrc) - obrazek laduje sie natychmiast z pamieci.
PS. Przy okazji polecam wszystkim web-developerom bibliotekę jQuery, zwłaszcza często używających Javascript. Jest to kompaktowa i bardzo dobrze zaprojektowana biblioteka, bardzo przyjemna w obsłudze.
Tagi: Programowanie jQuery Javascript | Komentarze (2)
Kolorowanie
(dziś trochę "lanie wody" :) )
W przerwie między kodowaniem silnika, nauką C#, modyfikowaniem (nieziemsko tragicznego) kodu osCommerce i innych PHP-owych dziwolągów, postanowiłem podjąć się czegoś innego - bardziej ambitnego - mianowicie: zmienić kolorowanie składni mojego edytora (VC++) :> Od dawna w każdym edytorze używam kolorowania pododnego do klasycznego Borlandowego, które trochę zmieniłem. Oto rezultat:
Używam czcionki Lucida Console. Wygląda prawie identycznie jak Consolas, z tym że jest trochę "niższa" i tekst jest bardziej zbity (taki preferuję).
Dla zainteresowanych pliki z ustawieniami kolorowania dla VC++2008 (działają też z VC++2010):
Tagi: Inne Visual Studio | Komentarze (1)

