diff options
| author | in1tiate <radwoodward@vikings.grayson.edu> | 2021-08-11 09:20:00 -0500 |
|---|---|---|
| committer | in1tiate <radwoodward@vikings.grayson.edu> | 2021-08-11 09:20:00 -0500 |
| commit | ce94cd2d1e75738b53f7ab990a49e75a01b80394 (patch) | |
| tree | 4fa85c1703b6658f8d501d0dfade40ca53112a35 | |
| parent | 579456fbd766b64f4ba11b9ff83ece3dad9d6553 (diff) | |
preload next frame before ticking over
| -rw-r--r-- | include/aolayer.h | 4 | ||||
| -rw-r--r-- | src/aolayer.cpp | 22 |
2 files changed, 18 insertions, 8 deletions
diff --git a/include/aolayer.h b/include/aolayer.h index 7a8e2fd9..4b95ddbd 100644 --- a/include/aolayer.h +++ b/include/aolayer.h @@ -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(); diff --git a/src/aolayer.cpp b/src/aolayer.cpp index 3791d66b..7ec42b96 100644 --- a/src/aolayer.cpp +++ b/src/aolayer.cpp @@ -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() |
