OpenGL frame rate issue
-
wrote on 6 Dec 2016, 19:04 last edited by
Hi everyone,
I am working on TI AM5728 EVM board, linux from TI SDK.
I have an simple Qt openGL widget that just scroll a 1920*640 image on the screen, and the image is preloaded.
When I set the widget window to 800640 which is the default of the EVM screen, the time between each frame is 16-17ms, or 60 Hz, which is good. And when I connect to a external HDMI display(the monitor is set at 19201080) and the widget stay at 800*640, the time is still 16-17ms, it is normal and reasonable so far.
but when I increase the resolution to 1000640 and add little by little (1100640 1200640,etc) the strange thing starts.
@1000640: 16-17ms.
@1100640: 16-17ms.
@1200640: 90% of the time 16-17ms, 10% of the time 33-34 ms, which is 30Hz
@1300*640: 80% of the time 33-34ms, 20% of the time 16-17 ms.
@1300+ *640: all 33-34 ms.It seems like somewhere around at resolution 1200640, there is a limit, once I cross the limit, it half the FPS.
My goal is to run it at 1920640@60fps.
Please help.There is the part of my code. modified from an example.
MainWidget::MainWidget(QWidget *parent) : QOpenGLWidget(parent), geometries(0), texture(0), angularSpeed(0) { } MainWidget::~MainWidget() { // Make sure the context is current when deleting the texture // and the buffers. makeCurrent(); delete texture; delete geometries; doneCurrent(); } void MainWidget::timerEvent(QTimerEvent *) { movement=(movement>2)?0:movement+0.006; int t=timer0.elapsed()-temp; if((t<16)||(t>17)) qDebug() << t << "milliseconds"; temp=timer0.elapsed(); update(); } void MainWidget::initializeGL() { QSurfaceFormat format; format.setSwapBehavior(QSurfaceFormat::DoubleBuffer); format.setSwapInterval(1); setFormat(format); initializeOpenGLFunctions(); glClearColor(1.0f,1.0f,1.0f,1.0f); setGeometry(0, 0, 1300, 640); initShaders(); initTextures(); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); geometries = new GeometryEngine; timer.start(0, this); } void MainWidget::initTextures() { // Load image Image = QImage(800, 640, QImage::Format_RGB888); Image = QImage(":/Test.bmp"); texture = new QOpenGLTexture(Image.mirrored()); // texture->setFormat(QOpenGLTexture::RGB8U); // Set nearest filtering mode for texture minification //texture->setMinificationFilter(QOpenGLTexture::Nearest); // Set bilinear filtering mode for texture magnification //texture->setMagnificationFilter(QOpenGLTexture::Linear); // Wrap texture coordinates by repeating // f.ex. texture coordinate (1.1, 1.2) is same as (0.1, 0.2) //texture->setWrapMode(QOpenGLTexture::Repeat); } void MainWidget::resizeGL(int w, int h) { // Calculate aspect ratio //qreal aspect = qreal(w) / qreal(h ? h : 1); // Set near plane to 3.0, far plane to 7.0, field of view 45 degrees const qreal zNear = 1.0, zFar = 5.5, fov = 28; // Reset projection //projection.setToIdentity(); // Set perspective projection projection.perspective(fov, 1, zNear, zFar); } void MainWidget::paintGL() { texture->bind(); // Calculate model view transformation QMatrix4x4 matrix; matrix.translate(movement, 0.0, -5.0); //matrix.rotate(rotation); // Set modelview-projection matrix program.setUniformValue("mvp_matrix", projection * matrix); // Use texture unit 0 which contains cube.png program.setUniformValue("texture", 0); // Draw cube geometry geometries->drawCubeGeometry(&program); } //your code here
-
wrote on 6 Dec 2016, 19:43 last edited by
Hi! Why do you think this issue is related to Qt? Maybe the GL hardware (or driver) just isn't capable enough.
1/2