2013-04-10 24 views
13

Jakie są najszybsze i najbardziej elastyczne (stosowane w większości sytuacji) sposoby korzystania z VBO?Najlepszy sposób korzystania z VBO

Zajmuję się tworzeniem aplikacji OpenGL i chcę, aby uzyskać najlepszą wydajność, więc potrzebuję kogoś, aby odpowiedzieć na te pytania. Czytałem wiele pytań i anwers ale chyba nie ma zbyt dużo informacji, że nie muszę który bałagan mój mózg ...

  • Ile vbos należy użyć?
  • Jak utworzyć vbos?
  • W jaki sposób zaktualizować dane vbos, jeśli rozmiar danych nie jest ustalony?
  • Jak powinienem renderować vbos?
  • W jaki sposób radzić sobie z danymi w vbos, których nie chcę renderować?
+2

Nie ma prawidłowej odpowiedzi na wiele pytań. Wszelkie takie odpowiedzi będą specyficzne dla sprzętu. –

Odpowiedz

18
  • Ile vbos powinienem użyć?

Tak mało jak to możliwe. Przełączanie VBO ma niewielki, ale mierzalny koszt. Ogólnie spróbujesz pogrupować podobne dane w VBO. Na przykład w grze FPS wszystkie rodzaje śmieci leżące na ulicy, małe rekwizyty itp. Będą zwykle znajdować się w tej samej lub tylko niewielkiej liczbie VBO.

Sprowadza się również do rysowania wielkości partii. glDraw… wywołania, które renderują mniej niż około 100 prymitywów są nieoptymalne (tak było zawsze, nawet 15 lat temu). Więc jeśli to możliwe, chcesz wsadowo co najmniej 100 prymitywów. Ale jeśli pojedyncza siatka ma tylko, powiedzmy 20 trójkątów (niskie rekordy polikountu dla instancji lub inne), każdy w swoim własnym VBO nie może dłużej wsadać więcej.

  • Jak utworzyć vbos?

glGenBuffers → glBindBuffer → glBufferData

UPDATE można przekazać null wskaźnik do parametru glBufferData data zainicjować obiekt bufora bez ustawiania danych.

  • Jak zaktualizować dane vbos, jeżeli wielkość danych nie jest ustalona?

Tworzenie VBOs z grubszej ziarnistości rozmiarze niż rozmiar danych jest. Twój system operacyjny robi to mimo to dla danych twojego hosta, nazywa się to stronicowaniem. Również jeśli chcesz użyć obiektu glMapBuffer tworząc obiekt bufora, wielość rozmiaru strony hosta jest bardzo dobra dla całego systemu.

Zwykły rozmiar strony w obecnych systemach wynosi 4kiB. Tak więc wybrałem ziarnistość VBO. AKTUALIZACJA: Możesz zapytać BTW systemu operacyjnego, jakiego rozmiaru strony używa. To zależy od systemu operacyjnego, chciałbym zadać na to jeszcze jedno pytanie.

Zaktualizuj dane za pomocą glBufferSubData lub zmapuj je za pomocą glMapBuffer, modyfikuj pamięć zmapowaną po stronie hosta, a następnie glUnmapBuffer.

Jeśli dane wyrastają z bufora, utwórz nowy, większy i skopiuj za pomocą glCopyBufferSubData. Zobacz akapit lase.

  • Jak powinienem renderować vbos?

glBindBuffer → glDraw ...

  • Jak należy sobie radzić z danymi vbos że nie chcę, aby uczynić więcej?

Jeśli dane zużywa tylko część VBO i akcji z innymi danymi i nie jesteś na wyczerpaniu pamięci wtedy, cóż, po prostu nie do niego dostęp. Najlepiej trzymać się jakiegoś indeksu, w którym będziesz śledzić, które VBO ma, które części są dostępne dla jakiego rodzaju zadania. Jest to bardzo podobne do zarządzania pamięcią, a konkretnie do schematu zwanego stosami obiektów (warstwami).

Jednak może okazać się sensowne kompaktowanie istniejącego obiektu buforowego. W tym celu utworzysz nowy obiekt bufora, wiążąc go jako cel zapisu, ze starym obiektem buforowym wybranym jako cel do odczytu. Następnie użyj polecenia glCopyBufferSubData, aby skopiować zawartość do nowego, zaostrzonego obiektu buforowego. Oczywiście będziesz musiał zaktualizować wszystkie odniesienia do nazwy obiektu buforowego (= ID OpenGL) i przesunięć.

Z tego powodu sensowne jest napisanie cienkiej warstwy abstrakcji na wierzchu obiektów bufora OpenGL, który śledzi rzeczywiste wpisane dane w obiektach bez przezroczystych obiektów OpenGL.

+0

Czy jesteś pewien, że użycie rozmiaru 4kiB nie spowoduje, że mój program będzie miał zbyt dużo vbos? – Qualphey

+0

@visDEVion: Nie twierdzę, że twoje VBO powinny mieć dokładnie 4kiB rozmiaru, ale wielokrotność 4kiB (to znaczy zaokrąglić do następnej wyższej wielokrotności 4096). Załóżmy, że potrzebujesz 10 kilobajtów pamięci, a następnie przydzielisz VBO o rozmiarze 14kiB. – datenwolf

+0

ahh ... Słuchaj, tworzę 4 Mb rozmiar vbos dla obiektów statycznych i dynamicznych. Jeśli vbo jest pełne, wówczas utworzę nowy o tym samym rozmiarze, a następnie dodaję do niego wszystkie nowe dane. Co sądzisz o tym? – Qualphey

-2

Ile powinienem użyć vbo?

Aż trzeba, brzmi głupio, ale dobrze, że jego sposób

Jak zaktualizować dane vbos, jeżeli wielkość danych nie jest ustalona?

Zastępuje i renderuje ten sam VBO z różnymi danymi i długością.

W jaki sposób utworzyć vbos?

Jak powinienem renderować vbos?

zobaczyć VBO tutorial

Jak należy sobie radzić z danymi vbos że nie chcę, aby uczynić więcej?

utwórz nowe vbo i skopiuj do niego dane lub wyrenderuj tylko części tego pliku, który znajduje się w pamięci.

Aby uczynić jedynie części zobaczyć glVertexBufferglTexCoordPointer (wystarczy obliczyć nowy wskaźnik i nowy rozmiar w oparciu o przesunięcie)

Edycja 1:

Używając jednego VBO za wszystko czuje się źle, bo trzeba zarządzać alokacją nowych pozycji wierzchołków/faktur koordynuje się samemu, co bardzo szybko staje się bałaganiarskie.

Lepiej jest grupować małe rekwizyty w VBO i grupować polecenia rysowania.

Czy mogę dodać dane do bufora za pomocą glBufferSubData (dodając 100 elementów do bufora o rozmiarze x)?

Nie, nie jest to możliwe, ponieważ opis mówi: updates a subset of a buffer object's data store, a podzbiór jest mniejszym zbiorem wewnątrz zestawu.

Edycja 2

Dobry poradnik jest również Learning Modern 3D Graphics Programming ale jej nie VBO specyficzny.

+0

Czy możesz podać mi informacje na temat tworzenia vbo? Zastanawiam się nad użyciem jednego vbo na wszystko. Ponieważ wiem, że nie możesz nazwać 'glBufferSubData' bez wcześniejszego wywoływania' glBufferData'. Jakie dane powinienem dodać do vbo, jeśli wszystkie dane powinny zostać dodane później? A jeśli w przykładzie rozmiar danych przechowywanych w vbo wynosi 100, czy mogę użyć 'glBufferSubData' do dodania danych o rozmiarze 200? – Qualphey

+0

Oh i liczba niektórych oczekujących zmian w każdej klatce. Czy powinienem też stworzyć nowe vbo, aby sobie z tym poradzić? – Qualphey

+6

-1: Za rekomendowanie nieaktualnych samouczków NeHe. –

Powiązane problemy