2012-01-13 5 views
6

Czy napotkaliście sytuację, w której aplikacja C++ opengl działa szybciej i płynniej, gdy jest wykonywana z visual studio? Gdy wykonywany normalnie, bez debuggera, uzyskuję mniejszą liczbę klatek na sekundę, 50 zamiast 80, i dziwne opóźnienie, gdzie fps nurkuje do około 25 klatek na sekundę w każdej 20-30 klatce. Czy istnieje sposób, aby to naprawić?C++/aplikacja opengl działa płynniej z dołączonym debugerem

Edytuj: Używamy również wielu list wyświetlania (utworzonych za pomocą glNewList). A zwiększenie liczby list wyświetlania wydaje się zwiększać opóźnienie.

Edytuj: Problem prawdopodobnie wynika z błędów stronicowania. Dostosowywanie zestawu roboczego procesu za pomocą metody SetProcessWorkingSetSizeEx() nie pomaga.

Edit: przypadku niektórych dużych modeli problem jest łatwy do wykrycia z wykorzystaniem GPU pamięci procexp użytkowych za. Wykorzystanie pamięci jest bardzo niestabilne, gdy istnieje wiele wywołań glCallList na klatkę. Nie dodano nowej geometrii, nie załadowano tekstur, ale alokacja pamięci gpu waha się w granicach -20 MB. Po chwili staje się jeszcze gorsza i może za jednym razem przydzielić około 150 Mb.

+0

Czy korzystasz z trybu pełnoekranowego, czy nie na pełnym ekranie w debugerze? To wskazywałoby na włączenie synchronizacji V. – stonemetal

+0

Nie na pełnym ekranie, ale zmaksymalizowany. Synchronizacja V powinna być wyłączona w obu przypadkach. Czasami dostaję fps-stawki powyżej 100 i wciąż w tyle. – AareP

+0

powinieneś użyć czegoś takiego jak Process Explorer, aby zobaczyć, które biblioteki DLL zostaną załadowane w obu przypadkach i czy ta sama biblioteka DLL zostanie wczytana ze ścieżek różnicowych – PeterT

Odpowiedz

0

To prawdopodobnie wątek lub priorytet procesu. Visual Studio może uruchomić twój proces z nieco wyższym priorytetem, aby upewnić się, że debugger reaguje. Spróbuj użyć SetPriorityClass() w kodzie aplikacji:

SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS); 

do „normalnej” klasy wyżej tylko trąca go przed wszystkim innym z „normalnej” klasy. Jak mówi dokumentacja, nie uderzaj w super wysoki priorytet lub możesz zepsuć harmonogram systemu.

W aplikacji działającej z szybkością 60 klatek na sekundę uzyskuje się tylko 16 ms, aby narysować ramkę (mniej przy 80 fps!) - jeśli trwa to dłużej, należy opuścić ramkę, co może spowodować niewielki spadek liczby klatek na sekundę. Jeśli twoja aplikacja ma taki sam priorytet jak inne aplikacje, jest prawdopodobne, że inna aplikacja może tymczasowo ukraść procesor dla jakiegoś zadania, a opuścisz kilka klatek lub przynajmniej przegapisz 16 ms dla bieżącej ramki. Pomysł polega na zwiększeniu priorytetu, co nieznacznie oznacza, że ​​system Windows częściej wraca do Twojej aplikacji, aby nie upuścić tylu klatek.

+0

Seens sensowne, ale jaka jest relacja twojej odpowiedzi z różnicą wydajności między wersjami debug/release? –

+0

Nie pomogło. Szybkość Fps jest nadal "niestabilna" przy wykonywaniu oddzielnie od visual studio.Zawsze używam wersji Release, ale wykonuję ją z visual studio lub normalnie. – AareP

+0

Również zmiana SetProcessPriorityBoost nie pomaga. – AareP

3

Wierzę, że to, co widzisz jest debugger blokowanie niektórych stron, tak że nie mogą być zamienione być natychmiast dostępne dla debuggera. To przynosi pewne zastrzeżenia dla systemu operacyjnego w momencie przełączania procesów i ogólnie nie jest polecane.

Prawdopodobnie nie będzie chciał słyszeć mnie mówiąc to, ale nie jest dobrym sposobem, aby to naprawić, nawet jeśli nie.

Używaj VBO lub przynajmniej tablic werteksów, można oczekiwać, że można zoptymalizować optymalizację w sterowniku (spójrzmy prawdzie w oczy - listy wyświetlania stają się przestarzałe). Listy wyświetlania można łatwo zawijać w celu wygenerowania buforów wierzchołków, więc tylko niewielka część starego kodu wymaga modyfikacji. Można również użyć "bezbłędnej grafiki", która została zaprojektowana w celu uniknięcia błędów strony w sterowniku (GL_EXT_direct_state_access).

2

Czy masz kartę graficzną nVidia przypadkiem? nVidia OpenGL wydaje się używać innej implementacji, gdy jest dołączony do debuggera. Dla mnie wersja bez debuggera przecieka pamięć z szybkością do 1 MB/s w niektórych sytuacjach, w których rysuję do bufora przedniego i nie wywołuję glClear dla każdej ramki. Wersja debuggera jest absolutnie w porządku.

nie mam pojęcia, dlaczego to musi przeznaczyć i (czasami) deallocate tyle pamięci na scenie to nie zmienia.

I nie używam list wyświetlania.

+0

Dziękujemy! Potwierdzam, że sterowniki nVidia OpenGL mają znaczną różnicę wydajności (x100) między wersjami Release a Debugowanie w pewnych warunkach. Miałem projekt OpenGL, który używał skórek animacji i działał na .4FPS na dwóch różnych komputerach Windows opartych na nVidii. Jednak projekt byłby uruchamiany na około 30 FPS na maszynach AMD lub na sprzęcie nVidii mojego Macbooka. Jednak na maszynach Windows/nVidia, jeśli uruchomiłem projekt z otwartym oknem Profili Unity, przyspieszyłoby to z .4FPS do 30FPS, a gdybym uruchomił samodzielne narzędzie do debugowania OpenGL, uruchomiłoby to również 30FPS. –

+0

@RiazRizvi Obecnie mam podobne problemy i zastanawiałem się, którego narzędzia debugowania OpenGL używasz? – ShinNoNoir

+0

To było jakiś czas temu, ale myślę, że to był ten darmowy https://www.opengl.org/sdk/tools/gDEBugger/. Moją konkluzją było, że DLL OpenGL systemu Windows stworzony do debugowania, działają lepiej niż wersja wydania, dla skórek animacji, ponieważ uruchomienie projektu za pomocą narzędzia do debugowania powoduje załadowanie wersji debugowania sterowników OpenGL. Ponownie, ale to było dwa lata temu - nie jestem pewien, czy to nadal tak jest. –

Powiązane problemy