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

Auteur Sujet: SFML, Threads C++11, et LLVM  (Lu 3186 fois)

0 Membres et 1 Invité sur ce sujet

MyPix

  • Full Member
  • ***
  • Messages: 117
    • Voir le profil
    • E-mail
SFML, Threads C++11, et LLVM
« le: Février 13, 2014, 09:39:27 pm »
Bonjour,
CE SUJET FAIT SUITE A MON SUJET SUR LES THREADS DE SFML, J'AI DECIDE D'UTILISER CEUX DE C++11

Bref, voici mon problème :
http://prntscr.com/2s71js

Je ne sais pas d'ou vient cette erreur... :/

//
//  CGameStart.h
//  SFML Gamestates
//
//  Created by Pierre van Houtryve on 6/02/14.
//  Copyright (c) 2014 Pierre van Houtryve. All rights reserved.
//

#ifndef __SFML_Gamestates__CGameStart__
#define __SFML_Gamestates__CGameStart__

#include <iostream>
#include "/Users/pierre/Documents/Mako GUI/Tests/SFML Gamestates/tMap.h"
#include "SFML/Graphics.hpp"
#include "gameengine.h"
#include "gamestate.h"
#include "ResourcePath.hpp"
#include <thread>
class CLoad : public CGameState {
   
public:
    void Init();
    void Cleanup();
   
    void Pause();
    void Resume();
   
   
    void HandleEvents(CGameEngine* game);
    void Update(CGameEngine* game);
    void Draw(CGameEngine* game);








private:
   
    sf::Sprite ld_bar;
    sf::Clock clock;
    sf::Time tm;
    sf::Event Event;
    sf::Vector2u v2u;
    int m = 0;
    sf::Text text;
    bool first = false;
    std::thread *loadRsc;

 
};



#endif /* defined(__SFML_Gamestates__CGameStart__) */
 


.cpp

//
//  loading.cpp
//  Game
//
//  Created by Pierre van Houtryve on 9/02/14.
//  Copyright (c) 2014 Pierre van Houtryve. All rights reserved.
//

#include "loading.h"
#include <stdio.h>
#include "ResourcePath.hpp"
#include "SFML/System.hpp"
#include <thread>

 /*
 sf::Texture ld_bar_txt;
 sf::Sprite ld_bar;
 sf::Clock clock;
 sf::Time tm;
 */

int rtr_val=404;
CLoad val;
//CLoad object;
sf::Texture ld_bar_txt;
sf::Font font;
void loadFiles (int &rtr)
{
    if(ld_bar_txt.loadFromFile(resourcePath()+"LC_LOAD.png") || font.loadFromFile(resourcePath() + "mini_pixel-7.ttf"))
    {
        rtr = 1;
        cout << "Game ressources succesfully loaded !" << endl;
       
    }
    else
    {
        rtr = -1;
        cout << " An error occured " << endl;
    }

}

void CLoad::Init()
{
        ld_bar_txt.setSmooth(1);
        ld_bar.setTextureRect(sf::IntRect(102,102,102,102));
        text.setFont(font);
        text.setCharacterSize(35);
        ld_bar.setTexture(ld_bar_txt);
    loadRsc = new std::thread(&loadFiles,rtr_val);

    clock.restart();;

}
void CLoad::Cleanup()
{
}
void CLoad::Pause()
{
   
}
void CLoad::Resume()
{
   
}

void CLoad::HandleEvents(CGameEngine* game)
{
    while(game->screen->pollEvent(Event))
    {
        if(Event.type == sf::Event::Closed)
        {
            game->screen->close();
            this->Cleanup();
            game->Quit();
            exit(0);
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
        {
            game->screen->close();
            this->Cleanup();
            game->Quit();
            exit(0);
        }
    }

}
void CLoad::Update(CGameEngine* game)
{
    if(!first)
    {
        first=true;
        if(loadRsc->joinable())
            loadRsc->join();
        cout << "Thread launch" << endl;
    }
    if(rtr_val== 404)
    {
        cout << "0";
        // Je ne fais rien car ma fonction n'as pas encore renvoyée son résultat
    }
    else if(rtr_val==-1)
    {
        // Résultat négatif
        cout << "Cannot load ressources " << endl;
        exit(-1);
    }
    else if (rtr_val==1)
    {
        cout << "Finished" << endl;
        // ici j'aurais mis mon change gamestate, etc...
    }
    text.setString(L"Game is loading...");
    text.setColor(sf::Color::White);
    v2u = game->screen->getSize();
    ld_bar.setPosition((v2u.x/2)-75,(v2u.y/2)-75);
    text.setPosition((v2u.x/2)-105,(v2u.y/2)-155);
    if(m<=7)
        m++;
    else if(m>7)
        m=0;

    tm = clock.getElapsedTime();
    if(tm.asMilliseconds()>1)
    {
        ld_bar.setTextureRect(sf::IntRect(m*102,0,102,102));
        clock.restart();
    }
}
void CLoad::Draw(CGameEngine* game)
{
    if (rtr_val==1)
{
    ld_bar.setTextureRect(sf::IntRect(1,1,102,816));
    game->screen->draw(ld_bar);
    cout << "2";
}
    else
{
    game->screen->draw(ld_bar);
    game->screen->draw(text);
    cout << "1";
}
    game->screen->display();
    game->screen->clear();
}



Celui qui résous mon problème, je lui fait des bisous partout <3
**Le code source complet est en piece jointe**

Bref, j'ai essayé tout ces derniers jour, j'ai bossé au moins 10H pour tenter de résoudre ces bugs...
Si quelqu'un à une autre solution pour un chargement des ressources multi-threadé, je suis preneur !

Merci.

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : SFML, Threads C++11, et LLVM
« Réponse #1 le: Février 13, 2014, 10:22:29 pm »
Perso je connais pas tout ça mais essaie
loadRsc = new std::thread(&loadFiles, std::ref(rtr_val));
Si toi non plus tu connais pas tout ça tu devrais te documenter et essayer de comprendre ça à part avant de tout balancer dans ton gros projet.

MyPix

  • Full Member
  • ***
  • Messages: 117
    • Voir le profil
    • E-mail
Re : SFML, Threads C++11, et LLVM
« Réponse #2 le: Février 14, 2014, 07:36:49 am »
Je t'aime ! Ça marche !

MyPix

  • Full Member
  • ***
  • Messages: 117
    • Voir le profil
    • E-mail
Re : SFML, Threads C++11, et LLVM
« Réponse #3 le: Février 14, 2014, 07:42:26 am »
Et derniere question,

des variables globales pour mes Textures & Images, bonne idée ou pas ? Car dans ma classe Loading j'en aurais besoin... à moins de lier en amitié toutes les classes autres ayant besoin des sprites ? (Car mon programme va charger TOUT les sprites du jeu la premiere fois, pour accélérer le reste)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : SFML, Threads C++11, et LLVM
« Réponse #4 le: Février 14, 2014, 08:00:06 am »
Les variables globales c'est toujours une mauvaise idée. Mais ça tu l'apprendras avec le temps et l'expérience, pour l'instant fais ce qui te semble intuitif.
Laurent Gomila - SFML developer

MyPix

  • Full Member
  • ***
  • Messages: 117
    • Voir le profil
    • E-mail
Re : SFML, Threads C++11, et LLVM
« Réponse #5 le: Février 14, 2014, 03:38:03 pm »
D'acc, maintenant j'ai la structure globale de mon projet mise en place :
- Pattern gamestate
- Chargements multi-threadé.

Juste une question, si, dans mon jeu, il y a énormément d'opérations à effectuer avant d'afficher l'image, je fais quoi ?
Je multi-threade les choses à faire ou je lock le framerate à 60 ?

Lo-X

  • Hero Member
  • *****
  • Messages: 618
    • Voir le profil
    • My personal website, with CV, portfolio and projects
Re : Re : SFML, Threads C++11, et LLVM
« Réponse #6 le: Février 14, 2014, 04:15:34 pm »
Juste une question, si, dans mon jeu, il y a énormément d'opérations à effectuer avant d'afficher l'image, je fais quoi ?
Je multi-threade les choses à faire ou je lock le framerate à 60 ?

A ta place j'irai du coté du framerate. Les threads sont compliqués et normalement non-nécessaires.

Si tu n'es pas allergique à l'anglais, je te conseille cet article http://gafferongames.com/game-physics/fix-your-timestep/ ou tout autre concernant le même sujet.

Pour résumer, tu fais en sorte de faire ta logique 60 fois par secondes, le reste du temps tu affiches à l'écran tes sprites. Ce qui permet, avec la technique qu'ils donnent, que quand ton PC a un coup de rame, de quand même effectuer toutes les opérations de logique par steps de 1/60e de seconde mais de ne pas forcément re-dessiner à l'écran au même débit. C'est ce qui arrive parfois dans d'autres jeux, quand tu as l'impression que tout à freeze pendant un très court temps.

MyPix

  • Full Member
  • ***
  • Messages: 117
    • Voir le profil
    • E-mail
Re : SFML, Threads C++11, et LLVM
« Réponse #7 le: Février 14, 2014, 05:05:38 pm »
Juste bloquer la framerate à 60 avec la SFML c'est bon non ?

Lo-X

  • Hero Member
  • *****
  • Messages: 618
    • Voir le profil
    • My personal website, with CV, portfolio and projects
Re : Re : SFML, Threads C++11, et LLVM
« Réponse #8 le: Février 14, 2014, 07:02:26 pm »
Juste bloquer la framerate à 60 avec la SFML c'est bon non ?

non c'est différent, le faire avec SFML c'est certes faire la logique 60 fois par secondes, mais aussi l'affichage. L'autre technique c'est de faire de l'affichage aussi souvent que possible. Et puis si ça rame, le setFrameLimit rattrape pas les frames "perdues"

 

anything