wtorek, 10 lipca 2007

Bitwy wydajnościowe

Dzisiaj zdążyłem przetestować już kilka sposobów renderowania w celu sprawdzenia który byłby najlepszy [czyt: najszybszy]. Mam 3 kandydatów:

  • Można użyć D3DXSprite do rysowania co jest bardzo wygodne, ale problem pojawia się z wywołaniami Begin() i End(). Wywoływanie ich przy rysowaniu każdego pojedynczego sprita jest BARDZO niewydajne :) Koncept więc jest taki, żeby wywoływać je na początku i na końcu sceny. Ok. Tak może być. Oczywiście przed narysowaniem tekstu lub linii trzebaby wywołać metodę Flush() bo inaczej znajdą się one za wszystkimi spritami, a nie tam gdzie powinny. Ale co jeśli będę chciał narysować wypełniony kolorem prostokąt? Można użyć metody ColorFill() z IDirect3DDevice9, ale to jest równie wydajne co kupowanie jabłek po jednym i przynoszenie każdego do domu. Z kolei jeśli użyję DrawPrimitiveUP() to jeśli nie wywołam Flush() to oczywiście prostokąt rysowany jest za spritami, a jeżeli ją wywołam to prostokąt w ogóle nie jest rysowany!
  • Drugi sposób na rysowanie to użycie vertex bufferów. Niby dobry sposób, ale jak będę chciał zmienić którykolwiek z wierzchołków to trzeba użyć dość wolnego Lock()'a...
  • Trzeci sposób to rysowanie wszystkiego za pomocą DrawPrimitiveUP() problem w tym, ze wszystkie transformacje wierzchołków musiałbym robić na własną rękę co też mogłoby być średnio wydajne ;)
Podsumowując - nie ma złotego środka. No chyba że wymyślę jeszcze jakiś inny sposób albo dowiem się dlaczego DrawPrimitiveUP() nie działa po wywołaniu Flush()'a...

Brak komentarzy: