标题:ios 真机 qopenglwidget
作者:浮云也是风景
日期:2015-12-01 14:57
内容:
我用 QOpenglwidget继承的类实现opengl渲染yuv显示图像,在模拟器里面比较正常,UI页面切换没有卡顿,但是真机调试的时候就卡顿很明显,后来找到原因好像是paintGL实现函数的开头加了 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); 语句,但是这句是用于清除颜色缓冲和深度缓冲的,然后发现就算是不显示图像时,有这句话,切换UI页面也会造成卡顿,这是什么原因?
#1 [xianqingzh 12-01 19:18]
共享一下源码
#2 [浮云也是风景 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"
&nbs ..
#3 [浮云也是风景 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;
fU = new uint8_t;
fV = new uint8_t;
}
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);
}
#4 [浮云也是风景 12-04 09:55]
单窗口下,UI切换正常,但是多窗口就不行了,求解惑啊啊啊
#5 [momognu 12-25 10:10]
我在android多窗口也不行啊,只能由一个window,别的都是item装到一个stackview里