2010-09-26 16 views
9

Chciałbym stworzyć grę z wielu kostek i planuję wprowadzić ją na platformy mobilne, a także w Internecie za pomocą webgl. Mój problem polega na tym, że kiedy wykonuję wywołanie drawelements na kostkę, biorę hit na liczbę klatek na sekundę. Czy istnieje sposób, aby wykonać jedno wezwanie do wyciągnięcia karty, aby otworzyć je? Jedyna różnica między kostkami to pozycja i kolor.Najbardziej skuteczny sposób rysowania wielu identycznych obiektów?

+0

Czy położenia kostek względem siebie zmienią się z czasem? – LarsH

+0

Prawdopodobnie ulegną one zmianie z biegiem czasu, ponieważ chciałbym, aby ulegały zniszczeniu. – Xavier

+0

Zobacz także: http://stackoverflow.com/questions/9352355/draw-many-of-the-same-object-quickly-in-opengl – jwrush

Odpowiedz

4

Sam wpadłem na ten sam problem. Zadałem podobne pytanie i odpowiedziałem sobie wczoraj. Spójrz na:

Efficient way of drawing in OpenGL ES

Chcesz stworzyć swoje bufory wierzchołków i przesłać je do karty graficznej pamięci tylko raz przy użyciu gl.bufferData. Następnie użyj odwołania do tego bufora za każdym razem, gdy robisz gl.drawElements lub gl.drawArrays. Dopóki nie zmieni się zawartość sceny 3D, możesz użyć tego bufora, który zostanie załadowany do pamięci karty graficznej.

0

Śledź model UITableView w jaki sposób usuwają dane z komórek. Zbudowałbym obiekt, który śledzi rysowane obiekty i łączy je z Identyfikatorem. Następnie możesz po prostu wycofać je za pomocą wspomnianego identyfikatora. Jeśli wiesz, że zamierzasz narysować wiele wersji tego samego obiektu, użyj tego obiektu, aby zminimalizować renderowanie/przydzielanie.

0

Jeśli używasz Vertex Arrays do glDrawElements(), sugeruję zamiast tego używanie Vertex Buffer Objects. Spowoduje to zapisanie strony serwera danych (w GRAM) zamiast po stronie klienta (w RAM systemu). W ten sposób można wywoływać wywołania glDrawElements() przy znacznie mniejszej mocy procesora CPU < -> Przesyłanie danych na GPU.

Możesz także przechowywać kostki na listach wyświetlania. W ten sposób możesz użyć glTranlate(), aby przesunąć kostkę wokół, a następnie po prostu wywołaj listę wyświetlania, aby ją wyrenderować. Jedyne zastrzeżenie do korzystania z list wyświetlania jest takie, że cokolwiek robisz na liście wyświetlania, jest niezmienne; nie można zmienić wywołań na liście wyświetlania bez całkowitej rekompilacji.

+2

OpenGL ES nie obsługuje list wyświetlania. –

Powiązane problemy