Glut Funktion Fenster refreshen



  • Hallo,

    gibt es bei Glut einen Befehl / Funktion mit deren Hilfe ich nur bestimmte Teile des Fensters lösche z.B. die Farbe blau oder so? Der Grund ist dass ich immer ein bestimmten Hintergrund haben möchte aber nicht jedesmal noch den Hintergrund neu aufbauen will (flacket sehr dadurch).
    Danke... würd mein Programm schöner laufen lassen und schneller.



  • Kann es sein, dass du kein DoubleBuffering benutzest? Das würde das Flackern erklären. Schau da erstmal nach! Denn colourkeying sollte aufwendiger sein, als einfach nur die Buffer zu tauschen...



  • Wie löse ich das mit dem Double Buffering?
    Mein Programmcode ist folgendermaßen aufgebaut. Ich benutze 3 Funktionen. In der Hauptfunktion rufe ich als erstes die Funktion für den Hintergrund auf. Mit hilfe der Funktion glutidlefunc() rufe ich dann immer wieder meine Funktion auf die mir auf den Hintergrund was schreiben soll. Wenn ich aber jetzt jedes mal diese Funktion für das schreiben aufrufe flackert das Bild und das Fenster ist dann schnell vollgeschrieben da jedes mal alles aufeinander geschrieben wird. --> wenn ich jetzt jedesmal den Bildschirm lösche löscht sich auch mein Hintergrund. Nehme ich den Hintergrund in die Funktion für das schreiben der anderen Werte hinzu wird es alles sehr langsam.



  • Poste mal den Code, hört sich so an, als ob du ein konzeptionelles Problem hättest.



  • void myDisplayPoints(void)
    {
    
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_LINE_STRIP);
    int i = 0;
    	for (GLdouble x = 0; x < 640; x += 1)//524288
    	{
    		if (i == 16838)
    		{	i = 0;
    		}
    		Status = DS_GetDataCaptureDeviceChannelGroundOffsetCorrectedValues(dsHandle, &ChannelAData, &ChannelBData);
    			GLdouble scalex = x;
    			GLdouble scaley = ChannelAData.iDataBuffer[i]+varCH1Offset;		
                               glVertex2d(scalex, scaley);
    			i++;
             }
    glEnd();
    glFlush();
    }
    
    void myDisplay(void)
    {
     glClear(GL_COLOR_BUFFER_BIT);	// uses ClearColor
     glPointSize(2.0);
     glColor3f(0.0f, 0.0f, 0.0f);
    
    glBegin(GL_LINE_STRIP);
    	glVertex2d(320,0);
    	glVertex2d(320,480);
    glEnd();
    glBegin(GL_LINE_STRIP);
    	glVertex2d(0,240);
    	glVertex2d(640,240);
    
      glEnd();			// ends the lin strip
      glFlush();			// flushes image to the buffer
    }
    void CVC_TSTDlg::OnBnClickedButtonAbfrage()
    {
    _tmain();
    
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(screenWidth, screenHeight);
    glutInitWindowPosition(100,150);
    glutCreateWindow("DS2200C Oszilloskop");
    glutDisplayFunc(myDisplay);
    glutDisplayFunc(myDisplayPoints);
    glutIdleFunc(myDisplayPoints);
    myInit();
    glutMainLoop();
    
    }
    

    In der Main Funktion rufe ich ja nur einmal meine Funktion myDisplay auf um das Koordinatensystem das ich zeichne aufzurufen. Wenn ich jetzt für die Punkte die Funktion myDisplayPoints aufrufe muss ich ja erst den Bildschirm wieder löschen, da ich sonst jedes mal die Punkte übereinander zeichne.

    Danke für deine Hilfe!



  • Ok, zeichnet die Funktion myInit() irgendwas? Wenn ja, hättest du sie posten sollen. Aber gut, das passt schon.

    myDisplay() zeichnet also den Hintergrund? Und myDisplayPoints() die Werte, die darauf dargestellt werden?

    1. Eine Renderfunktion:
    Es ist wenig sinnvoll, den Hintergrund nur einmal zu zeichnen und den Rest immer wieder drauf. Also mache eine Funktion, die erst löscht, dann den Hintergrund zeichnet und dann deine ganzen Werte. So läuft es eigentlich überall ab, sonst hast du diese "Schmiererei", wenn du einfach drüberzeichnest.
    Das Flackern wird durch Punkt 2 gelöst und über die Geschwindigkeit solltest du dir auch keine Gedanken machen, der Hintergrund ist extrem Trivial.

    2. Double Buffering:
    GLUT_SINGLE in Z.43 durch GLUT_DOUBLE ersetzen, um DB zu aktivieren.
    Am Ende der Renderfunktion glutSwapBuffers() aufrufen, um den Back- und Frontbuffer zu tauschen.

    void myDisplay(){
    	glClear(GL_COLOR_BUFFER_BIT); // aufräumen
    
    	glPointSize(2.0);		// koordinatenachsen
     	glColor3f(0.0f, 0.0f, 0.0f);
    
    	glBegin(GL_LINE_STRIP);
        		glVertex2d(320,0);
        		glVertex2d(320,480);
    	glEnd();
    	glBegin(GL_LINE_STRIP);
        		glVertex2d(0,240);
        		glVertex2d(640,240);
    	glEnd();
    
    	glBegin(GL_LINE_STRIP);	// werte
    	int i = 0;
        	for (GLdouble x = 0; x < 640; x += 1){
            	if (i == 16838){
            		i = 0;
            	}
            	Status = DS_GetDataCaptureDeviceChannelGroundOffsetCorrectedValues(dsHandle, &ChannelAData, &ChannelBData);
                	GLdouble scalex = x;
                	GLdouble scaley = ChannelAData.iDataBuffer[i]+varCH1Offset;       
    
                    glVertex2d(scalex, scaley);
    
                	i++;
            }
    	glEnd();
    
    	glutSwapBuffers();
    }
    
    void CVC_TSTDlg::OnBnClickedButtonAbfrage(){
    	_tmain();
    
    	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    	glutInitWindowSize(screenWidth, screenHeight);
    	glutInitWindowPosition(100,150);
    	glutCreateWindow("DS2200C Oszilloskop");
    	glutDisplayFunc(myDisplay);
    	//glutIdleFunc(myDisplayPoints); // würde ich rauslassen, hier hat rendercode eigentlich nichts zu suchen
    	myInit();
    	glutMainLoop();
    }
    

    So, ich hoffe, das bringt dich weiter.

    gruß
    Martin



  • Hi,

    Super danke. Das Programm läuft jetzt ohne zu Flackern. Die Sache warum ich das Koordinatensystem getrennt haben möchte von dem Aufbau der Punkte liegt darin, dass ich ja ein Oszilloskop baue und wenn ich zuviel bei der Funktion für das Auslesen der Daten reinschreibe die Performance in Bach geht. So wie der Code jetzt da steht kann ich gerade mal bis ca. 500 kHz Signale auslesen, darüber kommt nur noch Datenmüll. Lt. Datenblatt des Herstellers müsste ich aber bis 20 Mhz auslesen können. Vielleicht kann man die Daten ja auch in einer anderen Funktion auslesen und zwischenspeicher und über die Koordinatenfunktion dann nur schreiben. Kann mir aber auch nicht vorstellen dass es dadurch schneller wird. bzw. es würden ja dann immer Daten fehlen, wenn er zwischen den Funktionen wechselt.

    Gruss



  • Tut mir leid, ein sinnvoller Ansatz fällt mir da nicht ein.



  • Trotzdem Danke, wenigstens läuft es jetzt damit Flimmerfrei.
    Habe mich im Internet weiter eingelesen in die Themen. Bin jetzt auf den Stencil Buffer gestoßen. Mit ihm lässt sich ja eine Schablone zeichnen. Leider gibt es da nicht einen Sourcecode den ich verstehe. Weiß einer da vllt. ein gutes einfaches Beispiel mit dem ich so das Koordinatensystem reinlegen kann?


Log in to reply