File indexing completed on 2024-11-10 04:00:29

0001 /*
0002  *  SPDX-FileCopyrightText: 2017 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "KisAnimationRenderingBenchmark.h"
0008 
0009 #include <simpletest.h>
0010 
0011 #include <testutil.h>
0012 #include "kis_time_span.h"
0013 #include "dialogs/KisAsyncAnimationFramesSaveDialog.h"
0014 #include "kis_image_animation_interface.h"
0015 #include "KisPart.h"
0016 #include "KisDocument.h"
0017 #include "kis_image.h"
0018 #include "kis_image_config.h"
0019 
0020 namespace {
0021 void removeTempFiles(const QString &filesMask)
0022 {
0023     QFileInfo info(filesMask);
0024     QDir dir(info.absolutePath());
0025     QStringList filesList = dir.entryList({ info.fileName() });
0026     if (!filesList.isEmpty()) {
0027         Q_FOREACH (const QString &file, filesList) {
0028             if (!dir.remove(file)) {
0029                 QFAIL("Couldn't remove the old testing file!");
0030             }
0031         }
0032     }
0033 }
0034 
0035 void runRenderingTest(KisImageSP image, int numCores, int numClones)
0036 {
0037     {
0038         KisImageConfig cfg(false);
0039         cfg.setMaxNumberOfThreads(numCores);
0040         cfg.setFrameRenderingClones(numClones);
0041     }
0042 
0043     const KisTimeSpan range = image->animationInterface()->documentPlaybackRange();
0044 
0045     KisAsyncAnimationFramesSaveDialog dlg(image, range, "temp_frames.png", 0, false, 0);
0046     dlg.setBatchMode(true);
0047 
0048     // repeat rendering twice!
0049     for (int i = 0; i < 1; i++) {
0050         removeTempFiles(dlg.savedFilesMaskWildcard());
0051         KisAsyncAnimationFramesSaveDialog::Result result = dlg.regenerateRange(0);
0052         QCOMPARE(result, KisAsyncAnimationFramesSaveDialog::RenderComplete);
0053         removeTempFiles(dlg.savedFilesMaskWildcard());
0054     }
0055 }
0056 
0057 
0058 }
0059 
0060 
0061 
0062 
0063 void KisAnimationRenderingBenchmark::testCacheRendering()
0064 {
0065     const QString fileName = TestUtil::fetchDataFileLazy("miloor_turntable_002.kra", true);
0066     QVERIFY(QFileInfo(fileName).exists());
0067 
0068 
0069     QScopedPointer<KisDocument> doc(KisPart::instance()->createDocument());
0070 
0071     bool loadingResult = doc->loadNativeFormat(fileName);
0072     QVERIFY(loadingResult);
0073 
0074 
0075     doc->image()->barrierLock();
0076     doc->image()->unlock();
0077 
0078 
0079     for (int numCores = 1; numCores <= QThread::idealThreadCount(); numCores++) {
0080         QElapsedTimer timer;
0081         timer.start();
0082 
0083         const int numClones = qMax(1, numCores / 2);
0084         runRenderingTest(doc->image(), numCores, numClones);
0085 
0086         qDebug() << "Cores:" << numCores << "Clones:" << numClones << "Time:" << timer.elapsed();
0087     }
0088 
0089     for (int numCores = 1; numCores <= QThread::idealThreadCount(); numCores++) {
0090         QElapsedTimer timer;
0091         timer.start();
0092 
0093         const int numClones = numCores;
0094         runRenderingTest(doc->image(), numCores, numClones);
0095 
0096         qDebug() << "Cores:" << numCores << "Clones:" << numClones << "Time:" << timer.elapsed();
0097     }
0098 }
0099 
0100 SIMPLE_TEST_MAIN(KisAnimationRenderingBenchmark)