Hi!

> First, is the modifications in the configure script works well  for you ?
Everything is alright there! :)

> About the framerate,
> By now, everything is rendered in software in the SDL port.
> It gives me (Athlon 2600)
> - between 32 and 44 fps in 800x600
> - between 21- 31 fps in 1024x768
> 
> Let me know what you obtain.
Using the map 'Cowland', on a pentium 4 M, at 2.0GHz, with a GeForce 4:
- 20~30 fps in 640x480
- 10~15 fps in 800x600
Which is quite slow compared to your performance :(

I don't know many things about SDL flags..
If it helps, there is a function in one of paragui examples, which
initializes sdl with the best gfx flags. It's in the test/dblbuffer.cpp,
or the main part of this code in attachement to this mail.

Lodesi

/* This is a way of telling whether or not to use hardware surfaces */
Uint32 FastestFlags(Uint32 flags, int width, int height, int bpp)
{
	const SDL_VideoInfo *info;

	/* Hardware acceleration is only used in fullscreen mode */
	flags |= SDL_FULLSCREEN;

	/* Check for various video capabilities */
	info = SDL_GetVideoInfo();
	if ( info->blit_hw_CC && info->blit_fill ) {
		/* We use accelerated colorkeying and color filling */
		flags |= SDL_HWSURFACE;
	}
	/* If we have enough video memory, and will use accelerated
	   blits directly to it, then use page flipping.
	 */
	if ( (flags & SDL_HWSURFACE) == SDL_HWSURFACE ) {
		/* Direct hardware blitting without double-buffering
		   causes really bad flickering.
		 */
		if ( info->video_mem*1024 > (Uint32)(height*width*bpp/8) ) {
			flags |= SDL_DOUBLEBUF;
		} else {
			flags &= ~SDL_HWSURFACE;
		}
	}

	/* Return the flags */
	return(flags);
}

int main(int argc, char *argv[])
{
	SDL_Surface *screen;
	Uint8 *mem;
	int width, height;
	Uint8  video_bpp;
	Uint32 videoflags;
	Uint32 background;
	int    i;
	SDL_Event event;
	Uint32 then, now, frames;

	PG_Application app;

	numsprites = NUM_SPRITES;
	videoflags = SDL_SWSURFACE|SDL_DOUBLEBUF | SDL_ANYFORMAT;
	width = 640;
	height = 480;
	video_bpp = 16;
	while ( argc > 1 ) {
		--argc;
		if ( strcmp(argv[argc-1], "-width") == 0 ) {
			width = atoi(argv[argc]);
			--argc;
		} else
		if ( strcmp(argv[argc-1], "-height") == 0 ) {
			height = atoi(argv[argc]);
			--argc;
		} else
		if ( strcmp(argv[argc-1], "-bpp") == 0 ) {
			video_bpp = atoi(argv[argc]);
			videoflags &= ~SDL_ANYFORMAT;
			--argc;
		} else
		if ( strcmp(argv[argc], "-fast") == 0 ) {
			videoflags = FastestFlags(videoflags, width, height, video_bpp);
		} else
		if ( strcmp(argv[argc], "-hw") == 0 ) {
			videoflags ^= SDL_HWSURFACE;
		} else
		if ( strcmp(argv[argc], "-flip") == 0 ) {
			videoflags ^= SDL_DOUBLEBUF;
		} else
		if ( strcmp(argv[argc], "-fullscreen") == 0 ) {
			videoflags ^= SDL_FULLSCREEN;
		} else
		if ( isdigit(argv[argc][0]) ) {
			numsprites = atoi(argv[argc]);
		} else {
			PG_LogMSG(
	"Usage: %s [-bpp N] [-hw] [-flip] [-fast] [-fullscreen] [numsprites]",
								argv[0]);
			exit(1);
		}
	}

	/* Set video mode */
	if(!app.InitScreen(width, height, video_bpp, videoflags)) {
		PG_LogERR("Couldn't set %dx%d video mode: %s",
					width, height, SDL_GetError());
		exit(2);
	}

	/* Print out information about our surfaces */
	PG_LogMSG("Screen is at %d bits per pixel",screen->format->BitsPerPixel);
	if ( (screen->flags & SDL_HWSURFACE) == SDL_HWSURFACE ) {
		PG_LogMSG("Screen is in video memory");
	} else {
		PG_LogMSG("Screen is in system memory");
	}
	if ( (screen->flags & SDL_DOUBLEBUF) == SDL_DOUBLEBUF ) {
		PG_LogMSG("Screen has double-buffering enabled");
	}
	if ( (sprite->flags & SDL_HWSURFACE) == SDL_HWSURFACE ) {
		PG_LogMSG("Sprite is in video memory");
	} else {
		PG_LogMSG("Sprite is in system memory");
	}

	/* Run a sample blit to trigger blit acceleration */
	{ SDL_Rect dst;
		dst.x = 0;
		dst.y = 0;
		dst.w = sprite->w;
		dst.h = sprite->h;
		SDL_BlitSurface(sprite, NULL, screen, &dst);
		SDL_FillRect(screen, &dst, background);
	}
	if ( (sprite->flags & SDL_HWACCEL) == SDL_HWACCEL ) {
		PG_LogMSG("Sprite blit uses hardware acceleration");
	}
	if ( (sprite->flags & SDL_RLEACCEL) == SDL_RLEACCEL ) {
		PG_LogMSG("Sprite blit uses RLE acceleration");
	}

	return(0);
}

Répondre à