只有在没有调试的情况下运行时才会出现OpenGL错误,怎么可能?

时间:2012-07-31 20:54:07

标签: c++ visual-studio-2010 opengl

编写一个小小的OpenGL应用程序时,我遇到了一个奇怪的错误。当我在Visual Studio中使用F5(带调试)运行应用程序时,它运行良好。如果我使用Ctrl + F5(没有调试)运行它,它将以0 FPS运行。在这两种情况下,我都在Visual Studio中使用“Release”构建。

怎么可能? 运行程序的两种方式之间有什么不同,应该修改程序的运行吗?这是一个疯狂的错误,以某种方式连接到AntTweakBar并绘制大量对象+ nVidia OpenGL驱动程序。

这是程序的源代码(它非常小):

#include "cinder/app/AppBasic.h"
#include "cinder/gl/gl.h"
#include "cinder/params/Params.h"
#include "cinder/Rand.h"
#include "cinder/Camera.h"

using namespace ci;
using namespace ci::app;
using namespace std;

class params_slowApp : public AppBasic
{
    public:
        void setup();
        void update();
        void draw();
        void prepareSettings( Settings *settings );

        CameraPersp mCam;
        params::InterfaceGl mParams;
};

void params_slowApp::prepareSettings( Settings *settings )
{
    settings->setWindowSize( 1280, 720 );
    settings->setFrameRate( 300 );
}

void params_slowApp::setup()
{
    gl::enableVerticalSync( false );
    gl::enableAlphaBlending();

    mCam.setPerspective( 45.0f, getWindowAspectRatio(), 5.0f, 300000.0f );
    mCam.lookAt( Vec3f::zero(), -Vec3f::zAxis(), Vec3f::yAxis() );

    mParams = params::InterfaceGl( "controls", Vec2i( 200, 300 ) );
    mParams.addText( "text" );
}

void params_slowApp::update()
{
}

void params_slowApp::draw()
{
    gl::clear( Color( 0, 0, 0 ), true );

    gl::pushMatrices();
    gl::setMatrices( mCam );

    gl::enableDepthRead();
    gl::enableDepthWrite();

    for( int i = 0; i < 10000; i++ )
    {
        glColor4f( randFloat(), 0.2, 0.3, 0.4 );

        {
            gl::pushModelView();
            gl::translate( randFloat(-100,100), randFloat(-100,100), randFloat(-10,-100) );
            gl::drawCube( Vec3f::zero(), Vec3f::one() );
            gl::popModelView();
        }
    }

    gl::disableDepthWrite();
    gl::disableDepthRead();

    gl::popMatrices();

    params::InterfaceGl::draw();
}

CINDER_APP_BASIC( params_slowApp, RendererGl )

我正在使用Cinder框架,如果我执行以下任何操作,程序将以全速(100 FPS)运行,而不是0 FPS:

  • 从AntTweakBar mParams.addText( "text" );
  • 中删除.addText
  • 删除AntTweakBar绘制例程params::InterfaceGl::draw();
  • 删除更改颜色glColor4f( randFloat(), 0.2, 0.3, 0.4 );
  • 删除内部推拉矩阵和翻译
  • 在英特尔GPU而不是nVidia GPU上运行

我正在尝试解决这个问题,但这个错误对我来说似乎很奇怪。你能给我推荐一种诊断方法吗?我无法控制AntTweakBar,而且它非常复杂,所以我不知道里面是什么让它触发了这个bug。只有在我将某些东西绘制到AntTweakBar面板上时才会发生这种情况。 I've already reported it在Cinder的论坛上,但我认为它与Cinder无关。有没有任何工具可以诊断为什么OpenGL驱动程序决定转为0 FPS?

1 个答案:

答案 0 :(得分:0)

确保在任何OpenGL操作之前调用ShowWindow