-
SDL sending laptop loopy
Hello all
I'm just running through a few tutorials at the moment on SDL. I keep noticing that some of them make my laptop go into over-drive - lots of activity on the memory, even for simple things like displaying a picture, fan coming on after a short time etc etc. For example the prog below which simply displays a picture and polls for events.
I'm using a macbook and running it under XCode. The picture I'm using is 696kb. I do get a warning which doesn't stop the program from running, but says:
"Warning once: This application, or a library it uses, is using NSQuickDrawView, which has been deprecated. Apps should cease use of QuickDraw and move to Quartz."
Can anyone shed any light on this? I guess this shouldn't be happening.
Here's the last bit of code I was running:
Code:
#include <iostream>
#include <string>
#include "SDL_image/SDL_image.h"
#include "SDL.h"
const int cSCREEN_WIDTH = 640;
const int cSCREEN_HEIGHT = 480;
const int cSCREEN_BPP = 32;
SDL_Surface * image = NULL;
SDL_Surface * screen = NULL;
SDL_Event event; //SDL data type which stores event data
SDL_Surface * loadImage(std::string filename) {
SDL_Surface * loadedImage = NULL;
SDL_Surface * optimisedImage = NULL;
loadedImage = IMG_Load(filename.c_str());
if (loadedImage != NULL) {
optimisedImage = SDL_DisplayFormat(loadedImage);
SDL_FreeSurface(loadedImage);
}
return optimisedImage;
}
void applySurface (int x, int y, SDL_Surface * src, SDL_Surface *dest) {
SDL_Rect offset;
offset.x = x;
offset.y = y;
SDL_BlitSurface(src, NULL, dest, &offset);
}
//wrapper around init functions
bool init() {
if (SDL_Init(SDL_INIT_EVERYTHING) == -1) {
return false;
}
screen = SDL_SetVideoMode(cSCREEN_WIDTH, cSCREEN_HEIGHT, cSCREEN_BPP, SDL_SWSURFACE);
if (screen == NULL) {
return false;
}
return true;
}
//Wrapper around file loading
bool loadFiles() {
image = loadImage ("trees.jpg");
if (image == NULL) {
return false;
}
return true;
}
void cleanUp() {
SDL_FreeSurface(image);
SDL_Quit();
}
int main(int argc, char *argv[])
{
bool quit = false;
if (init() == false) {
return 1;
}
if (loadFiles() == false) {
return 1;
}
applySurface (0,0,image, screen);
if (SDL_Flip(screen) == -1) {
return 1;
}
while (quit == false) {
while (SDL_PollEvent(&event) ) {
if( event.type == SDL_QUIT || event.type == SDLK_a) {
std::cout << "\nQuitting";
quit = true;
}
}
}
std::cout << "\nCleaning up";
cleanUp();
return(0);
}
-
I dont see why it should be using loads of memory, but you can stop the cpu from going berzerk by adding a short delay to your while loop:
Code:
while (quit == false) {
while (SDL_PollEvent(&event) ) {
if( event.type == SDL_QUIT || event.type == SDLK_a) {
std::cout << "\nQuitting";
quit = true;
}
}
SDL_Delay(10);
}
Also, if you want to add animation, etc, you might want to look at moving SDL_Flip(screen) to the end of your main loop and perhaps clearing the screen at the start of it.
-
Brilliant. Thanks mike_g, the delay you suggested worked perfectly - quietened everything down a treat. After your post I put a cout << counter into the while loop and sure enough... laptop was counting furiously in that loop.
It's only my second day with SDL, so I'm just getting to grips with the overall structure - thanks for the other suggestions.