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:
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;
}
Qui me donne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Atlas generated in 0.813719 seconds.
SDF generated in 2.43448 seconds.
(Même temps d'exec en autorisant le compilo à générer du code SSE2 ou AVX).

Maintenant en changeant le code pour devenir
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;
}
Le 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).

Comment est-ce possible que la boucle d'affichage impacte le temps de création du SDF ?