在编写一个小型 OpenGL 应用程序时,我遇到了一个奇怪的错误。当我在 Visual Studio 中使用 F5(带调试)运行应用程序时,它运行良好。如果我使用 Ctrl + F5(不带调试)运行它,它会以 0 FPS 运行。在这两种情况下,我都使用 Visual Studio 中的“发布”版本。
这怎么可能?两种运行程序的方式有什么不同,应该怎样修改程序的运行方式? 这是一个疯狂的错误,以某种方式连接到 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 中删除 .addText
mParams.addText( "text" );
- 删除 AntTweakBar 绘制例程
params::InterfaceGl::draw();
- 去除颜色的变化
glColor4f( randFloat(), 0.2, 0.3, 0.4 );
- 去除内部推挽矩阵和平移
- 在 Intel GPU 而不是 nVidia GPU 上运行
我正在尝试解决这个问题,但这个错误对我来说似乎很奇怪。你能推荐我一种诊断它的方法吗?我无法控制 AntTweakBar,而且它非常复杂,所以我不知道里面是什么让它触发了这个 bug。只有当我在 AntTweakBar 面板上绘制了一些东西时才会发生这种情况。我已经在 Cinder 的论坛上报告了它,但我相信它与 Cinder 无关。是否有任何工具可以诊断为什么 OpenGL 驱动程序决定变为 0 FPS?