我使用qt的qopenglwidget进行绘图,将ffmpeg解码的数据通过信号槽发送给它,但渲染速度略慢,求解答



  •     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, id_y);
        glTexImage2D ( GL_TEXTURE_2D, 0, GL_RED, pixel_w, pixel_h, 0, GL_RED, GL_UNSIGNED_BYTE, plane[0]);
        m_program->setUniformValue(textureUniformY, 0);
    
        glActiveTexture(GL_TEXTURE1);
        glBindTexture(GL_TEXTURE_2D, id_u);
        glTexImage2D ( GL_TEXTURE_2D, 0, GL_LUMINANCE, pixel_w/2, pixel_h/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, plane[1]);
        m_program->setUniformValue(textureUniformU, 1);
    
        glActiveTexture(GL_TEXTURE2);
        glBindTexture(GL_TEXTURE_2D, id_v);
        glTexImage2D ( GL_TEXTURE_2D, 0, GL_LUMINANCE, pixel_w/2, pixel_h/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, plane[2]);
        m_program->setUniformValue(textureUniformV, 2);
    
        glDisable(GL_DEPTH_TEST);//should be put before glDrawArrays
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    
        glDisable(GL_DEPTH_TEST);
    

    这是paintGL()里的代码,实测我的widget渲染速度慢,SDL渲染速度正常。我知道SDL是先UpdateTexture(data),然后RENDER。想知道OPENGL那些函数做如下操作:将数据发过来提前绘制好,等到需要显示的时候,show一下就行。主要是想提高渲染速度



  • @flowerlove

     glTexImage2D ( GL_TEXTURE_2D, 0, GL_LUMINANCE, pixel_w/2, pixel_h/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, plane[2]);
    
    

    这个是耗时操作。
    要使用glTexSubImage2D来替换,并且用算法来优化调用,这样就好了。



  • @jiangcaiyang 0_1453691368011_QQ图片20160125110838.png
    已经改成sub,但速度仍然慢,注掉显示部分(opengl绘图),fps 29,视频文件的fps为29.加上显示之后fps只有23,单个窗口就已经降低了6帧。多个窗口不能看。



  • 你可能需要这么做,将视频数据渲染到FBO,然后多个窗口共享。Qt有很方便的QOpenGLFramebufferObject可以使用,具体还是看看Qt的帮助文档吧。



  • @jiangcaiyang 嗯,谢了。不过在这之前,有一个热心的群友告诉我,可以用PBO,或者新版本的函数glTexStorage2D,不知道您对此怎么看。



  • @jiangcaiyang 我的目标并不是多个窗口同时渲染一个文件。我做的是视频播放器,只不过是我测试的时候,打开了同一个而已。你说的这种方法,仅是为了多个窗口共享吗? 真实情况是有好多不同的视频需要播放



  • @flowerlove 那可能借助成熟的框架来做了。比如说听说QtAV挺好的,我还没有尝试过。
    https://github.com/wang-bin/QtAV


登录后回复
 

与 萌梦社区 的连接断开,我们正在尝试重连,请耐心等待