Skip to content

Commit

Permalink
Use delay_ms instead of spinwait (#262)
Browse files Browse the repository at this point in the history
  • Loading branch information
roginvs committed Jan 16, 2024
1 parent 601f0c7 commit e23c4ed
Show file tree
Hide file tree
Showing 14 changed files with 81 additions and 80 deletions.
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,8 @@ target_sources(${EXECUTABLE_NAME} PUBLIC
target_sources(${EXECUTABLE_NAME} PUBLIC
"src/audio_engine.cc"
"src/audio_engine.h"
"src/delay.cc"
"src/delay.h"
"src/fps_limiter.cc"
"src/fps_limiter.h"
"src/platform_compat.cc"
Expand Down
52 changes: 18 additions & 34 deletions src/character_editor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include "db.h"
#include "dbox.h"
#include "debug.h"
#include "delay.h"
#include "draw.h"
#include "game.h"
#include "game_mouse.h"
Expand Down Expand Up @@ -1991,7 +1992,7 @@ static int _get_input_str(int win, int cancelKeyCode, char* text, int maxLength,

windowRefresh(win);

while (getTicksSince(_frame_time) < 1000 / 24) { }
delay_ms(1000 / 24 - (getTicks() - _frame_time));

renderPresent();
sharedFpsLimiter.throttle();
Expand Down Expand Up @@ -2281,8 +2282,7 @@ static void characterEditorDrawBigNumber(int x, int y, int flags, int value, int
windowWidth);
windowRefreshRect(windowHandle, &rect);
renderPresent();
while (getTicksSince(_frame_time) < BIG_NUM_ANIMATION_DELAY)
;
delay_ms(BIG_NUM_ANIMATION_DELAY - (getTicks() - _frame_time));
}

blitBufferToBuffer(numbersGraphicBufferPtr + BIG_NUM_WIDTH * ones,
Expand All @@ -2304,8 +2304,7 @@ static void characterEditorDrawBigNumber(int x, int y, int flags, int value, int
windowWidth);
windowRefreshRect(windowHandle, &rect);
renderPresent();
while (getTicksSince(_frame_time) < BIG_NUM_ANIMATION_DELAY)
;
delay_ms(BIG_NUM_ANIMATION_DELAY - (getTicks() - _frame_time));
}

blitBufferToBuffer(numbersGraphicBufferPtr + BIG_NUM_WIDTH * tens,
Expand Down Expand Up @@ -3530,11 +3529,9 @@ static int characterEditorEditAge()
}

if (v33 > dbl_50170B) {
while (getTicksSince(_frame_time) < 1000 / _repFtime)
;
delay_ms(1000 / _repFtime - (getTicks() - _frame_time));
} else {
while (getTicksSince(_frame_time) < 1000 / 24)
;
delay_ms(1000 / 24 - (getTicks() - _frame_time));
}

keyCode = inputGetInput();
Expand All @@ -3548,8 +3545,7 @@ static int characterEditorEditAge()
} else {
windowRefresh(win);

while (getTicksSince(_frame_time) < 1000 / 24)
;
delay_ms(1000 / 24 - (getTicks() - _frame_time));
}

renderPresent();
Expand Down Expand Up @@ -3699,8 +3695,7 @@ static void characterEditorEditGender()

windowRefresh(win);

while (getTicksSince(_frame_time) < 41)
;
delay_ms(41 - (getTicks() - _frame_time));

renderPresent();
sharedFpsLimiter.throttle();
Expand Down Expand Up @@ -3778,12 +3773,9 @@ static void characterEditorAdjustPrimaryStat(int eventCode)
}

if (v11 >= 19.2) {
unsigned int delay = 1000 / _repFtime;
while (getTicksSince(_frame_time) < delay) {
}
delay_ms(1000 / _repFtime - (getTicks() - _frame_time));
} else {
while (getTicksSince(_frame_time) < 1000 / 24) {
}
delay_ms(1000 / 24 - (getTicks() - _frame_time));
}

renderPresent();
Expand Down Expand Up @@ -5279,11 +5271,9 @@ static void characterEditorHandleAdjustSkillButtonPressed(int keyCode)
if (!isUsingKeyboard) {
unspentSp = pcGetStat(PC_STAT_UNSPENT_SKILL_POINTS);
if (repeatDelay >= dbl_5018F0) {
while (getTicksSince(_frame_time) < 1000 / _repFtime) {
}
delay_ms(1000 / _repFtime - (getTicks() - _frame_time));
} else {
while (getTicksSince(_frame_time) < 1000 / 24) {
}
delay_ms(1000 / 24 - (getTicks() - _frame_time));
}

int keyCode = inputGetInput();
Expand Down Expand Up @@ -6141,11 +6131,9 @@ static int perkDialogHandleInput(int count, void (*refreshProc)())
}

if (v19 < dbl_5019BE) {
while (getTicksSince(_frame_time) < 1000 / 24) {
}
delay_ms(1000 / 24 - (getTicks() - _frame_time));
} else {
while (getTicksSince(_frame_time) < 1000 / _repFtime) {
}
delay_ms(1000 / _repFtime - (getTicks() - _frame_time));
}

renderPresent();
Expand Down Expand Up @@ -6188,11 +6176,9 @@ static int perkDialogHandleInput(int count, void (*refreshProc)())
}

if (v19 < dbl_5019BE) {
while (getTicksSince(_frame_time) < 1000 / 24) {
}
delay_ms(1000 / 24 - (getTicks() - _frame_time));
} else {
while (getTicksSince(_frame_time) < 1000 / _repFtime) {
}
delay_ms(1000 / _repFtime - (getTicks() - _frame_time));
}

renderPresent();
Expand Down Expand Up @@ -6224,11 +6210,9 @@ static int perkDialogHandleInput(int count, void (*refreshProc)())
}

if (v19 < dbl_5019BE) {
while (getTicksSince(_frame_time) < 1000 / 24) {
}
delay_ms(1000 / 24 - (getTicks() - _frame_time));
} else {
while (getTicksSince(_frame_time) < 1000 / _repFtime) {
}
delay_ms(1000 / _repFtime - (getTicks() - _frame_time));
}

renderPresent();
Expand Down
7 changes: 3 additions & 4 deletions src/credits.cc
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "cycle.h"
#include "db.h"
#include "debug.h"
#include "delay.h"
#include "draw.h"
#include "game_mouse.h"
#include "input.h"
Expand Down Expand Up @@ -172,8 +173,7 @@ void creditsOpen(const char* filePath, int backgroundFid, bool useReversedStyle)
windowBuffer,
windowWidth);

while (getTicksSince(tick) < CREDITS_WINDOW_SCROLLING_DELAY) {
}
delay_ms(CREDITS_WINDOW_SCROLLING_DELAY - (getTicks() - tick));

tick = getTicks();

Expand Down Expand Up @@ -215,8 +215,7 @@ void creditsOpen(const char* filePath, int backgroundFid, bool useReversedStyle)
windowBuffer,
windowWidth);

while (getTicksSince(tick) < CREDITS_WINDOW_SCROLLING_DELAY) {
}
delay_ms(CREDITS_WINDOW_SCROLLING_DELAY - (getTicks() - tick));

tick = getTicks();

Expand Down
14 changes: 6 additions & 8 deletions src/dbox.cc
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "character_editor.h"
#include "color.h"
#include "debug.h"
#include "delay.h"
#include "draw.h"
#include "game.h"
#include "game_sound.h"
Expand Down Expand Up @@ -885,8 +886,8 @@ int showLoadFileDialog(char* title, char** fileList, char* dest, int fileListLen
}

unsigned int delay = (scrollCounter > 14.4) ? 1000 / scrollDelay : 1000 / 24;
while (getTicksSince(scrollTick) < delay) {
}

delay_ms(delay - (getTicks() - scrollTick));

if (_game_user_wants_to_quit != 0) {
rc = 1;
Expand All @@ -909,8 +910,7 @@ int showLoadFileDialog(char* title, char** fileList, char* dest, int fileListLen
doubleClickSelectedFileIndex = -2;
}

while (getTicksSince(tick) < (1000 / 24)) {
}
delay_ms(1000 / 24 - (getTicks() - tick));
}

if (_game_user_wants_to_quit) {
Expand Down Expand Up @@ -1335,8 +1335,7 @@ int showSaveFileDialog(char* title, char** fileList, char* dest, int fileListLen
// FIXME: Missing windowRefresh makes blinking useless.

unsigned int delay = (scrollCounter > 14.4) ? 1000 / scrollDelay : 1000 / 24;
while (getTicksSince(scrollTick) < delay) {
}
delay_ms(delay - (getTicks() - scrollTick));

if (_game_user_wants_to_quit != 0) {
rc = 1;
Expand Down Expand Up @@ -1369,8 +1368,7 @@ int showSaveFileDialog(char* title, char** fileList, char* dest, int fileListLen
doubleClickSelectedFileIndex = -2;
}

while (getTicksSince(tick) < (1000 / 24)) {
}
delay_ms(1000 / 24 - (getTicks() - tick));
}

if (_game_user_wants_to_quit != 0) {
Expand Down
11 changes: 11 additions & 0 deletions src/delay.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#include "delay.h"

#include <SDL.h>

void delay_ms(int ms)
{
if (ms <= 0) {
return;
}
SDL_Delay(ms);
}
6 changes: 6 additions & 0 deletions src/delay.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#ifndef DELAY_H
#define DELAY_H

void delay_ms(int ms);

#endif
4 changes: 2 additions & 2 deletions src/elevator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "art.h"
#include "cycle.h"
#include "debug.h"
#include "delay.h"
#include "draw.h"
#include "game_mouse.h"
#include "game_sound.h"
Expand Down Expand Up @@ -453,8 +454,7 @@ int elevatorSelectLevel(int elevator, int* mapPtr, int* elevationPtr, int* tileP

windowRefresh(gElevatorWindow);

while (getTicksSince(tick) < delay) {
}
delay_ms(delay - (getTicks() - tick));

renderPresent();
sharedFpsLimiter.throttle();
Expand Down
10 changes: 3 additions & 7 deletions src/game_dialog.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "critter.h"
#include "cycle.h"
#include "debug.h"
#include "delay.h"
#include "dialog.h"
#include "display_monitor.h"
#include "draw.h"
Expand Down Expand Up @@ -2936,7 +2937,6 @@ void _gdialog_scroll_subwin(int win, int a2, unsigned char* a3, unsigned char* a
int v7;
unsigned char* v9;
Rect rect;
unsigned int tick;

v7 = a6;
v9 = a4;
Expand Down Expand Up @@ -2971,9 +2971,7 @@ void _gdialog_scroll_subwin(int win, int a2, unsigned char* a3, unsigned char* a
v7 += 10;
v9 -= 10 * (GAME_DIALOG_WINDOW_WIDTH);

tick = getTicks();
while (getTicksSince(tick) < 33) {
}
delay_ms(33);

renderPresent();
sharedFpsLimiter.throttle();
Expand Down Expand Up @@ -3011,9 +3009,7 @@ void _gdialog_scroll_subwin(int win, int a2, unsigned char* a3, unsigned char* a

rect.top += 10;

tick = getTicks();
while (getTicksSince(tick) < 33) {
}
delay_ms(33);

renderPresent();
sharedFpsLimiter.throttle();
Expand Down
8 changes: 2 additions & 6 deletions src/input.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include "audio_engine.h"
#include "color.h"
#include "delay.h"
#include "dinput.h"
#include "draw.h"
#include "kb.h"
Expand Down Expand Up @@ -641,12 +642,7 @@ void inputPauseForTocks(unsigned int delay)
// 0x4C93B8
void inputBlockForTocks(unsigned int ms)
{
unsigned int start = SDL_GetTicks();
unsigned int diff;
do {
// NOTE: Uninline
diff = getTicksSince(start);
} while (diff < ms);
delay_ms(ms);
}

// 0x4C93E0
Expand Down
17 changes: 8 additions & 9 deletions src/loadsave.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "db.h"
#include "dbox.h"
#include "debug.h"
#include "delay.h"
#include "display_monitor.h"
#include "draw.h"
#include "file_utils.h"
Expand Down Expand Up @@ -672,9 +673,9 @@ int lsgSaveGame(int mode)
}

if (scrollCounter > 14.4) {
while (getTicksSince(start) < 1000 / scrollVelocity) { }
delay_ms(1000 / scrollVelocity - (getTicks() - start));
} else {
while (getTicksSince(start) < 1000 / 24) { }
delay_ms(1000 / 24 - (getTicks() - start));
}

keyCode = inputGetInput();
Expand Down Expand Up @@ -718,8 +719,7 @@ int lsgSaveGame(int mode)
doubleClickSlot = -1;
}

while (getTicksSince(tick) < 1000 / 24) {
}
delay_ms(1000 / 24 - (getTicks() - tick));
}

if (rc == 1) {
Expand Down Expand Up @@ -1175,9 +1175,9 @@ int lsgLoadGame(int mode)
}

if (scrollCounter > 14.4) {
while (getTicksSince(start) < 1000 / scrollVelocity) { }
delay_ms(1000 / scrollVelocity - (getTicks() - start));
} else {
while (getTicksSince(start) < 1000 / 24) { }
delay_ms(1000 / 24 - (getTicks() - start));
}

keyCode = inputGetInput();
Expand Down Expand Up @@ -1227,7 +1227,7 @@ int lsgLoadGame(int mode)
doubleClickSlot = -1;
}

while (getTicksSince(time) < 1000 / 24) { }
delay_ms(1000 / 24 - (getTicks() - time));
}

if (rc == 1) {
Expand Down Expand Up @@ -2387,8 +2387,7 @@ static int _get_input_str2(int win, int doneKeyCode, int cancelKeyCode, char* de
windowRefresh(win);
}

while (getTicksSince(tick) < 1000 / 24) {
}
delay_ms(1000 / 24 - (getTicks() - tick));

renderPresent();
sharedFpsLimiter.throttle();
Expand Down
Loading

0 comments on commit e23c4ed

Please sign in to comment.