查看完整版本: [-- ios 真机 qopenglwidget --]

QTCN开发网 -> Qt移动平台开发 -> ios 真机 qopenglwidget [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

浮云也是风景 2015-12-01 14:57

ios 真机 qopenglwidget


我用 QOpenglwidget继承的类实现opengl渲染yuv显示图像,在模拟器里面比较正常,UI页面切换没有卡顿,但是真机调试的时候就卡顿很明显,后来找到原因好像是paintGL实现函数的开头加了 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); 语句,但是这句是用于清除颜色缓冲和深度缓冲的,然后发现就算是不显示图像时,有这句话,切换UI页面也会造成卡顿,这是什么原因?

xianqingzh 2015-12-01 19:18
共享一下源码

浮云也是风景 2015-12-02 09:12
主要相关函数是这三个,根据  http://blog.csdn.net/leixiaohua1020/article/details/40379845 这篇文章和Qt自带的例子想结合改动
initializeGL{

initializeOpenGLFunctions();
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    initshader();
}


initshader{

QOpenGLShader *vshader = new QOpenGLShader(QOpenGLShader::Vertex, this);
    const char *vsrc =
            "attribute vec4 vertexIn;\n"
            "attribute vec2 textureIn;\n"
            "varying vec2 textureOut;\n"
            "void main(void)\n"
            "{\n"
            "    gl_Position = vertexIn;\n"
            "    textureOut = textureIn;\n"
            "}\n";

    vshader->compileSourceCode(vsrc);

    QOpenGLShader *fshader = new QOpenGLShader(QOpenGLShader::Fragment, this);
    const char *fsrc =
        "precision highp float;"
            "varying vec2 textureOut;\n"
            "uniform sampler2D tex_y;\n"
            "uniform sampler2D tex_u;\n"
            "uniform sampler2D tex_v;\n"
            "void main(void)\n"
            "{\n"
            "    vec3 yuv;\n"
            "    vec3 rgb;\n"
            "    yuv.x = texture2D(tex_y, textureOut).r;\n"
            "    yuv.y = texture2D(tex_u, textureOut).r - 0.5;\n"
            "    yuv.z = texture2D(tex_v, textureOut).r - 0.5;\n"
            "    rgb = mat3( 1,       1,         1,\n"
            "                0,       -0.39465,  2.03211,\n"
            "                1.13983, -0.58060,  0) * yuv;\n"
            "    gl_FragColor = vec4(rgb, 1);\n"
            "}\n";

    fshader->compileSourceCode(fsrc);

    program = new QOpenGLShaderProgram;
    program->addShader(vshader);
    program->addShader(fshader);
    program->bindAttributeLocation("vertexIn", PROGRAM_VERTEX_ATTRIBUTE);
    program->bindAttributeLocation("textureIn", PROGRAM_TEXCOORD_ATTRIBUTE);
    program->link();

    program->bind();
    program->setUniformValue("textureOut", 0);
    program->setAttributeValue("VShowBackColor", 1.0);

    textureUniformY = program->uniformLocation("tex_y");
    textureUniformU = program->uniformLocation("tex_u");
    textureUniformV = program->uniformLocation("tex_v");

    glVertexAttribPointer(PROGRAM_VERTEX_ATTRIBUTE, 2, GL_FLOAT, 0, 0, vertexVertices);
    glEnableVertexAttribArray(PROGRAM_VERTEX_ATTRIBUTE);

    glVertexAttribPointer(PROGRAM_TEXCOORD_ATTRIBUTE, 2, GL_FLOAT, 0, 0, textureVertices);
    glEnableVertexAttribArray(PROGRAM_TEXCOORD_ATTRIBUTE);


    glGenTextures(1, &id_y);
    glBindTexture(GL_TEXTURE_2D, id_y);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    glGenTextures(1, &id_u);
    glBindTexture(GL_TEXTURE_2D, id_u);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    glGenTextures(1, &id_v);
    glBindTexture(GL_TEXTURE_2D, id_v);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

}
paintGL{

        glClearColor(0.0,0.0,0.0,0.0);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, id_y);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, fYSize, fHeight, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, fY);
        glUniform1i(textureUniformY, 0);

        glActiveTexture(GL_TEXTURE1);
        glBindTexture(GL_TEXTURE_2D, id_u);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, fYSize/2, fHeight/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, fU);
        glUniform1i(textureUniformU, 1);


        glActiveTexture(GL_TEXTURE2);
        glBindTexture(GL_TEXTURE_2D, id_v);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, fYSize/2, fHeight/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, fV);
        glUniform1i(textureUniformV, 2);
        
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}


浮云也是风景 2015-12-02 09:25
一帧数据解码传递过来做了一次拷贝
    updateYUVtexture(AVFrame *yuv){
        yuvData = yuv;
        fWidth = yuv->width;
        fHeight = yuv->height;
        
        if ((fYSize != yuv->linesize[0]) || (fUSize != yuv->linesize[1])) {
            freeFrameBuf();
            fYSize = yuv->linesize[0];
            fUSize = yuv->linesize[1];
            fVSize = yuv->linesize[1];
            fY = new uint8_t[fYSize * fHeight];
            fU = new uint8_t[fUSize * fHeight/2];
            fV = new uint8_t[fVSize * fHeight/2];
        }
        memcpy(fY, yuv->data[0], fYSize * fHeight);
        memcpy(fU, yuv->data[0] + fYSize * fHeight, fUSize * fHeight /2);
        memcpy(fV, yuv->data[0] + fYSize * fHeight * 5 / 4, fUSize * fHeight /2);
}


浮云也是风景 2015-12-04 09:55
单窗口下,UI切换正常,但是多窗口就不行了,求解惑啊啊啊

momognu 2015-12-25 10:10
我在android多窗口也不行啊,只能由一个window,别的都是item装到一个stackview里

彩阳 2015-12-25 13:32
这个做法不是推荐的做法。要结合Qt Quick。目前只能选用OpenGL ES 2。过几年大家就可以铺展OpenGL ES 3了。

浮云也是风景 2015-12-28 09:50
momognu:我在android多窗口也不行啊,只能由一个window,别的都是item装到一个stackview里 (2015-12-25 10:10) 

android下我这里到没有问题,就是在iPhone真机上才有卡顿现象

彩阳 2015-12-28 20:31
来一个我的新的签名档。
[attachment=14663]


查看完整版本: [-- ios 真机 qopenglwidget --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled