From 516bd313a4fa6f916e12d28ec7f8f637205fe9ec Mon Sep 17 00:00:00 2001 From: vittorioromeo Date: Sat, 14 Sep 2024 03:25:45 +0200 Subject: [PATCH] Comparison benchmark --- .gitignore | 1 + examples/opengl/OpenGL.cpp | 496 ++++++++------------- examples/opengl/resources/elephant.png | Bin 0 -> 5393 bytes examples/opengl/resources/giraffe.png | Bin 0 -> 5667 bytes examples/opengl/resources/monkey.png | Bin 0 -> 4911 bytes examples/opengl/resources/mouldycheese.ttf | Bin 0 -> 112116 bytes examples/opengl/resources/pig.png | Bin 0 -> 3868 bytes examples/opengl/resources/rabbit.png | Bin 0 -> 5147 bytes examples/opengl/resources/snake.png | Bin 0 -> 4488 bytes 9 files changed, 197 insertions(+), 300 deletions(-) create mode 100644 examples/opengl/resources/elephant.png create mode 100644 examples/opengl/resources/giraffe.png create mode 100644 examples/opengl/resources/monkey.png create mode 100644 examples/opengl/resources/mouldycheese.ttf create mode 100644 examples/opengl/resources/pig.png create mode 100644 examples/opengl/resources/rabbit.png create mode 100644 examples/opengl/resources/snake.png diff --git a/.gitignore b/.gitignore index d5c236a7c..3a8b7dfcc 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ build/ cmake-build-*/ CMakeUserPresets.json +build*/ diff --git a/examples/opengl/OpenGL.cpp b/examples/opengl/OpenGL.cpp index 6d7f77332..4933f8527 100644 --- a/examples/opengl/OpenGL.cpp +++ b/examples/opengl/OpenGL.cpp @@ -1,339 +1,235 @@ -//////////////////////////////////////////////////////////// -// Headers -//////////////////////////////////////////////////////////// -#include +#include "SFML/Graphics/Font.hpp" +#include "SFML/Graphics/Image.hpp" +#include "SFML/Graphics/RenderStates.hpp" +#include "SFML/Graphics/RenderTexture.hpp" +#include "SFML/Graphics/RenderWindow.hpp" +#include "SFML/Graphics/Sprite.hpp" +#include "SFML/Graphics/Text.hpp" +#include "SFML/Graphics/Texture.hpp" +#include "SFML/System/Clock.hpp" +#include "SFML/System/Vector2.hpp" +#include "SFML/Window/Event.hpp" +#include "SFML/Window/VideoMode.hpp" -#include -#include -#include +#include +#include +#include -#include +#include -#define GLAD_GL_IMPLEMENTATION -#include -#ifdef SFML_SYSTEM_IOS -#include -#endif - -#ifndef GL_SRGB8_ALPHA8 -#define GL_SRGB8_ALPHA8 0x8C43 -#endif - -std::filesystem::path resourcesDir() +float getRndFloat(float min, float max) { -#ifdef SFML_SYSTEM_IOS - return ""; -#else - return "resources"; -#endif + static std::mt19937 rng(std::random_device{}()); + return std::uniform_real_distribution{min, max}(rng); } -//////////////////////////////////////////////////////////// -/// Entry point of application -/// -/// \return Application exit code -/// -//////////////////////////////////////////////////////////// int main() { - bool exit = false; - bool sRgb = false; - while (!exit) + // + // + // Set up window + constexpr sf::Vector2f windowSize{1024.f, 768.f}; + + sf::RenderWindow window(sf::VideoMode{{1024u, 768u}}, "upstream batching"); + + window.setVerticalSyncEnabled(true); + + // + // + // Load fonts + const sf::Font fontTuffy("resources/tuffy.ttf"); + const sf::Font fontMouldyCheese("resources/mouldycheese.ttf"); + + // + // + // Load images + const sf::Image imgElephant("resources/elephant.png"); + const sf::Image imgGiraffe("resources/giraffe.png"); + const sf::Image imgMonkey("resources/monkey.png"); + const sf::Image imgPig("resources/pig.png"); + const sf::Image imgRabbit("resources/rabbit.png"); + const sf::Image imgSnake("resources/snake.png"); + + // + // + // Texture array + const sf::Texture spriteTextures[]{sf::Texture(imgElephant), + sf::Texture(imgGiraffe), + sf::Texture(imgMonkey), + sf::Texture(imgPig), + sf::Texture(imgRabbit), + sf::Texture(imgSnake)}; + + // + // + // Simulation stuff + constexpr const char* names[]{"Elephant", "Giraffe", "Monkey", "Pig", "Rabbit", "Snake"}; + + struct Entity { - // Request a 24-bits depth buffer when creating the window - sf::ContextSettings contextSettings; - contextSettings.depthBits = 24; - contextSettings.sRgbCapable = sRgb; + sf::Text text; + sf::Sprite sprite; + sf::Vector2f velocity; + float torque{}; + }; - // Create the main window - sf::RenderWindow window(sf::VideoMode({800, 600}), - "SFML graphics with OpenGL", - sf::Style::Default, - sf::State::Windowed, - contextSettings); - window.setVerticalSyncEnabled(true); - window.setMinimumSize(sf::Vector2u(400, 300)); - window.setMaximumSize(sf::Vector2u(1200, 900)); + std::vector entities; - // Create a sprite for the background - const sf::Texture backgroundTexture(resourcesDir() / "background.jpg", sRgb); - const sf::Sprite background(backgroundTexture); - - // Create some text to draw on top of our OpenGL object - const sf::Font font(resourcesDir() / "tuffy.ttf"); - - sf::Text text(font, "SFML / OpenGL demo"); - sf::Text sRgbInstructions(font, "Press space to toggle sRGB conversion"); - sf::Text mipmapInstructions(font, "Press return to toggle mipmapping"); - text.setFillColor(sf::Color(255, 255, 255, 170)); - sRgbInstructions.setFillColor(sf::Color(255, 255, 255, 170)); - mipmapInstructions.setFillColor(sf::Color(255, 255, 255, 170)); - text.setPosition({280.f, 450.f}); - sRgbInstructions.setPosition({175.f, 500.f}); - mipmapInstructions.setPosition({200.f, 550.f}); - - // Load a texture to apply to our 3D cube - sf::Texture texture(resourcesDir() / "logo.png"); - - // Attempt to generate a mipmap for our cube texture - // We don't check the return value here since - // mipmapping is purely optional in this example - (void)texture.generateMipmap(); - - // Make the window the active window for OpenGL calls - if (!window.setActive(true)) + const auto populateEntities = [&](const std::size_t n) + { + if (n < entities.size()) { - std::cerr << "Failed to set window to active" << std::endl; - return EXIT_FAILURE; + entities.erase(entities.begin() + static_cast(n), entities.end()); + return; } - // Load OpenGL or OpenGL ES entry points using glad -#ifdef SFML_OPENGL_ES - gladLoadGLES1(sf::Context::getFunction); -#else - gladLoadGL(sf::Context::getFunction); -#endif + entities.clear(); + entities.reserve(n); - // Enable Z-buffer read and write - glEnable(GL_DEPTH_TEST); - glDepthMask(GL_TRUE); -#ifdef SFML_OPENGL_ES - glClearDepthf(1.f); -#else - glClearDepth(1.f); -#endif - - // Disable lighting - glDisable(GL_LIGHTING); - - // Configure the viewport (the same size as the window) - glViewport(0, 0, static_cast(window.getSize().x), static_cast(window.getSize().y)); - - // Setup a perspective projection - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - const GLfloat ratio = static_cast(window.getSize().x) / static_cast(window.getSize().y); -#ifdef SFML_OPENGL_ES - glFrustumf(-ratio, ratio, -1.f, 1.f, 1.f, 500.f); -#else - glFrustum(-ratio, ratio, -1.f, 1.f, 1.f, 500.f); -#endif - - // Bind the texture - glEnable(GL_TEXTURE_2D); - sf::Texture::bind(&texture); - - // Define a 3D cube (6 faces made of 2 triangles composed by 3 vertices) - // clang-format off - constexpr std::array cube = + for (std::size_t i = 0u; i < n; ++i) { - // positions // texture coordinates - -20, -20, -20, 0, 0, - -20, 20, -20, 1, 0, - -20, -20, 20, 0, 1, - -20, -20, 20, 0, 1, - -20, 20, -20, 1, 0, - -20, 20, 20, 1, 1, + const std::size_t type = i % 6u; + const sf::Texture& texture = spriteTextures[type]; - 20, -20, -20, 0, 0, - 20, 20, -20, 1, 0, - 20, -20, 20, 0, 1, - 20, -20, 20, 0, 1, - 20, 20, -20, 1, 0, - 20, 20, 20, 1, 1, + const auto label = std::string{names[i % 6u]} + " #" + std::to_string((i / (type + 1)) + 1); - -20, -20, -20, 0, 0, - 20, -20, -20, 1, 0, - -20, -20, 20, 0, 1, - -20, -20, 20, 0, 1, - 20, -20, -20, 1, 0, - 20, -20, 20, 1, 1, + entities.push_back({sf::Text{i % 2u == 0u ? fontTuffy : fontMouldyCheese, label}, + sf::Sprite{texture}, + sf::Vector2f{getRndFloat(-2.5f, 2.5f), getRndFloat(-2.5f, 2.5f)}, + getRndFloat(-0.05f, 0.05f)}); - -20, 20, -20, 0, 0, - 20, 20, -20, 1, 0, - -20, 20, 20, 0, 1, - -20, 20, 20, 0, 1, - 20, 20, -20, 1, 0, - 20, 20, 20, 1, 1, + auto& [text, sprite, velocity, torque] = entities.back(); - -20, -20, -20, 0, 0, - 20, -20, -20, 1, 0, - -20, 20, -20, 0, 1, - -20, 20, -20, 0, 1, - 20, -20, -20, 1, 0, - 20, 20, -20, 1, 1, + sprite.setOrigin(sf::Vector2f(texture.getSize()) / 2.f); + sprite.setRotation(sf::degrees(getRndFloat(0.f, 360.f))); - -20, -20, 20, 0, 0, - 20, -20, 20, 1, 0, - -20, 20, 20, 0, 1, - -20, 20, 20, 0, 1, - 20, -20, 20, 1, 0, - 20, 20, 20, 1, 1 - }; - // clang-format on + const float scaleFactor = getRndFloat(0.08f, 0.17f); + sprite.setScale({scaleFactor, scaleFactor}); + text.setScale({scaleFactor * 3.5f, scaleFactor * 3.5f}); - // Enable position and texture coordinates vertex components - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glVertexPointer(3, GL_FLOAT, 5 * sizeof(GLfloat), cube.data()); - glTexCoordPointer(2, GL_FLOAT, 5 * sizeof(GLfloat), cube.data() + 3); + sprite.setPosition({getRndFloat(0.f, windowSize.x), getRndFloat(0.f, windowSize.y)}); - // Disable normal and color vertex components - glDisableClientState(GL_NORMAL_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); + text.setFillColor(sf::Color::Black); + text.setOutlineColor(sf::Color::White); + text.setOutlineThickness(5.f); - // Make the window no longer the active window for OpenGL calls - if (!window.setActive(false)) + text.setOrigin(text.getLocalBounds().size / 2.f); + } + }; + + // + // + // Set up UI elements + bool drawSprites = true; + bool drawText = true; + int numEntities = 10000; + + // + // + // Set up clock and time sampling stuff + sf::Clock clock; + sf::Clock fpsClock; + + std::vector samplesUpdateMs{}; + std::vector samplesDrawMs{}; + std::vector samplesFPS{}; + + const auto recordUs = [&](std::vector& target, const float value) + { + target.push_back(value); + + if (target.size() > 32u) + target.erase(target.begin()); + }; + + const auto getAverage = [&](const std::vector& target) + { + double accumulator = 0.0; + + for (auto value : target) + accumulator += static_cast(value); + + return accumulator / static_cast(target.size()); + }; + + // + // + // Set up initial simulation state + populateEntities(static_cast(numEntities)); + + // + // + // Simulation loop + while (true) + { + fpsClock.restart(); + + //////////////////////////////////////////////////////////// + // Event handling + //////////////////////////////////////////////////////////// + while (auto event = window.pollEvent()) { - std::cerr << "Failed to set window to inactive" << std::endl; - return EXIT_FAILURE; + if (event->is() || + (event->is() && + event->getIf()->code == sf::Keyboard::Key::Escape)) + { + window.close(); + break; + } } - // Create a clock for measuring the time elapsed - const sf::Clock clock; - - // Flag to track whether mipmapping is currently enabled - bool mipmapEnabled = true; - - // Start game loop - while (window.isOpen()) + //////////////////////////////////////////////////////////// + // Update step + //////////////////////////////////////////////////////////// { - // Process events - while (const std::optional event = window.pollEvent()) + clock.restart(); + + for (auto& [text, sprite, velocity, torque] : entities) { - // Window closed or escape key pressed: exit - if (event->is() || - (event->is() && - event->getIf()->code == sf::Keyboard::Key::Escape)) - { - exit = true; - window.close(); - } + sprite.move(velocity); + sprite.rotate(sf::radians(torque)); - // Return key: toggle mipmapping - if (const auto* keyPressed = event->getIf(); - keyPressed && keyPressed->code == sf::Keyboard::Key::Enter) - { - if (mipmapEnabled) - { - // We simply reload the texture to disable mipmapping - texture = sf::Texture(resourcesDir() / "logo.png"); + if ((sprite.getPosition().x > windowSize.x && velocity.x > 0.f) || + (sprite.getPosition().x < 0.f && velocity.x < 0.f)) + velocity.x = -velocity.x; - // Rebind the texture - sf::Texture::bind(&texture); + if ((sprite.getPosition().y > windowSize.y && velocity.y > 0.f) || + (sprite.getPosition().y < 0.f && velocity.y < 0.f)) + velocity.y = -velocity.y; - mipmapEnabled = false; - } - else if (texture.generateMipmap()) - { - mipmapEnabled = true; - } - } - - // Space key: toggle sRGB conversion - if (const auto* keyPressed = event->getIf(); - keyPressed && keyPressed->code == sf::Keyboard::Key::Space) - { - sRgb = !sRgb; - window.close(); - } - - // Adjust the viewport when the window is resized - if (const auto* resized = event->getIf()) - { - const sf::Vector2u textureSize = backgroundTexture.getSize(); - - // Make the window the active window for OpenGL calls - if (!window.setActive(true)) - { - std::cerr << "Failed to set window to active" << std::endl; - return EXIT_FAILURE; - } - - const auto [width, height] = resized->size; - glViewport(0, 0, static_cast(width), static_cast(height)); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - const GLfloat newRatio = static_cast(width) / static_cast(height); -#ifdef SFML_OPENGL_ES - glFrustumf(-newRatio, newRatio, -1.f, 1.f, 1.f, 500.f); -#else - glFrustum(-newRatio, newRatio, -1.f, 1.f, 1.f, 500.f); -#endif - - // Make the window no longer the active window for OpenGL calls - if (!window.setActive(false)) - { - std::cerr << "Failed to set window to inactive" << std::endl; - return EXIT_FAILURE; - } - - sf::View view; - view.setSize(sf::Vector2f(textureSize)); - view.setCenter(sf::Vector2f(textureSize) / 2.f); - window.setView(view); - } + text.setPosition(sprite.getPosition() - sf::Vector2f{0.f, 250.f * sprite.getScale().x}); } - // Draw the background - window.pushGLStates(); - window.draw(background); - window.popGLStates(); - - // Make the window the active window for OpenGL calls - if (!window.setActive(true)) - { - // On failure, try re-creating the window, as it is intentionally - // closed when changing color space. - continue; - } - - // Clear the depth buffer - glClear(GL_DEPTH_BUFFER_BIT); - - // We get the position of the mouse cursor (or touch), so that we can move the box accordingly - sf::Vector2i pos; - -#ifdef SFML_SYSTEM_IOS - pos = sf::Touch::getPosition(0); -#else - pos = sf::Mouse::getPosition(window); -#endif - - const float x = static_cast(pos.x) * 200.f / static_cast(window.getSize().x) - 100.f; - const float y = -static_cast(pos.y) * 200.f / static_cast(window.getSize().y) + 100.f; - - // Apply some transformations - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(x, y, -100.f); - glRotatef(clock.getElapsedTime().asSeconds() * 50.f, 1.f, 0.f, 0.f); - glRotatef(clock.getElapsedTime().asSeconds() * 30.f, 0.f, 1.f, 0.f); - glRotatef(clock.getElapsedTime().asSeconds() * 90.f, 0.f, 0.f, 1.f); - - // Draw the cube - glDrawArrays(GL_TRIANGLES, 0, 36); - - // Make the window no longer the active window for OpenGL calls - if (!window.setActive(false)) - { - std::cerr << "Failed to set window to inactive" << std::endl; - return EXIT_FAILURE; - } - - // Draw some text on top of our OpenGL object - window.pushGLStates(); - window.draw(text); - window.draw(sRgbInstructions); - window.draw(mipmapInstructions); - window.popGLStates(); - - // Finally, display the rendered frame on screen - window.display(); + recordUs(samplesUpdateMs, clock.getElapsedTime().asSeconds() * 1000.f); } + + //////////////////////////////////////////////////////////// + // Draw step + //////////////////////////////////////////////////////////// + { + clock.restart(); + window.clear(); + + for (const Entity& entity : entities) + { + if (drawSprites) + window.draw(entity.sprite); + + if (drawText) + window.draw(entity.text); + } + + recordUs(samplesDrawMs, clock.getElapsedTime().asSeconds() * 1000.f); + } + + window.display(); + + recordUs(samplesFPS, 1.f / fpsClock.getElapsedTime().asSeconds()); + + window.setTitle( + "FPS: " + std::to_string(getAverage(samplesFPS)) + " || U: " + std::to_string(getAverage(samplesUpdateMs)) + + " || D: " + std::to_string(getAverage(samplesDrawMs))); } - - return EXIT_SUCCESS; } diff --git a/examples/opengl/resources/elephant.png b/examples/opengl/resources/elephant.png new file mode 100644 index 0000000000000000000000000000000000000000..38da523890c8398c44152f20bfc1d204869658fb GIT binary patch literal 5393 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 literal 0 HcmV?d00001 diff --git a/examples/opengl/resources/giraffe.png b/examples/opengl/resources/giraffe.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd3a43b56e0e27361f2eef843f3aacad5a9a1bb GIT binary patch literal 5667 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 F{{be)_xS(- literal 0 HcmV?d00001 diff --git a/examples/opengl/resources/monkey.png b/examples/opengl/resources/monkey.png new file mode 100644 index 0000000000000000000000000000000000000000..fabb51dc27302985bac7c4443ed8d013c46a1fb3 GIT binary patch literal 4911 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 literal 0 HcmV?d00001 diff --git a/examples/opengl/resources/mouldycheese.ttf b/examples/opengl/resources/mouldycheese.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9c36cd07f07439a50d3073c31e245491a38dc236 GIT binary patch literal 112116 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 z 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

IRZY9KOA-XqSf9Y5x~+& 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 aSA+5+Z*PLJOFyF_+$K;~Gq_XY0sjX+(Aks# literal 0 HcmV?d00001 diff --git a/examples/opengl/resources/pig.png b/examples/opengl/resources/pig.png new file mode 100644 index 0000000000000000000000000000000000000000..45cdfa52869d2f2e6825aadee58f06467d936272 GIT binary patch literal 3868 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 IU1He(06~k9*Z=?k literal 0 HcmV?d00001 diff --git a/examples/opengl/resources/snake.png b/examples/opengl/resources/snake.png new file mode 100644 index 0000000000000000000000000000000000000000..1128925e3bb8471819632a15397c101f9b746a70 GIT binary patch literal 4488 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