Package: starfighter
Version: 1.1-3
Severity: normal
Tags: patch

Starfighter uses a busy-loop for timing purposes. This makes it use 100%
CPU all the time, even when it is not doing anything useful. The
attached patch removes the busy-loops and replaces them with
calls to SDL_Delay().

-- System Information:
Debian Release: testing/unstable
  APT prefers unstable
  APT policy: (500, 'unstable'), (1, 'experimental')
Architecture: amd64 (x86_64)
Shell:  /bin/sh linked to /bin/bash
Kernel: Linux 2.6.16.11
Locale: LANG=nl_NL.UTF-8, LC_CTYPE=nl_NL.UTF-8 (charmap=UTF-8)

Versions of packages starfighter depends on:
ii  libc6                         2.3.6-7    GNU C Library: Shared libraries
ii  libgcc1                       1:4.1.0-1  GCC support library
ii  libsdl-image1.2               1.2.4-1    image loading library for Simple D
ii  libsdl-mixer1.2               1.2.6-1.1  mixer library for Simple DirectMed
ii  libsdl1.2debian               1.2.9-5+b1 Simple DirectMedia Layer
ii  libstdc++5                    1:3.3.6-13 The GNU Standard C++ Library v3
ii  starfighter-data              1.1-4      data files for Starfighter game

starfighter recommends no packages.

-- no debconf information
--- starfighter-1.1.orig/code/classes.h
+++ starfighter-1.1/code/classes.h
@@ -427,7 +427,7 @@
 	{
 		SDL_Flip(screen);
 		// Give the audio (and possibly the X server) time to work...
-		SDL_Delay(1);
+	//	SDL_Delay(1);
 	}
 
 	/*
--- starfighter-1.1.orig/code/game.cpp
+++ starfighter-1.1/code/game.cpp
@@ -240,6 +240,7 @@
 			then = SDL_GetTicks();
 			frames = 0;
 			graphics.updateScreen();
+			SDL_Delay(16);
 		}
 
 		if ((currentGame.area == 24) && (engine.addAliens > -1))
@@ -277,11 +278,7 @@
 		}
 
 		// (Attempt to) Limit us to 60 frame a second
-		while (SDL_GetTicks() < (frameLimit + 16))
-		{
-			// Do nothing. If we were to insert an SDL_Delay(1) in here
-			// then we would actually lose around 10 frames per second!!
-		}
+		SDL_Delay(frameLimit + 16 - SDL_GetTicks() >? 0 <? 16);
 		frameLimit = SDL_GetTicks();
 	}
 
--- starfighter-1.1.orig/code/intermission.cpp
+++ starfighter-1.1/code/intermission.cpp
@@ -848,7 +848,7 @@
 		doCursor();
 
 		// Limit us to 60 frame a second
-		while (SDL_GetTicks() < (frameLimit + 16)){}
+		SDL_Delay(frameLimit + 16 - SDL_GetTicks() >? 0 <? 16);
 		frameLimit = SDL_GetTicks();
 	}
 
--- starfighter-1.1.orig/code/missions.cpp
+++ starfighter-1.1/code/missions.cpp
@@ -795,6 +795,7 @@
 			getPlayerInput();
 			if ((engine.keyState[SDLK_LCTRL]) || (engine.keyState[SDLK_RCTRL]))
 				break;
+			SDL_Delay(16);
 		}
 
 		graphics.clearScreen(graphics.black);
@@ -913,6 +914,7 @@
 			getPlayerInput();
 			if ((engine.keyState[SDLK_LCTRL]) || (engine.keyState[SDLK_RCTRL]))
 				break;
+			SDL_Delay(16);
 		}
 	}
 
--- starfighter-1.1.orig/code/script.cpp
+++ starfighter-1.1/code/script.cpp
@@ -298,7 +298,7 @@
 		if ((showMessage) && (graphics.messageBox != NULL))
 			graphics.blit(graphics.messageBox, (800 - graphics.messageBox->w) / 2, 500);
 
-		while (SDL_GetTicks() < (frameLimit + 16)){}
+		SDL_Delay(frameLimit + 16 - SDL_GetTicks() >? 0 <? 16);
 		frameLimit = SDL_GetTicks();
 		
 		if (engine.keyState[SDLK_ESCAPE])
--- starfighter-1.1.orig/code/title.cpp
+++ starfighter-1.1/code/title.cpp
@@ -453,7 +453,8 @@
 			engine.keyState[SDLK_LCTRL] = engine.keyState[SDLK_RCTRL] = engine.keyState[SDLK_SPACE] = 0;
 		}
 
-		while (SDL_GetTicks() < (frameLimit + 16)){}
+		// (Attempt to) Limit us to 60 frame a second
+		SDL_Delay(frameLimit + 16 - SDL_GetTicks() >? 0 <? 16);
 		frameLimit = SDL_GetTicks();
 	}
 
@@ -558,7 +559,7 @@
 			break;
 		}
 
-		while (SDL_GetTicks() < (frameLimit + 16)){}
+		SDL_Delay(frameLimit + 16 - SDL_GetTicks() >? 0 <? 16);
 		frameLimit = SDL_GetTicks();
 	}
 }
@@ -614,7 +615,7 @@
 		graphics.blit(gameover, x,  y);
 
 		// Limit us to 60 frame a second
-		while (SDL_GetTicks() < (frameLimit + 16)){}
+		SDL_Delay(frameLimit + 16 - SDL_GetTicks() >? 0 <? 16);
 		frameLimit = SDL_GetTicks();
 	}
 
@@ -724,7 +725,7 @@
 		SDL_FillRect(graphics.screen, &r1, graphics.black);
 		SDL_FillRect(graphics.screen, &r2, graphics.black);
 
-		while (SDL_GetTicks() < (frameLimit + 16)){}
+		SDL_Delay(frameLimit + 16 - SDL_GetTicks() >? 0 <? 16);
 		frameLimit = SDL_GetTicks();
 	}
 

Reply via email to