# HG changeset patch # User Matti Hamalainen # Date 1349962893 -10800 # Node ID 6d62918739c69adafe674f4f4f07feb8d89141cd # Parent 04c7e7cefddc4ec6c551ab3682bd935c35783c98 Improve screen update logic. diff -r 04c7e7cefddc -r 6d62918739c6 ppl.c --- a/ppl.c Thu Oct 11 16:04:12 2012 +0300 +++ b/ppl.c Thu Oct 11 16:41:33 2012 +0300 @@ -733,7 +733,7 @@ while (!engine.exitFlag) { currTick = SDL_GetTicks(); - BOOL force = (currTick - prevTick > 500); + BOOL force = (currTick - prevTick > 500), updated = FALSE; while (SDL_PollEvent(&engine.event)) switch (engine.event.type) @@ -832,12 +832,6 @@ break; } - // Draw frame - if (SDL_MUSTLOCK(engine.screen) != 0 && SDL_LockSurface(engine.screen) != 0) - { - dmError("Can't lock surface.\n"); - goto error_exit; - } #if 1 JSS_LOCK(engine.plr); @@ -849,6 +843,19 @@ if (currRow != prevRow || force) { + prevRow = currRow; + force = TRUE; + } + + // Draw frame + if (SDL_MUSTLOCK(engine.screen) != 0 && SDL_LockSurface(engine.screen) != 0) + { + dmError("Can't lock surface.\n"); + goto error_exit; + } + + if (force) + { dmClearSurface(engine.screen, col.boxBg); dmDrawBMTextQ(engine.screen, font, DMD_TRANSPARENT, 5, 5, "%s v%s by ccr/TNSP - (c) Copyright 2012 TNSP", dmProgDesc, dmProgVersion); @@ -861,13 +868,6 @@ engine.screen->w - 6, engine.screen->h * 0.8, currPattern, currRow); - prevRow = currRow; - force = TRUE; - } - - if (force) - { - dmFillRect(engine.screen, 5, 5 + 12, engine.screen->w, 5 + 12 + 10, col.boxBg); JSS_LOCK(engine.plr); dmDrawBMTextQ(engine.screen, font, DMD_TRANSPARENT, 5, 5 + 12, "Tempo: %3d | Speed: %3d | Row: %3d/%-3d | Order: %3d/%-3d | Pattern: %3d/%-3d", @@ -876,6 +876,7 @@ engine.plr->order, engine.mod->norders, engine.plr->npattern, engine.mod->npatterns); JSS_UNLOCK(engine.plr); + updated = TRUE; } if (force || currTick - prevTick >= (engine.pauseFlag ? 100 : 20)) @@ -884,19 +885,21 @@ dmDisplayChannels(engine.screen, 5, engine.screen->h * 0.8 + 5, engine.screen->w - 5, engine.screen->h - 5, engine.dev); JSS_UNLOCK(engine.dev); + updated = TRUE; } if (force) prevTick = currTick; #endif - // Flip screen if (SDL_MUSTLOCK(engine.screen) != 0) SDL_UnlockSurface(engine.screen); - SDL_Flip(engine.screen); - SDL_Delay(engine.pauseFlag ? 100 : 20); + if (updated) + SDL_Flip(engine.screen); + + SDL_Delay(engine.pauseFlag ? 100 : 30); } error_exit: