GLES2N64 (from mupen64plus-ae) plugin. Compile and run on the OpenPandora
[mupen64plus-pandora.git] / source / gles2n64 / src / FrameSkipper.cpp
1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2  *   Copyright (C) 2011 yongzh (freeman.yong@gmail.com)                    *
3  *                                                                         *
4  *   This program is free software; you can redistribute it and/or modify  *
5  *   it under the terms of the GNU General Public License as published by  *
6  *   the Free Software Foundation; either version 2 of the License, or     *
7  *   (at your option) any later version.                                   *
8  *                                                                         *
9  *   This program is distributed in the hope that it will be useful,       *
10  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
12  *   GNU General Public License for more details.                          *
13  *                                                                         *
14  *   You should have received a copy of the GNU General Public License     *
15  *   along with this program; if not, write to the                         *
16  *   Free Software Foundation, Inc.,                                       *
17  *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.          *
18  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
19
20 #include "FrameSkipper.h"
21 #include "ticks.h"
22
23 FrameSkipper::FrameSkipper()
24         : skipType(AUTO), maxSkips(2), targetFPS(60)
25 {
26 }
27
28 void FrameSkipper::start()
29 {
30         initialTicks = 0;
31         virtualCount = 0;
32         skipCounter = 0;
33 }
34
35 void FrameSkipper::update()
36 {
37         // for the first frame
38         if (initialTicks == 0) {
39                 initialTicks = ticksGetTicks();
40                 return;
41         }
42
43         unsigned int elapsed = ticksGetTicks() - initialTicks;
44         unsigned int realCount = elapsed * targetFPS / 1000;
45
46         virtualCount++;
47         if (realCount >= virtualCount) {
48                 if (realCount > virtualCount &&
49                                 skipType == AUTO && skipCounter < maxSkips) {
50                         skipCounter++;
51                 } else {
52                         virtualCount = realCount;
53                         if (skipType == AUTO)
54                                 skipCounter = 0;
55                 }
56         }
57         if (skipType == MANUAL) {
58                 if (++skipCounter > maxSkips)
59                         skipCounter = 0;
60         }
61 }