From 85973caa03ed2279f6dd3f44f251b4c0b7ea3037 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Br=C3=BCbach?= Date: Mon, 13 Jan 2025 22:52:01 +0100 Subject: [PATCH] Parallelize picture loader. --- cockatrice/CMakeLists.txt | 1 + .../picture_loader/picture_loader_worker.cpp | 19 +++++++++++-------- .../ui/picture_loader/picture_loader_worker.h | 2 ++ .../picture_loader_worker_work.cpp | 11 ++++++----- .../picture_loader_worker_work.h | 6 +++--- 5 files changed, 23 insertions(+), 16 deletions(-) diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index 27709eb72..9bbf96f78 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -96,6 +96,7 @@ set(cockatrice_SOURCES src/client/ui/phases_toolbar.cpp src/client/ui/picture_loader/picture_loader.cpp src/client/ui/picture_loader/picture_loader_worker.cpp + src/client/ui/picture_loader/picture_loader_worker_work.cpp src/client/ui/picture_loader/picture_to_load.cpp src/game/zones/pile_zone.cpp src/client/ui/pixel_map_generator.cpp diff --git a/cockatrice/src/client/ui/picture_loader/picture_loader_worker.cpp b/cockatrice/src/client/ui/picture_loader/picture_loader_worker.cpp index f7a0a6e55..1043ef053 100644 --- a/cockatrice/src/client/ui/picture_loader/picture_loader_worker.cpp +++ b/cockatrice/src/client/ui/picture_loader/picture_loader_worker.cpp @@ -20,7 +20,6 @@ PictureLoaderWorker::PictureLoaderWorker() customPicsPath(SettingsCache::instance().getCustomPicsPath()), picDownload(SettingsCache::instance().getPicDownload()), downloadRunning(false), loadQueueRunning(false) { - connect(this, SIGNAL(startLoadQueue()), this, SLOT(processLoadQueue()), Qt::QueuedConnection); connect(&SettingsCache::instance(), SIGNAL(picsPathChanged()), this, SLOT(picsPathChanged())); connect(&SettingsCache::instance(), SIGNAL(picDownloadChanged()), this, SLOT(picDownloadChanged())); @@ -42,7 +41,6 @@ PictureLoaderWorker::PictureLoaderWorker() // Use a ManualRedirectPolicy since we keep track of redirects in picDownloadFinished // We can't use NoLessSafeRedirectPolicy because it is not applied with AlwaysCache networkManager->setRedirectPolicy(QNetworkRequest::ManualRedirectPolicy); - connect(networkManager, SIGNAL(finished(QNetworkReply *)), this, SLOT(picDownloadFinished(QNetworkReply *))); cacheFilePath = SettingsCache::instance().getRedirectCachePath() + REDIRECT_CACHE_FILENAME; loadRedirectCache(); @@ -67,9 +65,9 @@ QNetworkReply *PictureLoaderWorker::makeRequest(const QUrl &url, PictureLoaderWo QUrl cachedRedirect = getCachedRedirect(url); if (!cachedRedirect.isEmpty()) { qCDebug(PictureLoaderWorkerLog).nospace() - << "[card: " << cardBeingDownloaded.getCard()->getCorrectedName() - << " set: " << cardBeingDownloaded.getSetName() << "]: Using cached redirect for " << url.toDisplayString() - << " to " << cachedRedirect.toDisplayString(); + << "PictureLoader: [card: " << worker->cardToDownload.getCard()->getCorrectedName() + << " set: " << worker->cardToDownload.getSetName() << "]: Using cached redirect for " + << url.toDisplayString() << " to " << cachedRedirect.toDisplayString(); return makeRequest(cachedRedirect, worker); // Use the cached redirect } @@ -105,11 +103,11 @@ QNetworkReply *PictureLoaderWorker::makeRequest(const QUrl &url, PictureLoaderWo << " set: " << cardBeingDownloaded.getSetName() << "]: Caching redirect from " << url.toDisplayString() << " to " << redirectUrl.toDisplayString(); } - - reply->deleteLater(); }); - connect(reply, &QNetworkReply::finished, worker, [reply, worker]() { worker->picDownloadFinished(reply); }); + connect( + reply, &QNetworkReply::finished, worker, [reply, worker]() { worker->picDownloadFinished(reply); }, + Qt::QueuedConnection); return reply; } @@ -120,6 +118,11 @@ void PictureLoaderWorker::enqueueImageLoad(const CardInfoPtr &card) Q_UNUSED(worker); } +void PictureLoaderWorker::imageLoadedSuccessfully(CardInfoPtr card, const QImage &image) +{ + emit imageLoaded(card, image); +} + void PictureLoaderWorker::cacheRedirect(const QUrl &originalUrl, const QUrl &redirectUrl) { redirectCache[originalUrl] = qMakePair(redirectUrl, QDateTime::currentDateTimeUtc()); diff --git a/cockatrice/src/client/ui/picture_loader/picture_loader_worker.h b/cockatrice/src/client/ui/picture_loader/picture_loader_worker.h index d28a77408..9d4bc5bd8 100644 --- a/cockatrice/src/client/ui/picture_loader/picture_loader_worker.h +++ b/cockatrice/src/client/ui/picture_loader/picture_loader_worker.h @@ -16,6 +16,7 @@ #define REDIRECT_TIMESTAMP "timestamp" #define REDIRECT_CACHE_FILENAME "cache.ini" +class PictureLoaderWorkerWork; inline Q_LOGGING_CATEGORY(PictureLoaderWorkerLog, "picture_loader.worker"); class PictureLoaderWorker : public QObject @@ -30,6 +31,7 @@ public: public slots: QNetworkReply *makeRequest(const QUrl &url, PictureLoaderWorkerWork *workThread); + void imageLoadedSuccessfully(CardInfoPtr card, const QImage &image); private: static QStringList md5Blacklist; diff --git a/cockatrice/src/client/ui/picture_loader/picture_loader_worker_work.cpp b/cockatrice/src/client/ui/picture_loader/picture_loader_worker_work.cpp index eaeef5d13..b727575ee 100644 --- a/cockatrice/src/client/ui/picture_loader/picture_loader_worker_work.cpp +++ b/cockatrice/src/client/ui/picture_loader/picture_loader_worker_work.cpp @@ -2,6 +2,7 @@ #include "../../../game/cards/card_database_manager.h" #include "../../../settings/cache_settings.h" +#include "picture_loader_worker.h" #include #include @@ -16,13 +17,13 @@ Q_LOGGING_CATEGORY(PictureLoaderWorkerWorkLog, "picture_loader.worker"); // Card back returned by gatherer when card is not found QStringList PictureLoaderWorkerWork::md5Blacklist = QStringList() << "db0c48db407a907c16ade38de048a441"; -PictureLoaderWorkerWork::PictureLoaderWorkerWork(PictureLoaderWorker *_worker, CardInfoPtr toLoad) +PictureLoaderWorkerWork::PictureLoaderWorkerWork(PictureLoaderWorker *_worker, const CardInfoPtr &toLoad) : QThread(nullptr), worker(_worker), cardToDownload(toLoad) { - connect(this, SIGNAL(startLoadQueue()), this, SLOT(processLoadQueue()), Qt::QueuedConnection); - - connect(networkManager, SIGNAL(finished(QNetworkReply *)), this, SLOT(picDownloadFinished(QNetworkReply *))); - + connect(this, &PictureLoaderWorkerWork::requestImageDownload, worker, &PictureLoaderWorker::makeRequest, + Qt::QueuedConnection); + connect(this, &PictureLoaderWorkerWork::imageLoaded, worker, &PictureLoaderWorker::imageLoadedSuccessfully, + Qt::QueuedConnection); pictureLoaderThread = new QThread; pictureLoaderThread->start(QThread::LowPriority); moveToThread(pictureLoaderThread); diff --git a/cockatrice/src/client/ui/picture_loader/picture_loader_worker_work.h b/cockatrice/src/client/ui/picture_loader/picture_loader_worker_work.h index 0bbe1bca4..ce65497f8 100644 --- a/cockatrice/src/client/ui/picture_loader/picture_loader_worker_work.h +++ b/cockatrice/src/client/ui/picture_loader/picture_loader_worker_work.h @@ -21,18 +21,18 @@ class PictureLoaderWorkerWork : public QThread { Q_OBJECT public: - explicit PictureLoaderWorkerWork(PictureLoaderWorker *worker, CardInfoPtr toLoad); + explicit PictureLoaderWorkerWork(PictureLoaderWorker *worker, const CardInfoPtr &toLoad); ~PictureLoaderWorkerWork() override; + PictureLoaderWorker *worker; + PictureToLoad cardToDownload; public slots: void picDownloadFinished(QNetworkReply *reply); void picDownloadFailed(); private: static QStringList md5Blacklist; - PictureLoaderWorker *worker; QThread *pictureLoaderThread; QNetworkAccessManager *networkManager; - PictureToLoad cardToDownload; bool picDownload, downloadRunning, loadQueueRunning; void startNextPicDownload(); bool cardImageExistsOnDisk(QString &setName, QString &correctedCardName);