小さな OpenGL アプリケーションを作成しているときに奇妙なバグが発生します。Visual Studio で F5 キー (デバッグあり) を使用してアプリケーションを実行すると、正常に動作します。Ctrl + F5 (デバッグなし) で実行すると、0 FPS で実行されます。どちらの場合も、Visual Studio で "Release" ビルドを使用しています。
それはどのように可能ですか?プログラムを実行する 2 つの方法に違いはありますか? プログラムの実行を変更する必要があるのは何ですか? これはクレイジーなバグで、何らかの形で 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フレームワークを使用しています。次のいずれかを実行すると、プログラムは 0 FPS ではなくフル スピード (100 FPS) で実行されます。
- AntTweakBar から .addText を削除します
mParams.addText( "text" );
- AntTweakBar 描画ルーチンを削除
params::InterfaceGl::draw();
- 色の変化を取り除く
glColor4f( randFloat(), 0.2, 0.3, 0.4 );
- 内側のプッシュプル行列と翻訳を削除します
- nVidia GPU の代わりに Intel GPU で実行
この問題を解決しようとしていますが、このバグは奇妙に思えます。おすすめの診断方法を教えてください。私は AntTweakBar を制御することはできず、非常に複雑であるため、内部の何が原因でこのバグが引き起こされるのかわかりません。AntTweakBar パネルに何かを描画した場合にのみ発生します。すでに Cinder のフォーラムで報告済みですが、Cinder とは関係ないと思います。OpenGL ドライバーが 0 FPS になる理由を診断するツールはありますか?