Buforowanie stanów urządzenia

2007-10-25 19:32

Dobrą zasadą programowania obiektowego jest to, że każdy obiekt powinien w miarę możliwości dbać wyłącznie o siebie. Nazywamy to enkapsulacją. W przypadku obiektów na scenie chcielibyśmy więc, aby potrafiły one odrysować się same bez konieczności zakładania czegokolwiek choćby o stanie urządzenia przed wywołaniem metody Render danego węzła sceny.
Obiekt do samodzielnego narysowania się może jednak potrzebować ustawienia wielu parametrów: stanów renderowania, tekstur czy nawet shaderów. Z jednej strony część z nich może się powtarzać, a z drugiej pobieranie ustawień bezpośrednio od urządzenia przed każdą potencjalną zmianą kosztowałoby o wiele za dużo.

Prostym rozwiązaniem jest tutaj tzw. menedżer stanów, czyli warstwa pośrednicząca. Obiekt ten zachowuje wszystkie już ustawione stany urządzenia i kontroluje każde żądanie zmiany z zapisanymi wcześniej wartościami. Faktyczny stan urządzenia jest modyfikowany tylko wówczas, gdy nowa wartość jest rzeczywiście różna od starej.

Menedżer stanów urządzenia

Stworzenie takiego menedżera pozwala więc odciążyć nieco urządzenie zajęte ciągłym przełączaniem stanów w przypadku, gdy zgodnie ze słuszną filozofią OOPu każdy węzeł sceny renderuje się, dbając wyłącznie o siebie. Jedyną niedogodnością jest to, że w naszym menedżerze należy skopiować większość interfejsu urządzenia DirectX – a przynajmniej tę jego część, którą używamy. Jest to jednak potrzebne, aby w połączeniu z sortowaniem fragmentów geometrii sceny względem materiałów uzyskać jako taką wydajność całości.

Tags: , ,
Author: Xion, posted under Programming »


4 comments for post “Buforowanie stanów urządzenia”.
  1. SirMike:
    October 26th, 2007 o 19:04

    Jak myslisz jak sie ma do tego OpenGL’owe odkladanie na stos ustawien z danej grupy (W DX tez chyba cos takiego jest), zmiana ustawien dla konkretnego renderingu i pobranie poprzedniej wartosci ze stosu?

  2. Xion:
    October 27th, 2007 o 11:53

    Ponieważ nie znam się na OGLu, nie mogę nic pewnego powiedzieć. Wątpię jednak, żeby korzystał z jakichś ukrytych mechanizmów karty, więc pewnie jest to zrealizowane programowo – podobnie jak state blocks w DX.

  3. Reg:
    October 28th, 2007 o 13:56

    Też o tym myślałem, ale ostatecznie w swoim silniku tego nie mam, ponieważ słyszałem, że DirectX sam robi takie buforowanie na poziomie programowym i nie wysyła do karty poleceń zmiany stanu dopóki nie chcesz czegoś narysować, o ile nie tworzysz urządzenia D3D z flagą D3DCREATE_PUREDEVICE.

  4. Xion:
    October 28th, 2007 o 14:32

    Jeśli to prawda, to faktycznie sens byłby niewielki. Przydałoby się jednak uzyskać o tym jakieś pewniejsze informacje… co równa się założeniu wątku na forum Warsztatu i czekaniu na odpowiedź Krzyśka K. albo mINY87 :)

Comments are disabled.
 


© 2017 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.