Here is a test app I wrote so you can see for yourself how long it takes to load each image when you press left/right
#include <SFML/Graphics.hpp>
#include <iostream>
#include <filesystem>
namespace std {
namespace filesystem = experimental::filesystem::v1;
}
namespace fs = std::filesystem;
int main() {
// path to the folder with pngs
std::string path = "images";
// number of displayed elements, on my machine it's stuttering around 40
int elements = 40;
std::string largest = path + "/sweetl2.png"; // largest file 640x480
sf::Font font;
font.loadFromFile( "C:/Windows/Fonts/arial.ttf" );
sf::Clock clock;
int total_clock = 0;
// building a file table here
std::vector<std::string> file_table( 0 );
for ( auto & p : fs::directory_iterator( path ))
{
fs::path file{ p };
if ( file.extension().string() == ".png" )
file_table.push_back( file.string() );
}
if ( file_table.size() == 0 )
{
std::cout << " Did not find any png files" << std::endl;
std::cout << " Press enter to exit.";
std::cin.get();
return 0;
}
sf::RenderWindow window;
window.create( sf::VideoMode::getDesktopMode(), "Borderless Fullscreen", sf::Style::None );
window.setVerticalSyncEnabled( true );
window.setMouseCursorVisible( false );
window.setKeyRepeatEnabled( true );
sf::Vector2u size = window.getSize();
sf::RectangleShape bar( sf::Vector2f( 32, size.y ));
bar.setFillColor( sf::Color( 255, 255, 255, 200 ));
sf::Vector2f bar_pos = sf::Vector2f( 0, 0 );
std::vector<sf::Sprite> sprite_array( elements );
std::vector<sf::Texture> texture_array( elements );
std::vector<sf::Text> text_array( elements );
sf::Text total;
total.setPosition( 0.0, size.y / elements );
total.setOrigin( 0.0, -100.0 );
total.setFont( font );
int offset = 0;
for ( int i = 0; i < elements; i++ )
{
sf::Texture texture;
texture_array[i].loadFromFile( largest );
sprite_array[i].setTexture( texture_array[i] );
auto texture_size = sprite_array[i].getTexture()->getSize();
sprite_array[i].setScale( float( size.x ) / texture_size.x, float( size.y ) / texture_size.y );
sprite_array[i].setPosition( size.x / elements * i, 0.0 );
}
for ( int i = 0; i < elements; i++ )
{
text_array[i].setFont( font );
text_array[i].setCharacterSize( 20 );
text_array[i].setOrigin( 0.0, -50.0 );
text_array[i].setPosition( size.x / elements * i, size.y / elements );
}
bool reload = true;
while ( window.isOpen() ) {
sf::Event event;
while ( window.pollEvent( event ))
{
if (( event.type == sf::Event::Closed )
|| ( event.key.code == sf::Keyboard::Escape )) window.close();
else if ( event.type == sf::Event::KeyPressed )
{
if ( event.key.code == sf::Keyboard::Left )
{
reload = true;
offset--;
}
else if ( event.key.code == sf::Keyboard::Right )
{
reload = true;
offset++;
}
}
}
if ( reload )
{
reload = false;
total_clock = 0;
for ( int i = 0; i < elements; i++ )
{
clock.restart();
// first method 16-32ms lag on first image, bar is stuttering
// when pressing left/right
texture_array[i].loadFromFile( file_table[(i + offset) % (file_table.size() - 1)] );
// second method 16ms lag on first image, bar is stuttering very rarely,
// sprite textures are not scaling to the sprite size
// sf::Image image;
// image.loadFromFile( file_table[( i + offset ) % ( file_table.size() - 1 )] );
// texture_array[i].update( image );
text_array[i].setString( std::to_string( clock.getElapsedTime().asMilliseconds() ));
total_clock += clock.getElapsedTime().asMilliseconds();
sprite_array[i].setTexture( texture_array[i], true );
auto texture_size = sprite_array[i].getTexture()->getSize();
sprite_array[i].setScale( float( size.x ) / texture_size.x / elements, float( size.y ) / texture_size.y / elements );
}
}
window.clear();
for ( auto & s : sprite_array ) window.draw( s );
bar_pos.x += 4;
if ( bar_pos.x > size.x - 32 ) bar_pos.x = 0;
bar.setPosition( bar_pos );
window.draw( bar );
for ( auto & t : text_array ) window.draw( t );
total.setString( "Total: " + std::to_string( total_clock ) + "ms" );
window.draw( total );
window.display();
}
return 0;
}
Compiled in VS2015 with SFML 2.5.0
And a zip file with a batch of random images from the ones I use:
https://mega.nz/#!68NWkQ4A!7iSUTrud3C8AAvTg5ajzvMJoQIiPmeHCUx9Yix9jm3k