2012-07-10 16 views
8

Chcę użyć dwóch wywołań PBO, aby odczytać piksel w alternatywny sposób. Myślałem, że droga PBO będzie o wiele szybsza, ponieważ glReadPixels powraca natychmiast po uruchomieniu PBO, a wiele czasu może się pokrywać.Asynchroniczne glReadPixels z PBO

Co dziwne, wydaje się, że nie przynosi to większych korzyści. Biorąc pod uwagę niektóre kod jak:

glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); 
    Timer t; t.start(); 
    glReadPixels(0,0,1024,1024,GL_RGBA, GL_UNSIGNED_BYTE, buf); 
    t.stop(); std::cout << t.getElapsedTimeInMilliSec() << " "; 

    glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pbo); 
    t.start(); 
    glReadPixels(0,0,1024,1024,GL_RGBA, GL_UNSIGNED_BYTE, 0); 
    t.stop(); std::cout << t.getElapsedTimeInMilliSec() << std::endl; 

Rezultatem jest

1.301 1.185 
1.294 1.19 
1.28 1.191 
1.341 1.254 
1.327 1.201 
1.304 1.19 
1.352 1.235 

PBO sposobem jest trochę szybciej, ale nie zadowalającym natychmiastowego powrotu

Moje pytanie brzmi:.

  • Jaki jest czynnik wpływający na wydajność glReadPixels? Czasami jego koszt sięga 10ms, ale 1,3ms tutaj.
  • Dlaczego natychmiastowy zwrot kosztuje aż 1,2ms? Czy jest zbyt duży czy zwyczajny?

=========================================== ================================

W porównaniu do wersji demo, znalazłem dwa czynniki:

  • GL_BGRA jest lepsza niż GL_RGBA, 1.3ms => 1.0ms (bez PBO), 1.2ms => 0.9ms (z PbO)
  • glutInitDisplayMode (GLUT_RGB | GLUT_ALPHA) niż GLUT_RGBA, 0.9ms => 0.01ms To jest to, czego chcę. W moim systemie GLUT_RGBA = GLUT_RGB = 0. GLUT_ALPHA = 8

potem jeszcze dwa pytania:

  • Dlaczego GL_BGRA jest lepsza niż GL_RGBA? Czy dotyczy to konkretnej platformy lub wszystkich platform?
  • Dlaczego GLUT_ALPHA jest tak ważny, że ma duży wpływ na wydajność PBO?
+0

ooo to sobie właśnie testowane na moim systemie GLUT_RGBA 330 fps GLUT_RGB | 630fps GLUT_ALPHA to wzrost o czynnik 2 ominęło że GLUT_ALPHA było ważne. – ColacX

Odpowiedz

5

Nie wiem, glutInitDisplayMode na pamięć, ale zazwyczaj dzieje się tak dlatego, że format wewnętrzny i zewnętrzny nie pasują do siebie. Na przykład nie zauważysz asynchronicznego zachowania, gdy liczba składników nie jest zgodna, ponieważ ta konwersacja nadal blokuje glReadPixels.

Więc najprawdopodobniej problemem jest to, że z glutInitDisplay(GLUT_RGBA) będzie faktycznie utworzyć domyślną bufora ramki z wewnętrznym formacie, który jest faktycznie RGB lub nawet BGR. podanie parametru GLUT_ALPHA prawdopodobnie spowoduje, że będzie on wewnętrznie zgodny z liczbą wymaganych składników.

edytuj: Znalazłem nvidia document wyjaśniając niektóre kwestie dotyczące pakowania pikseli i wpływu na wydajność.

edit2: Zwiększenie wydajności o BGRA jest prawdopodobne, ponieważ wewnętrzny bufor hw jest w BGRA, tak naprawdę nie ma o wiele więcej.

2

BGRA jest najszybszy, ponieważ jest to macierzysty format na nowoczesnych procesorach graficznych. RGBA, RGB i BGR wymagają "ponownego formatowania" podczas odczytu.