Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: DrawCall & batching  (Lu 3923 fois)

0 Membres et 1 Invité sur ce sujet

Cacophonie

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
DrawCall & batching
« le: Mai 18, 2012, 04:35:10 pm »
Salut à tous

je débute un petit projet avec SFML, et j'aimerais obtenir quelques renseignement sur cette API !

J'ai téléchargé le snapshop SFML 2.0 , l'API étant très complète j'ai pu faire évoluer mon projet rapidement. Mon programme est pas mal charger au niveau objet et il y beaucoup de chose à afficher ( > 1000 objet ).

J'utilise la classe sprite pour manipuler mes textures et les afficher, et sa marche pas trop mal mais j'ignore comment SFML gère le rendu des textures et je me demande quel est la façon la plus optimal de faire du rendu avec sfml ? est'ce que les drawcall sont batcher en amont ?

actuellement mon draw ressemble a sa :

m_Gamescreen.clear();
m_Player->Draw();

   for (list<Enemy*>::iterator it = m_ActiveEnemy.begin(); it != m_ActiveEnemy.end(); it++ )
   {
      (*it)->Draw();
   }

m_Gamescreen.display();

(m_Gamescreen ) étant une rendertexture que je dessine par la suite.

Merci de m'apporté vos lumières :)


Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : DrawCall & batching
« Réponse #1 le: Mai 18, 2012, 05:02:11 pm »
De ton côté tu ne peux rien faire de plus. Ce que tu pourrais faire c'est rassembler plusieurs entités dans un seul vertex array si celles-ci étaient statiques (typiquement, le décor) mais ça n'a pas l'air d'être ton cas.

Quelles performances as-tu ? Sont-elles insuffisantes ?
Laurent Gomila - SFML developer

Cacophonie

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Re : DrawCall & batching
« Réponse #2 le: Mai 18, 2012, 05:20:27 pm »
Bonjour Laurent

merci beaucoup pour cette réponse rapide !

Je vais préciser un peu plus mon cas : je travail sur une sorte de shmup , en gros j’envoie des grande quantités de tir ( de 50 a 300 ), et je génère des tonnes d'ennemies qui eux ne tire pas mais fonce vers le joueur, donc effectivement mes entités ne sont pas statique.

Les performances sont plutôt bonne aujourd'hui sur ma machine ( core i7 , 360gtx ), mais je vais aussi devoir gérer les collisions ( ce qui va être le deuxième gros bottleneck dans ce projet ), c'est pourquoi j'essai de voir si je peu gratter au niveau du rendu :)

 Je vois que tu est développeur de la SFML ( chapeau bas sacré boulot ! ), pourrait tu m'expliquer très brièvement comment fonctionne le dessin en dessous des fonction draw ?

Merci !

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : DrawCall & batching
« Réponse #3 le: Mai 18, 2012, 06:43:34 pm »
Chaque entité SFML a son propre vertex array OpenGL, son rendu est fait dans la fonction draw. Les changements d'états OpenGL sont optimisés (pas d'appel redondant), et les petites entités (typiquement les sprites) sont pré-transformés sur le CPU pour éviter de changer trop souvent la matrice de model-view.
Laurent Gomila - SFML developer

Cacophonie

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Re : DrawCall & batching
« Réponse #4 le: Mai 19, 2012, 04:15:06 pm »
Merci pour toute ces explications !

Après avoir fait quelques tests , j'ai réaliser que le draw des mes sprites avait un gros impact sur le FPS :

avec de petit sprite (50x50) aucun problème, je peu en afficher 100,200 ect sans avoir de problème de perf,
par contre c'est lorsque j'utilise un spritesheet plus gros ( 200x400) que j'ai des soucis ( même si je ne dessine que la case qui correspond a mon animation en utilisant setTextureRect() ), et la le FPS chutte Énormément.

J'ai fait un tout petit programme de test, je charge une petite texture (50x50) et crée 100 sprites avec cette texture , la pas de soucis on est au dessus des 400fps, je remplace juste la texture par une plus grosse ( 200x400) et relance le programme , et la on tombe en dessous des 30 fps

Pourrait tu m’éclairer sur ce point ?

merci !

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : DrawCall & batching
« Réponse #5 le: Mai 19, 2012, 06:18:50 pm »
Aucune idée, c'est visiblement un détail tordu de l'implémentation de ton driver graphique.
Laurent Gomila - SFML developer

Cacophonie

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Re : DrawCall & batching
« Réponse #6 le: Mai 19, 2012, 06:22:41 pm »
Je viens de trouver une piste :

dans mon projet de test en général je n'avais qu'un seul objet texture, et X objet sprites, j'ai tenter de créer autant d'objet texture que de sprite, et la j'ai pu constater une grosse amélioration au niveau du fps.

Je ne sais pas exactement a quoi cela et du,  peut être que je n'utilise pas ces fonction de la bonne manière ? :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : DrawCall & batching
« Réponse #7 le: Mai 19, 2012, 06:39:23 pm »
Franchement, les résultats que tu constates n'ont ni queue ni tête.

Essaye de poster un petit code complet minimal qui nous permettrait de tester ça chez nous.
Laurent Gomila - SFML developer

Cacophonie

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Re : DrawCall & batching
« Réponse #8 le: Mai 19, 2012, 07:04:48 pm »
voici un code minimal qui permet de constater tout ça :

il te faut deux ressources differente : BigTex ( la grande texture de 200x400 ) et SmallTex ( la texture de 50x50 ) , lorsque je charge BigTex j'observe une grosse baisse des fps, lorsque je charge SmallTex aucun souci de perf.

#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include "windows.h"
#include <SFML/Graphics.hpp>

#define OBJ_NUM 100

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

        /*************************************************************/
        //Startup console for debug purpose
        ......................................................
        /*************************************************************/

        // Create the main window
        sf::RenderWindow window(sf::VideoMode(1280, 720, 32), "Avalanche", sf::Style::Close, sf::ContextSettings(32, 8, 16, 3, 3));

        //Initialisation of app components
        sf::Clock clock;

        sf::Texture tex;
        tex.loadFromFile("Data/BigTex.png");
        tex.setSmooth( true );

        sf::Sprite* sp[OBJ_NUM];
        for( int i = 0; i < OBJ_NUM ; i++ )
        {
                sp[i] = new sf::Sprite( tex );
                sp[i]->setPosition( rand() % 1280, rand() % 720 );
                sp[i]->setTextureRect( sf::Rect<int>(0,0,30,50) );
        }


        float lastTime = 0;
        float fps = 0;
        // MainLoop
        while (window.isOpen())
        {
                sf::Event event;
                while (window.pollEvent(event))
                {
                        if (event.type == sf::Event::Closed)
                                window.close();
                }

                //Update Entities
                float elapsed = clock.restart().asSeconds();
       
                //ProcessDraw
                window.clear( sf::Color(68,68,68) );

                for( int i = 0; i < OBJ_NUM ; i++ )
                {
                        window.draw( *sp[i] );
                }

                // Update the window
                window.display();

                lastTime += elapsed;
                fps++;

                if( lastTime >= 1.0 )
                {
                        printf( "%3.5f \n",fps );
                        lastTime = 0;
                        fps = 0;
                }
        }

        for( int i = 0; i < OBJ_NUM ; i++ )
        {
                delete sp[i];
        }

        return EXIT_SUCCESS;
}
« Modifié: Mai 19, 2012, 07:48:29 pm par Laurent »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : DrawCall & batching
« Réponse #9 le: Mai 19, 2012, 07:57:30 pm »
Chez moi le résultat est le même quelque soit la taille de la texture.

Quelle est ta carte graphique ? As-tu mis à jour tes drivers ?
Laurent Gomila - SFML developer

Cacophonie

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Re : DrawCall & batching
« Réponse #10 le: Mai 20, 2012, 12:54:15 pm »
Ok je vais essayer de tester ce petit programme sur d'autre machine pour voir

ma cg c'est une Nvidia GeForce GTX 460M version des driver nvidia : 296.10 , j'ai verifier ce sont bien les derniers en date.

EDIT : je viens de m'apercevoir que je ne rencontre ce problème que en debug ! pas de problème en release, j'ai bien le même résultat quelque soit la taille de la texture .
« Modifié: Mai 20, 2012, 12:58:32 pm par Cacophonie »