aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorin1tiate <radwoodward@vikings.grayson.edu>2021-08-11 09:20:00 -0500
committerin1tiate <radwoodward@vikings.grayson.edu>2021-08-11 09:20:00 -0500
commitce94cd2d1e75738b53f7ab990a49e75a01b80394 (patch)
tree4fa85c1703b6658f8d501d0dfade40ca53112a35
parent579456fbd766b64f4ba11b9ff83ece3dad9d6553 (diff)
preload next frame before ticking over
-rw-r--r--include/aolayer.h4
-rw-r--r--src/aolayer.cpp22
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()