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();
}