2013-08-30 11 views
8

Zacząłem ćwiczyć OpenGL z Glew i Freeglut.Freeglut, OpenGL i pamięć

Mam pytanie dotyczące mojej aplikacji i zastanawiałem się, czy ktoś wpadł na ten sam problem (jeśli jest)?

Kiedy początkowo wykonuję swoją aplikację, używana pamięć wynosi około 22 000 KB. Po zminimalizowaniu okna i zmaksymalizowaniu go, zajmuje on tylko 2900-3 300 KB pamięci i nadal to robi, nawet po zminimalizowaniu i zmaksymalizowaniu okna, jak również wprowadzeniu myszy i klawiatury podczas ustawiania ostrości okna.

Zastanawiam się, dlaczego tak się dzieje? Nie wiem zbyt wiele o FreeGlut i zastanawiam się, czy ktokolwiek zauważył to zachowanie, minimalizując/maksymalizując okno za pomocą FreeGlut. A może to jest sprawa OS-specific?

Przepraszamy za nie wspomnieć o tym wcześniej, ale używam Windows XP SP3 i mam utworzenie kontekstu OpenGL z następujących linii kodu:

glutInit(&argc, argv); 
glutInitContextVersion(3, 3); 
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); 
glutInitWindowPosition(30, 30); 
glutInitWindowSize(1000, 562); 
glutCreateWindow("Testing"); 

glewExperimental = GL_TRUE; 
glewInit(); 
+0

Z jakiego systemu operacyjnego korzystasz?W jaki sposób konfigurujesz swój kontekst GL (np. Co przekazujesz FreeGLUT)? – thokra

+0

Zdecydowanie buduję skrypt, aby to zrobić dla wszystkich moich aplikacji GL! Może automatyczne minimalizowanie (gra słów nie jest zamierzona) powinno stać się powszechną cechą wśród systemów operacyjnych? Ale z całą szczerością ("żartami na bok", SigTerm) można było przywołać pamięć, a potem nie trzeba jej ponownie po przywróceniu okna? – jozxyqk

+0

Jak mierzyć wykorzystanie pamięci i dlaczego się o to martwisz? Nowoczesny system powinien mieć co najmniej 2 GB pamięci RAM. Na moim komputerze 8 GB 22 000 KB stanowi 0,27% całkowitego zużycia pamięci. Możesz to po prostu zignorować. – SigTerm

Odpowiedz

4

Jest to wysoce OS zależne, a także zależy o tym, jak mierzyć wykorzystanie pamięci, ale mogę dać ci trochę wgląd w to, dlaczego tak się dzieje w systemie Microsoft Windows. Microsoft ma do powiedzenia na temat użycia pamięci trybu użytkownika w aplikacji, która używa sterownika opartego na WDDM:

Istniejące gry i inne aplikacje graficzne często przydzielają pamięć wirtualną dla kopii zasobów pamięci wideo, które aplikacja używa. Aplikacja korzysta z tej kopii, aby szybko przywrócić wyświetlanie w przypadku utraty zawartości pamięci wideo. Na przykład aplikacja używa tej kopii, jeśli użytkownik naciśnie klawisze ALT + TAB lub jeśli użytkownik przełącza komputer w tryb gotowości. Zazwyczaj czas wykonywania DirectX zarządza kopią w imieniu aplikacji, gdy aplikacja tworzy zarządzany zasób. Jednak aplikacja może również zarządzać samą kopią. Pamięć wirtualna używana przez kopię jest wprost proporcjonalna do zasobów pamięci wideo przydzielanych przez aplikację.

Teraz, gdy Microsoft opisuje ten problem z DirectX, dotyczy to również OpenGL. Za kulisami OpenGL zwykle zajmuje się zdarzeniami "urządzenie zgubione" w sposób całkowicie przezroczysty (nie jest to część samej OpenGL, ale systemu okien - WGL w tym przypadku). Chociaż faktycznie możesz odbierać te zdarzenia w swoim oprogramowaniu w OpenGL 4.x, używając jednego z rozszerzeń niezawodności, które zazwyczaj chcesz udawać, jakby nie istniały. W każdym razie podejrzewam, że to właśnie jest winne.

Zużycie pamięci może się znacznie różnić w zależności od sposobu mierzenia zużycia pamięci aplikacji, czy jest to po prostu liczba przydzielonych stron pamięci wirtualnej (rozmiar wirtualny), czy rzeczywiste strony rezydentne (zestaw roboczy/rezydentny). W systemie Windows, jeśli zajrzysz do menedżera zadań podczas korzystania z pamięci, jest to zwykle miara zestawu roboczego. Zestaw roboczy jest bardzo ogólnikową koncepcją i zwykle odnosi się do liczby stron, które zostały ostatnio "przywołane"; może rosnąć/kurczyć się w zależności od tego, kiedy jest pobierana, niezależnie od tego, ile pamięci faktycznie przebywa w tym momencie. Zapisałbym to do normalnego zachowania kierowcy i zdałem sobie sprawę, że ta pamięć prawdopodobnie nie wpłynie na nic poważnie.

Jeśli pracujesz na nowoczesnej platformie 64-bitowej na komputery stacjonarne (x86-64), w rzeczywistości masz 48-bitową sprzętową przestrzeń adresową (256 TiB), a system operacyjny zapewni jej ułamek (8 TiB na Windows) dla pojedynczych procesów w trybie użytkownika, więc 22 000 KiB jest całkowicie nieistotne (jeśli faktycznie skompilowałeś swoje oprogramowanie jako 64-bitowe).