Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

import time 

 

 

class SimpleTimer(object): 

 

    def __init__(self): 

        self.reset() 

 

    def now(self): 

        return time.time() 

 

    def elapsed(self): 

        return self.now() - self.t0 

 

    def reset(self): 

        self.t0 = self.now() 

 

 

class FPSCounter(object): 

 

    def __init__(self): 

        self.averageComputer = MovingAverageComputer() 

        self.printToConsole = False 

 

    def tick(self): 

        newAverage =  self.averageComputer.timer.elapsed() > self.averageComputer.timeWindow 

        self.averageComputer.update(1) 

        if newAverage and self.printToConsole: 

            print 'fps:', self.getAverageFPS() 

 

    def getAverageFPS(self): 

        return self.averageComputer.getAverage() 

 

 

class AverageComputer(object): 

 

    def __init__(self): 

        self.timer = SimpleTimer() 

        self.quantity = 0.0 

 

    def update(self, quantitySinceLastUpdate): 

        self.quantity += quantitySinceLastUpdate 

 

    def getAverage(self): 

        return self.quantity / self.timer.elapsed() 

 

    def reset(self): 

        self.quantity = 0.0 

        self.timer.reset() 

 

 

class MovingAverageComputer(object): 

 

    def __init__(self): 

        self.timer = SimpleTimer() 

        self.alpha = 0.9 

        self.timeWindow = 1.0 

        self.average = 0.0 

        self.quantityThisWindow = 0.0 

 

    def update(self, quantitySinceLastUpdate): 

        self.quantityThisWindow += quantitySinceLastUpdate 

        self._updateAverage() 

 

    def getAverage(self): 

        self._updateAverage() 

        return self.average 

 

    def _updateAverage(self): 

 

        elapsedTime = self.timer.elapsed() 

 

        if elapsedTime > self.timeWindow: 

 

            # compute FPS for this time window 

            averageThisWindow = self.quantityThisWindow / elapsedTime 

 

            # update moving average 

            self.average = self.alpha * averageThisWindow + (1.0 - self.alpha) * self.average 

 

            # reset 

            self.timer.reset() 

            self.quantityThisWindow = 0.0