preload next frame before ticking over
This commit is contained in:
		
							parent
							
								
									579456fbd7
								
							
						
					
					
						commit
						ce94cd2d1e
					
				@ -7,6 +7,7 @@
 | 
			
		||||
#include <QLabel>
 | 
			
		||||
#include <QTimer>
 | 
			
		||||
#include <QBitmap>
 | 
			
		||||
#include <QtConcurrent/QtConcurrentRun>
 | 
			
		||||
 | 
			
		||||
class AOApplication;
 | 
			
		||||
class VPath;
 | 
			
		||||
@ -139,6 +140,9 @@ protected:
 | 
			
		||||
  // Center the QLabel in the viewport based on the dimensions of f_pixmap
 | 
			
		||||
  void center_pixmap(QPixmap f_pixmap);
 | 
			
		||||
 | 
			
		||||
  // Populate the frame and delay vectors. Done asynchronously.
 | 
			
		||||
  void load_next_frame();
 | 
			
		||||
 | 
			
		||||
signals:
 | 
			
		||||
  void done();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -532,7 +532,11 @@ void CharLayer::movie_ticker()
 | 
			
		||||
void AOLayer::movie_ticker()
 | 
			
		||||
{
 | 
			
		||||
  ++frame;
 | 
			
		||||
  if (frame >= max_frames) {
 | 
			
		||||
  QFuture<void> future;
 | 
			
		||||
  if (frame >= movie_frames.size() && frame < max_frames) { // need to load the image
 | 
			
		||||
      future = QtConcurrent::run(this, &AOLayer::load_next_frame);
 | 
			
		||||
  }
 | 
			
		||||
  else if (frame >= max_frames) {
 | 
			
		||||
    if (play_once) {
 | 
			
		||||
      if (cull_image)
 | 
			
		||||
        this->stop();
 | 
			
		||||
@ -544,19 +548,21 @@ void AOLayer::movie_ticker()
 | 
			
		||||
    else
 | 
			
		||||
      frame = 0;
 | 
			
		||||
  }
 | 
			
		||||
  //  qint64 difference = elapsed - movie_delays[frame];
 | 
			
		||||
  if (frame >= movie_frames.size()) {
 | 
			
		||||
    movie_frames.append(this->get_pixmap(m_reader.read()));
 | 
			
		||||
    movie_delays.append(m_reader.nextImageDelay());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG_MOVIE
 | 
			
		||||
  qDebug() << frame << movie_delays[frame]
 | 
			
		||||
           << "actual time taken from last frame:" << actual_time.restart();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  future.waitForFinished(); // don't set the frame before we definitely have it in memory
 | 
			
		||||
  this->set_frame(movie_frames[frame]);
 | 
			
		||||
  ticker->setInterval(this->get_frame_delay(movie_delays[frame]));
 | 
			
		||||
  if (frame + 1 >= movie_frames.size() && frame + 1 < max_frames) { // load the next frame before we tick again
 | 
			
		||||
      future = QtConcurrent::run(this, &AOLayer::load_next_frame);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AOLayer::load_next_frame() {
 | 
			
		||||
    movie_frames.append(this->get_pixmap(m_reader.read()));
 | 
			
		||||
    movie_delays.append(m_reader.nextImageDelay());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CharLayer::preanim_done()
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user