Hello,
Je reprend un ancien projet : création d'une image (chargement d'une font et bin paking pour en faire un atlas), puis création d'un SDF à partir de cet atlas.
Mon but est de réduire le temps d'exec, plus par curiosité que par nécessité.
Et là je me retrouve face à un truc bizarre : afficher l'image générée multiplie par 3 son temps de création .
Mon code ressemble à ça:Qui me donne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 template <class Function> void timeIt(Function function, std::string const& desc) { auto startTime = std::chrono::high_resolution_clock::now(); function(); auto endTime = std::chrono::high_resolution_clock::now(); auto t = std::chrono::duration_cast<std::chrono::duration<double>>(endTime - startTime); std::cout << desc << t.count() << " seconds." << std::endl; } int main(int, char**) { sf::Image atlas; timeIt([&]() { pack(atlas, "sansation_bold.ttf", 600, 32, 4096); }, "Atlas generated in "); atlas.saveToFile("atlas.png"); sf::Image resultImage; timeIt([&]() { generateSDFFrom4ChannelsMT(resultImage, "atlas.png", "atlas.png", "atlas.png", "atlas.png", 256, 256, centeredLinearDistance(128.)); }, "SDF generated in "); resultImage.saveToFile("atlas_4.png"); return 0; }(Même temps d'exec en autorisant le compilo à générer du code SSE2 ou AVX).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Atlas generated in 0.813719 seconds. SDF generated in 2.43448 seconds.
Maintenant en changeant le code pour devenirLe temps d'exec reste le même avec du code SSE2 (logique), mais est triplé avec du code AVX (atlas : 0.8sec / SDF : 7.3sec).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 template <class Function> void timeIt(Function function, std::string const& desc) { auto startTime = std::chrono::high_resolution_clock::now(); function(); auto endTime = std::chrono::high_resolution_clock::now(); auto t = std::chrono::duration_cast<std::chrono::duration<double>>(endTime - startTime); std::cout << desc << t.count() << " seconds." << std::endl; } int main(int, char**) { sf::Image atlas; timeIt([&]() { pack(atlas, "sansation_bold.ttf", 600, 32, 4096); }, "Atlas generated in "); atlas.saveToFile("atlas.png"); sf::Image resultImage; timeIt([&]() { generateSDFFrom4ChannelsMT(resultImage, "atlas.png", "atlas.png", "atlas.png", "atlas.png", 256, 256, centeredLinearDistance(128.)); }, "SDF generated in "); resultImage.saveToFile("atlas_4.png"); // boucle d'affichage return 0; }
Comment est-ce possible que la boucle d'affichage impacte le temps de création du SDF ?
Partager