glGet lastet Programm aus



  • Hallo,

    Das folgende Programm lastet meine CPU (i7 2600k) zu ca. 5% aus.

    #include <Windows.h>
    
    #include <GL\GL.h>
    #pragma comment(lib, "opengl32.lib")
    
    #define WM_GETGLRC (WM_USER + 0x0001)
    
    bool running;
    
    LRESULT CALLBACK MessageProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	static HDC hDC = NULL;
    	static HGLRC hRC = NULL;
    	static HINSTANCE hInstance = NULL;
    	static LPCWSTR szClassName = NULL;
    	static LPPAINTSTRUCT ps = NULL;
    
    	switch(message)
    	{
    	case WM_GETGLRC:
    		return (LRESULT)hRC;
    	case WM_CREATE:
    	{
    		hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
    		szClassName = ((LPCREATESTRUCT)lParam)->lpszClass;
    
    		hDC = GetDC(hWnd);
    
    		PIXELFORMATDESCRIPTOR pfd =
    		{
    			sizeof(PIXELFORMATDESCRIPTOR),
    			1,
    			PFD_DRAW_TO_WINDOW |
    			PFD_SUPPORT_OPENGL |
    			PFD_DOUBLEBUFFER,
    			PFD_TYPE_RGBA,
    			32,
    			0,0,0,0,0,0,0,0,0,0,0,0,0,
    			16,
    			8,
    			0,0,0,0,0,0
    		};
    
    		int nPF = ChoosePixelFormat(hDC, &pfd);
    
    		SetPixelFormat(hDC, nPF, &pfd);
    
    		hRC = wglCreateContext(hDC);
    		wglMakeCurrent(hDC, hRC);
    
    		glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    
    		wglMakeCurrent(NULL, NULL);
    		break;
    	}
    	case WM_DESTROY:
    		wglMakeCurrent(hDC, hRC);
    		wglDeleteContext(hRC);
    		wglMakeCurrent(NULL, NULL);
    
    		ReleaseDC(hWnd, hDC);
    		UnregisterClass(szClassName, hInstance);
    		running = false;
    		break;
    	default:
    		return DefWindowProc(hWnd, message, wParam, lParam);
    	}
    
    	return 0;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
    {
    	running = true;
    
    	LPCWSTR szAppName = L"OpenGL_TestApp";
    
    	WNDCLASSEX wc;
    	wc.cbClsExtra = 0;
    	wc.cbSize = sizeof(WNDCLASSEX);
    	wc.cbWndExtra = 0;
    	wc.hbrBackground = NULL;
    	wc.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));
    	wc.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION));
    	wc.hIconSm = wc.hIcon;
    	wc.hInstance = hInstance;
    	wc.lpfnWndProc = MessageProc;
    	wc.lpszClassName = szAppName;
    	wc.lpszMenuName = NULL;
    	wc.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC;
    
    	RegisterClassEx(&wc);
    
    	HWND hMainWnd = CreateWindowEx(0,
    								szAppName,
    								szAppName,
    								WS_OVERLAPPED |
    								WS_SYSMENU |
    								WS_CAPTION |
    								WS_SIZEBOX |
    								WS_MINIMIZEBOX |
    								WS_MAXIMIZEBOX,
    								0,
    								0,
    								1280,
    								720,
    								NULL,
    								NULL,
    								hInstance,
    								NULL);
    
    	ShowWindow(hMainWnd, SW_SHOWNORMAL);
    
    	MSG msg;
    
    	HDC hDC = GetDC(hMainWnd);
    	HGLRC hRC = (HGLRC)SendMessage(hMainWnd, WM_GETGLRC, 0, 0);
    	wglMakeCurrent(hDC, hRC);
    
    	while(running)
    	{
    		if(PeekMessage(&msg, hMainWnd, 0, 0, PM_REMOVE))
    		{
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    		else
    		{
    			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    			glLoadIdentity();
    
    			GLint viewport[4];
    			glGetIntegerv(GL_VIEWPORT, viewport); // langsam
    
    			SwapBuffers(hDC);
    
    			Sleep(10);
    		}
    	}
    
    	return 0;
    }
    

    Wenn ich nun das glGetIntegerv aus Zeile 137 entferne lastet sind es 0%.

    Wieso lastet glGetIntegerv meinen Prozessor so stark aus?



  • Was passiert wenn du Sleep vor SwapBuffers setzt?



  • immer noch 5%



  • glGet* ist mit Hardwarebeschleunigung sehr teuer.
    Warum ist das in der Form auch in der Loop?
    Macht wenig Sinn imho.
    glGet sollte nur dann aufgerufen werden wenns auch Sinn macht.
    Ausserdem macht das Sleep da relativ wenig Sinn und hält den Prozess nur auf.
    Was soll es bezwecken?



  • Ohne Sleep() habe ich 13% auslastung, weil der Thread doch ganz ausgelastet wird.



  • Naja gut, aber das glGet hat wie gesagt in einer Schleife nix zu suchen, solange es sich vermeiden lässt. Wüsste auch nicht warum man das mit diesen Parametern jeden Frame aufrufen müsste.

    Davon abgesehen, worum gehts dir hier?



  • Hab mich nur gewundert.


Log in to reply