Original Post
Hello!
I've been working on a project off and on in SDL for a number of months now, and I've had an issue from the start that I recently had some time to try and debug. I've been developing on Windows XP until this past week, so it was not really an issue until now.
Basically, my SDL bases game works perfectly fine on any Windows XP machine (ie. normal frame rate, shaders work no problem), but I initially noticed that if I ran the executable on Windows 7, the frame rate would only be 10-15 for no reason (on super high-end machines, ie. Phenom II X6 / 5970) but this was strictly a Windows 7 issue as indicated by testing on several different machines. Upon further investigation I realized that if I run the game from within Visual Studio 2008 on a Windows 7 machine it works perfectly (ie. 7000+ FPS w/o vsync), but as soon as I ran it from the executable instead, the frame rate would once again be between 10 and 15, and if shaders were being used via GLEW, the program would simply exit because GLEW 2.0 was unavailable.
tldr; SDL OpenGL game, works fine on XP, on Win7 works fine in VS2008 but EXE limited to 10 fps and shaders wont work
Honestly not sure what the issue could possibly be and has been baffling me for some time. If anyone has any suggestions or input, it would be greatly appreciated. It almost seems like SDL is somehow switching to software mode or some limited version of OpenGL. Also worth mentioning that the only things being rendered is some text (generated and rendered via lists) and a very simple skybox with 1024x1024 textures for each side.
My game is using SDLmain and a number of libraries, including:
SDL
SDL_ttf
GLEW
FreeImage
Qt
FMOD Ex
FBX SDK
Bullet Physics
Thanks for reading. Some code, if it helps any:
Main.cpp:
OpenGL Setup:
Game Loop:
I've been working on a project off and on in SDL for a number of months now, and I've had an issue from the start that I recently had some time to try and debug. I've been developing on Windows XP until this past week, so it was not really an issue until now.
Basically, my SDL bases game works perfectly fine on any Windows XP machine (ie. normal frame rate, shaders work no problem), but I initially noticed that if I ran the executable on Windows 7, the frame rate would only be 10-15 for no reason (on super high-end machines, ie. Phenom II X6 / 5970) but this was strictly a Windows 7 issue as indicated by testing on several different machines. Upon further investigation I realized that if I run the game from within Visual Studio 2008 on a Windows 7 machine it works perfectly (ie. 7000+ FPS w/o vsync), but as soon as I ran it from the executable instead, the frame rate would once again be between 10 and 15, and if shaders were being used via GLEW, the program would simply exit because GLEW 2.0 was unavailable.
tldr; SDL OpenGL game, works fine on XP, on Win7 works fine in VS2008 but EXE limited to 10 fps and shaders wont work
Honestly not sure what the issue could possibly be and has been baffling me for some time. If anyone has any suggestions or input, it would be greatly appreciated. It almost seems like SDL is somehow switching to software mode or some limited version of OpenGL. Also worth mentioning that the only things being rendered is some text (generated and rendered via lists) and a very simple skybox with 1024x1024 textures for each side.
My game is using SDLmain and a number of libraries, including:
SDL
SDL_ttf
GLEW
FreeImage
Qt
FMOD Ex
FBX SDK
Bullet Physics
Thanks for reading. Some code, if it helps any:
Main.cpp:
#include "Game.h"
int main(int argc, char * argv[]) {
Game * game = new Game();
if(!game->init()) { return -1; }
game->run();
delete game;
return 0;
}
OpenGL Setup:
bool Game::init() {
if(m_initialized) { return false; }
settings->load();
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_JOYSTICK) == -1) { return false; }
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, settings->verticalSync ? 1 : 0);
m_graphics = SDL_SetVideoMode(settings->windowWidth, settings->windowHeight, 0, SDL_OPENGL | (settings->fullScreen ? SDL_FULLSCREEN : 0));
SDL_WM_SetCaption("Game", NULL);
QString iconPath;
iconPath.append(QString("%1/Icons/Block.bmp").arg(settings->dataDirectoryName));
QByteArray iconPathBytes = iconPath.toLocal8Bit();
m_icon = SDL_LoadBMP(iconPathBytes.data());
SDL_WM_SetIcon(m_icon, NULL);
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glDepthFunc(GL_LEQUAL);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glMatrixMode(GL_MODELVIEW);
glViewport(0, 0, settings->windowWidth, settings->windowHeight);
if(glewInit() != GLEW_OK) { return false; }
if(!GLEW_VERSION_2_0) { return false; }
etc.
Game Loop:
void Game::run() {
if(!m_initialized) { return; }
m_running = true;
SDL_Event event;
static unsigned int lastTime = SDL_GetTicks();
unsigned int currentTime = SDL_GetTicks();
do {
if(SDL_PollEvent(&event)) {
switch(event.type) {
case SDL_KEYDOWN:
if(!console->isActive()) {
menu->handleInput(event);
}
if(!menu->isActive()) {
console->handleInput(event);
}
break;
case SDL_MOUSEMOTION:
if(!console->isActive() &&
!menu->isActive() &&
SDL_GetAppState() & SDL_APPMOUSEFOCUS &&
SDL_GetAppState() & SDL_APPINPUTFOCUS &&
SDL_GetAppState() & SDL_APPACTIVE) {
camera->handleInput(event);
}
break;
case SDL_QUIT:
m_running = false;
break;
default:
break;
}
}
if(m_running) {
currentTime = SDL_GetTicks();
update(currentTime - lastTime);
draw();
lastTime = currentTime;
}
} while(m_running);
}