Mercurial > hg > dmlib
comparison 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 |
comparison
equal
deleted
inserted
replaced
175:4192aa6d5af6 | 176:dfe7e392ea7e |
---|---|
669 | 669 |
670 int currTick, prevTick = 0, prevRow = -1; | 670 int currTick, prevTick = 0, prevRow = -1; |
671 | 671 |
672 while (!engine.exitFlag && engine.plr->isPlaying) | 672 while (!engine.exitFlag && engine.plr->isPlaying) |
673 { | 673 { |
674 currTick = SDL_GetTicks(); | |
675 BOOL force = (currTick - prevTick > 500); | |
676 | |
674 while (SDL_PollEvent(&engine.event)) | 677 while (SDL_PollEvent(&engine.event)) |
675 switch (engine.event.type) | 678 switch (engine.event.type) |
676 { | 679 { |
677 case SDL_KEYDOWN: | 680 case SDL_KEYDOWN: |
678 switch (engine.event.key.keysym.sym) | 681 switch (engine.event.key.keysym.sym) |
686 SDL_PauseAudio(engine.pauseFlag); | 689 SDL_PauseAudio(engine.pauseFlag); |
687 break; | 690 break; |
688 | 691 |
689 case SDLK_LEFT: | 692 case SDLK_LEFT: |
690 if (engine.actChannel > 0) | 693 if (engine.actChannel > 0) |
694 { | |
691 engine.actChannel--; | 695 engine.actChannel--; |
696 force = TRUE; | |
697 } | |
692 break; | 698 break; |
693 | 699 |
694 case SDLK_RIGHT: | 700 case SDLK_RIGHT: |
695 if (engine.actChannel < engine.mod->nchannels) | 701 if (engine.actChannel < engine.mod->nchannels) |
702 { | |
696 engine.actChannel++; | 703 engine.actChannel++; |
704 force = TRUE; | |
705 } | |
697 break; | 706 break; |
698 | 707 |
699 case SDLK_RETURN: | 708 case SDLK_RETURN: |
700 jvmMute(engine.dev, engine.actChannel, !jvmGetMute(engine.dev, engine.actChannel)); | 709 jvmMute(engine.dev, engine.actChannel, !jvmGetMute(engine.dev, engine.actChannel)); |
710 force = TRUE; | |
701 break; | 711 break; |
702 | 712 |
703 case SDLK_PAGEUP: | 713 case SDLK_PAGEUP: |
704 JSS_LOCK(engine.dev); | 714 JSS_LOCK(engine.dev); |
705 JSS_LOCK(engine.plr); | 715 JSS_LOCK(engine.plr); |
706 jmpPlayOrder(engine.plr, dmClamp(engine.plr->order - 1, 0, engine.mod->norders)); | 716 jmpPlayOrder(engine.plr, dmClamp(engine.plr->order - 1, 0, engine.mod->norders)); |
707 JSS_UNLOCK(engine.plr); | 717 JSS_UNLOCK(engine.plr); |
708 JSS_UNLOCK(engine.dev); | 718 JSS_UNLOCK(engine.dev); |
719 force = TRUE; | |
709 break; | 720 break; |
710 | 721 |
711 case SDLK_PAGEDOWN: | 722 case SDLK_PAGEDOWN: |
712 JSS_LOCK(engine.dev); | 723 JSS_LOCK(engine.dev); |
713 JSS_LOCK(engine.plr); | 724 JSS_LOCK(engine.plr); |
714 jmpPlayOrder(engine.plr, dmClamp(engine.plr->order + 1, 0, engine.mod->norders)); | 725 jmpPlayOrder(engine.plr, dmClamp(engine.plr->order + 1, 0, engine.mod->norders)); |
715 JSS_UNLOCK(engine.plr); | 726 JSS_UNLOCK(engine.plr); |
716 JSS_UNLOCK(engine.dev); | 727 JSS_UNLOCK(engine.dev); |
728 force = TRUE; | |
717 break; | 729 break; |
718 | 730 |
719 default: | 731 default: |
720 break; | 732 break; |
721 } | 733 } |
744 { | 756 { |
745 dmError("Can't lock surface.\n"); | 757 dmError("Can't lock surface.\n"); |
746 goto error_exit; | 758 goto error_exit; |
747 } | 759 } |
748 | 760 |
749 currTick = SDL_GetTicks(); | |
750 #if 1 | 761 #if 1 |
751 if (engine.plr->row != prevRow || currTick - prevTick > 100) | 762 |
763 if (engine.plr->row != prevRow || force) | |
752 { | 764 { |
753 dmClearSurface(engine.screen, col.boxBg); | 765 dmClearSurface(engine.screen, col.boxBg); |
754 | 766 |
755 dmDrawBMTextQ(engine.screen, font, DMD_TRANSPARENT, 5, 5, "%s v%s by ccr/TNSP - (c) Copyright 2012 TNSP", dmProgDesc, dmProgVersion); | 767 dmDrawBMTextQ(engine.screen, font, DMD_TRANSPARENT, 5, 5, "%s v%s by ccr/TNSP - (c) Copyright 2012 TNSP", dmProgDesc, dmProgVersion); |
756 | 768 |
760 | 772 |
761 dmDisplayPattern(engine.screen, 5, 40, | 773 dmDisplayPattern(engine.screen, 5, 40, |
762 engine.screen->w - 6, engine.screen->h * 0.8, | 774 engine.screen->w - 6, engine.screen->h * 0.8, |
763 engine.plr->pattern, engine.plr->row); | 775 engine.plr->pattern, engine.plr->row); |
764 | 776 |
765 prevTick = currTick; | |
766 prevRow = engine.plr->row; | 777 prevRow = engine.plr->row; |
767 } | 778 force = TRUE; |
768 else | 779 } |
780 | |
781 if (force) | |
769 { | 782 { |
770 dmFillRect(engine.screen, 5, 5 + 12, engine.screen->w, 5 + 12 + 10, col.boxBg); | 783 dmFillRect(engine.screen, 5, 5 + 12, engine.screen->w, 5 + 12 + 10, col.boxBg); |
771 } | 784 dmDrawBMTextQ(engine.screen, font, DMD_TRANSPARENT, 5, 5 + 12, |
772 | |
773 dmDrawBMTextQ(engine.screen, font, DMD_TRANSPARENT, 5, 5 + 12, | |
774 "Tempo: %3d | Speed: %3d | Row: %3d | Order: %3d/%3d | Pattern: %3d/%3d", | 785 "Tempo: %3d | Speed: %3d | Row: %3d | Order: %3d/%3d | Pattern: %3d/%3d", |
775 engine.plr->tempo, engine.plr->speed, engine.plr->row, | 786 engine.plr->tempo, engine.plr->speed, engine.plr->row, |
776 engine.plr->order, engine.mod->norders, | 787 engine.plr->order, engine.mod->norders, |
777 engine.plr->npattern, engine.mod->npatterns); | 788 engine.plr->npattern, engine.mod->npatterns); |
778 | 789 } |
779 | 790 |
780 | 791 if (force || currTick - prevTick >= (engine.pauseFlag ? 100 : 20)) |
781 JSS_LOCK(engine.dev); | 792 { |
782 JSS_LOCK(engine.plr); | 793 JSS_LOCK(engine.dev); |
783 dmDisplayChannels(engine.screen, 5, engine.screen->h * 0.8 + 5, | 794 JSS_LOCK(engine.plr); |
784 engine.screen->w - 5, engine.screen->h - 5, engine.dev); | 795 dmDisplayChannels(engine.screen, 5, engine.screen->h * 0.8 + 5, |
785 | 796 engine.screen->w - 5, engine.screen->h - 5, engine.dev); |
786 JSS_UNLOCK(engine.plr); | 797 |
787 JSS_UNLOCK(engine.dev); | 798 JSS_UNLOCK(engine.plr); |
799 JSS_UNLOCK(engine.dev); | |
800 } | |
801 | |
802 if (force) | |
803 prevTick = currTick; | |
788 | 804 |
789 #endif | 805 #endif |
790 | 806 |
791 // Flip screen | 807 // Flip screen |
792 if (SDL_MUSTLOCK(engine.screen) != 0) | 808 if (SDL_MUSTLOCK(engine.screen) != 0) |
793 SDL_UnlockSurface(engine.screen); | 809 SDL_UnlockSurface(engine.screen); |
794 | 810 |
795 SDL_Flip(engine.screen); | 811 SDL_Flip(engine.screen); |
796 SDL_Delay(engine.pauseFlag ? 100 : 10); | 812 SDL_Delay(engine.pauseFlag ? 100 : 20); |
797 } | 813 } |
798 | 814 |
799 error_exit: | 815 error_exit: |
800 SDL_PauseAudio(1); | 816 SDL_PauseAudio(1); |
801 | 817 |