diff ppl.c @ 176:dfe7e392ea7e

Optimize screen updates.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 06 Oct 2012 11:14:51 +0300
parents e281663f04ba
children b29c9a2fbeb5
line wrap: on
line diff
--- a/ppl.c	Sat Oct 06 11:11:41 2012 +0300
+++ b/ppl.c	Sat Oct 06 11:14:51 2012 +0300
@@ -671,6 +671,9 @@
     
     while (!engine.exitFlag && engine.plr->isPlaying)
     {
+        currTick = SDL_GetTicks();
+        BOOL force = (currTick - prevTick > 500);
+
         while (SDL_PollEvent(&engine.event))
         switch (engine.event.type)
         {
@@ -688,16 +691,23 @@
 
                     case SDLK_LEFT:
                         if (engine.actChannel > 0)
+                        {
                             engine.actChannel--;
+                            force = TRUE;
+                        }
                         break;
 
                     case SDLK_RIGHT:
                         if (engine.actChannel < engine.mod->nchannels)
+                        {
                             engine.actChannel++;
+                            force = TRUE;
+                        }
                         break;
 
                     case SDLK_RETURN:
                         jvmMute(engine.dev, engine.actChannel, !jvmGetMute(engine.dev, engine.actChannel));
+                        force = TRUE;
                         break;
 
                     case SDLK_PAGEUP:
@@ -706,6 +716,7 @@
                         jmpPlayOrder(engine.plr, dmClamp(engine.plr->order - 1, 0, engine.mod->norders));
                         JSS_UNLOCK(engine.plr);
                         JSS_UNLOCK(engine.dev);
+                        force = TRUE;
                         break;
 
                     case SDLK_PAGEDOWN:
@@ -714,6 +725,7 @@
                         jmpPlayOrder(engine.plr, dmClamp(engine.plr->order + 1, 0, engine.mod->norders));
                         JSS_UNLOCK(engine.plr);
                         JSS_UNLOCK(engine.dev);
+                        force = TRUE;
                         break;
 
                     default:
@@ -746,9 +758,9 @@
             goto error_exit;
         }
 
-        currTick = SDL_GetTicks();
 #if 1
-        if (engine.plr->row != prevRow || currTick - prevTick > 100)
+        
+        if (engine.plr->row != prevRow || force)
         {
             dmClearSurface(engine.screen, col.boxBg);
             
@@ -762,29 +774,33 @@
                 engine.screen->w - 6, engine.screen->h * 0.8,
                 engine.plr->pattern, engine.plr->row);
             
-            prevTick = currTick;
             prevRow = engine.plr->row;
+            force = TRUE;
         }
-        else
+        
+        if (force)
         {
             dmFillRect(engine.screen, 5, 5 + 12, engine.screen->w, 5 + 12 + 10, col.boxBg);
-        }
-
-        dmDrawBMTextQ(engine.screen, font, DMD_TRANSPARENT, 5, 5 + 12,
+            dmDrawBMTextQ(engine.screen, font, DMD_TRANSPARENT, 5, 5 + 12,
             "Tempo: %3d | Speed: %3d | Row: %3d | Order: %3d/%3d | Pattern: %3d/%3d",
             engine.plr->tempo, engine.plr->speed, engine.plr->row,
             engine.plr->order, engine.mod->norders,
             engine.plr->npattern, engine.mod->npatterns);
-
-
+        }
 
-        JSS_LOCK(engine.dev);
-        JSS_LOCK(engine.plr);
-        dmDisplayChannels(engine.screen, 5, engine.screen->h * 0.8 + 5,
-            engine.screen->w - 5, engine.screen->h - 5, engine.dev);
+        if (force || currTick - prevTick >= (engine.pauseFlag ? 100 : 20))
+        {
+            JSS_LOCK(engine.dev);
+            JSS_LOCK(engine.plr);
+            dmDisplayChannels(engine.screen, 5, engine.screen->h * 0.8 + 5,
+                engine.screen->w - 5, engine.screen->h - 5, engine.dev);
 
-        JSS_UNLOCK(engine.plr);
-        JSS_UNLOCK(engine.dev);
+            JSS_UNLOCK(engine.plr);
+            JSS_UNLOCK(engine.dev);
+        }
+
+        if (force)
+            prevTick = currTick;
 
 #endif
 
@@ -793,7 +809,7 @@
             SDL_UnlockSurface(engine.screen);
 
         SDL_Flip(engine.screen);
-        SDL_Delay(engine.pauseFlag ? 100 : 10);
+        SDL_Delay(engine.pauseFlag ? 100 : 20);
     }
 
 error_exit: