OpenGL错误只在未经调试的情况下运行时出现,怎么可能呢
OpenGL bug only present when run without debugging, how is it possible?
我在编写一个小型OpenGL应用程序时遇到了一个奇怪的错误。当我在Visual Studio中使用F5(带调试)运行应用程序时,它运行得很好。如果我用Ctrl+F5(不带调试)运行它,它将以0 FPS的速度运行。在这两种情况下,我都使用VisualStudio中的"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 );
- 去除内部推挽矩阵和平移
- 在Intel GPU而不是nVidia GPU上运行
我正试图解决这个问题,但这个错误对我来说很奇怪。你能给我推荐一种诊断方法吗?我无法控制AntTweakBar,它非常复杂,所以我不知道是什么原因导致它触发了这个bug。只有当我在AntTweakBar面板上绘制了一些东西时,才会发生这种情况。我已经在Cinder的论坛上报道过了,但我相信它与Cinder无关。有没有任何工具可以诊断OpenGL驱动程序为什么决定采用0 FPS?
确保在执行任何OpenGL操作之前调用ShowWindow
。
相关文章:
- 头文件可以在主类中运行.这怎么可能?
- 在QT C++编辑Qtable模型数据时,我需要得到一个小盒子,我需要显示编辑文本,这怎么可能?
- 在给定相同的输入的情况下,某些代码怎么可能花费更多时间来运行,这似乎只是因为它处于循环中?
- 我的代码中出现运行时错误的可能原因是什么?
- BOOST ::日志是每次运行应用程序时都可能旋转文件
- 是否有任何可能的方法将事件(自定义)附加到在运行时创建的对象?[C 构建器]
- 静态内存中的数组的大小可以在运行时更改C++?怎么来了
- 如何在运行时检查 c++11 元组是否有可能的函数应用程序
- OpenGL错误只在未经调试的情况下运行时出现,怎么可能呢
- 使用地图找不到可能的运行时错误
- 当我从 Windows 请求"Miriam"字体时,我得到的是"Arial"字体。这怎么可能,因为字体文件"mriam.ttf"存在于我的系统中?
- 在运行时修改模板化函数的名称 - 可能
- 对象类型在编译时怎么可能是未知的
- 如果可能,尝试对字符串执行静态断言,或者在不是时回退到运行时检查
- 有可能在线程运行时从它获取数据吗?C++
- 数组是静态的,但数组大小直到运行时才知道。这怎么可能?
- c++:是否可能/建议基于运行时条件声明变量?
- 在c++中,当元组的元素索引在运行时已知时,是否有可能获得该元素的类型?
- 是否有可能在运行时检查迭代器是否没有越过end()迭代器
- 如何与运行时可能不存在的目录进行链接