实时处理大量点时,以前用贴图的方法,qt里用QGraphicsScene贴图还是毫秒级,故这里试了下opengl实时画,结论点少还行,20000个点就不行了,cpu占到10%了,可能三代i5集显太差,这块不大懂了,还是老实贴图吧。也记录一下失败。
就是这么多点,好挂了。
代码没啥说的了,都是一个套路,先把画好的点存好,然后发送还未画的点,直接画。
bool AkGisWidget::SendGpuPoints()
{
QOpenGLVertexArrayObject *vaop;
QOpenGLBuffer *vbop;//{QOpenGLBuffer::VertexBuffer};
QOpenGLBuffer *ebop;//{QOpenGLBuffer::IndexBuffer};
vaop = new QOpenGLVertexArrayObject;
vbop = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer);
ebop = new QOpenGLBuffer(QOpenGLBuffer::IndexBuffer);
vbop->create();
ebop->create();
int PointsCount = vecPoints.size();
if(PointsCount-randered<1)
return false;
float* vertices = new float[(PointsCount-randered) * 5 * sizeof(float)];
std::vector<unsigned int > indices;
int index = 0;
for (int i = randered; i < PointsCount; ++i) {
qDebug()<<"PointsCount"<< vecPoints[i].x<<vecPoints[i].y<<randered<< PointsCount;
vertices[index] = vecPoints[i].x;
vertices[index + 1] = vecPoints[i].y;
vertices[index + 2] = 0.5;
vertices[index + 3] = 0.6;
vertices[index + 4] = 0.1;
index += 5;
indices.push_back(i-randered);
}
QOpenGLVertexArrayObject::Binder vaoBind(vaop);
vbop->bind();
vbop->allocate(vertices,4*index);
ebop->bind();
ebop->allocate(&indices[0],indices.size()*4);
// if (!pointsadded )
// {
FeatureDesc featureDesc;
featureDesc.type = 4;
featureDesc.indexCnt = indices.size();
featureDesc.vexCnt = PointsCount - randered;
featureDesc.vao = vaop;
featureDesc.vbo = vbop;
featureDesc.ebo = ebop;
featureDesc.shader = &pointShader;
vecFeatureDesc.append(featureDesc);
pointsadded = true;
pointsFeatureIndex = vecFeatureDesc.count()-1;
// }
randered = PointsCount;
// if(pointsFeatureIndex>=0)
// {
// vecFeatureDesc[pointsFeatureIndex].indexCnt = 0;
// vecFeatureDesc[pointsFeatureIndex].vexCnt = PointsCount;
// }
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(2 * sizeof(float)));
glEnableVertexAttribArray(1);
vbop->release();
return true;
}
渲染点
if(vecFeatureDesc[i].type==4)
{
lineShader.bind(); lineShader.setUniformValue("u_MVP", mvp);
QOpenGLVertexArrayObject::Binder vaoBind(vecFeatureDesc[i].vao);
vecFeatureDesc[i].ebo->bind();
glDrawElements(GL_POINTS,vecFeatureDesc[i].vexCnt, GL_UNSIGNED_INT, nullptr);
}