text: /*
   * Copyright 2013 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  #include "perfMonitor.h"
  
  namespace ndk_helper
  {
  
  PerfMonitor::PerfMonitor() :
          last_tick_( 0.f ), tv_last_sec_( 0 ), tickindex_( 0 ), ticksum_( 0 )
  {
      for( int32_t i = 0; i < NUM_SAMPLES; ++i )
          ticklist_[ i ] = 0;
  }
  
  PerfMonitor::~PerfMonitor()
  {
  }
  
  double PerfMonitor::UpdateTick( double currentTick )
  {
      ticksum_ -= ticklist_[ tickindex_ ];
      ticksum_ += currentTick;
      ticklist_[ tickindex_ ] = currentTick;
      tickindex_ = (tickindex_ + 1) % NUM_SAMPLES;
  
      return ((double) ticksum_ / NUM_SAMPLES);
  }
  
  bool PerfMonitor::Update( float &fFPS )
  {
      struct timeval Time;
      gettimeofday( &Time, NULL );
  
      double time = Time.tv_sec + Time.tv_usec * 1.0 / 1000000.0;
      double tick = time - last_tick_;
      double d = UpdateTick( tick );
      last_tick_ = time;
  
      if( Time.tv_sec - tv_last_sec_ >= 1 )
      {
          double time = Time.tv_sec + Time.tv_usec * 1.0 / 1000000.0;
          current_FPS_ = 1.f / d;
          tv_last_sec_ = Time.tv_sec;
          fFPS = current_FPS_;
          return true;
      }
      else
      {
          fFPS = current_FPS_;
          return false;
      }
  }
  
  }   //namespace ndkHelper
  
  