glutSwapBuffers()不像glFlush()那么快

时间:2017-06-06 14:24:31

标签: c opengl glut

信息

我使用<Chain> <MsiPackage Id="mongodb.msi" SourceFile="$(var.mongoSourceDir)\mongodb-win32-x86_64-2008plus-ssl-3.4.4-signed.msi" EnableFeatureSelection="yes" DisplayInternalUI="yes" Compressed="yes" Visible="yes" /> </Chain>COpenGL编写了我的Rhythm游戏(如DJ Max,Jubeat等)代码。

  1. 我的自定义显示功能每隔10ms调用GLUT
  2. 在我的显示功能中,我使用glutTimerFunc()用单个缓冲区绘制笔记,它显示出良好的速度但有一些闪烁。
  3. 当我使用双缓冲区将glFlush()更改为glFlush()时,速度会变慢,因此定时器功能不会每10毫秒完全调用一次。
  4. 问题

    如何在没有任何闪烁的情况下实现更快的动画(或重新绘制),每10毫秒刷新一次屏幕?

    这是我的代码。

    代码

    初始化并开始音乐和游戏。

    glutSwapBuffers()

    显示功能

    void musicStart(int id) {
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
        glutInitWindowSize(1600, 900);
        glutCreateWindow("Rhythm And Lines - Evnas");
    
        glutDisplayFunc(displayMainWindow);
        enter code hereglutKeyboardFunc(keyboardMainWindow);
        glutKeyboardUpFunc(keyboardUpMainWindow);
        glutTimerFunc(10, timerMainWindow, 1);
    
        score = 0;
        g_maxNotes = 6000;
        myTmpNotes = (TmpNote*)malloc(sizeof(TmpNote)*MAXSIZE);
        loadData(id);
    
        initMainWindow();
        playMusic(id);
        glutMainLoop();
    }
    

    计时器功能,每10ms重复显示

    void displayMainWindow(){
        int tmpIdx=0;
        int j,k;
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();
        drawLines();
    
        if (line < g_maxNotes) {
            for (j = line; j < line+MAXSIZE; j++) {
                strcpy(myTmpNotes[tmpIdx].noteId, g_notes[j].noteId);
                myTmpNotes[tmpIdx].timeslice = g_notes[j].timeslice;
                myTmpNotes[tmpIdx].originIdx = j;
                tmpIdx++;
            }
    
            for (k=0; k<=MAXSIZE; k++) {
                printNoteGUI(myTmpNotes[k].noteId, k);
            }
        }
        highlightKey();
    
        sprintf(scoreStr, "%d", score);
        drawText(MAX_X/2, MAX_Y/2, scoreStr);
    
        //glFlush(); -> Fast but flickering
        glutSwapBuffers(); // -> No flickering but slow
    }
    

    我必须只使用void timerMainWindow(){ line++; glutPostRedisplay(); glutTimerFunc(10, timerMainWindow, 1); } COpenGL,因为这是我学校项目的规则。

0 个答案:

没有答案