IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Blocage des surfaces


Sujet :

SDL

  1. #1
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut Blocage des surfaces
    Voila, lorsqu'on initialise l'écran avec SDL_HWSURFACE, je crois que si on veut gratter directement au pixel, il faut bloquer la surface avec SDL_Lock (ou un truc comme ca). Si ceci est vrai, faut-il aussi le faire pour blitter ?
    Mes sites :
    - Portail : http://www.azharis.fr/
    - Neuroshima Hex : http://neuroshima-hex.azharis.fr/
    - Monolith Arena : http://monolith-arena.azharis.fr/

  2. #2
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Citation Envoyé par La doc SDL
    The blit function should not be called on a locked surface.
    Donc non, au contraire elle ne doit pas être bloquée.
    Fiquet
    - FAQ SDL
    - FAQ C++

  3. #3
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut
    Il faut alors uniquement bloquer la surface quand on fait des GetPixel et des SetPixel ?
    Mes sites :
    - Portail : http://www.azharis.fr/
    - Neuroshima Hex : http://neuroshima-hex.azharis.fr/
    - Monolith Arena : http://monolith-arena.azharis.fr/

  4. #4
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    A priori oui, ou quand tu modifie directement les données dans la structure des pixels.
    Fiquet
    - FAQ SDL
    - FAQ C++

  5. #5
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Que se passe t'il si on bloque une surface non HW ?
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  6. #6
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Je pense en tout cas que la fonction retourne -1 car il n'y a rien à verrouiller, par contre je ne sais pas si ça va complètement planter. Tu as essayé ?

    En fait, normalement il faudrait tester toutes les surfaces que l'on veut locker avec la macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(SDL_MUSTLOCK(Surface))
    comme ça, plus de soucis
    Fiquet
    - FAQ SDL
    - FAQ C++

  7. #7
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Merci. Sinon, c'est couteur en performance de locker une surface? (Non parce que si sa ne l'est pas je rajoute le lock dans ma fonction setpixel)
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  8. #8
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Pour répondre à ta question : oui. Il est plus rapide d'accéder aux pixels si on est en mémoire système (logique d'un côté). Cependant on perd aussi toutes les optimisations côté blitting, tout ce que la carte peut faire, car l'accès est plus difficile.

    D'une manière générale, si l'on peut on crée les surfaces en mémoire vidéo. Donc celle-ci implique de bloquer les surfaces.
    Fiquet
    - FAQ SDL
    - FAQ C++

  9. #9
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Ce que je voulais dire, c'est qu'il vaut mieu :
    Blocker
    SetPixel
    Debloquer
    Blocker
    SetPixel
    Debloquer
    Ect? Je pensse qu'il vaut mieu eviter sa.
    Sinon, que se passe t'il si je bloque une surface déja loquer?(Ou il faut encore une macro?) Et si on peut savoir si une surface est bloquer ou pas, on peut alors modifier SetPixel pour qu'elle bloque la surface si elle n'est pas déja bloquer, et quelle a besoin d'être bloquer. Libre choix a l'utilisateur de près-bloquer la surface ou de laisser faire la fonction.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  10. #10
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Citation Envoyé par JC_Master
    Ce que je voulais dire, c'est qu'il vaut mieu :
    Blocker
    SetPixel
    [...]
    Non c'est clair que si tu modifies plusieurs pixels à la suite tu ne vas pas bloquer 2 fois la surface, SDL bloque les surfaces donc tu le fais une fois par surface, en gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
    if(SDL_MUSTLOCK(Surface) )
        SDL_LockSurface(Surface);
     
    // Tes opérations sur les pixel (même si plusieurs)
     
    if(SDL_MUSTLOCK(Surface) )
        SDL_UnlockSurface(Surface)
    ...
    Citation Envoyé par JC_Master
    Sinon, que se passe t'il si je bloque une surface déja loquer?
    Ben normalement tu dois savoir dans ton code si tu l'as bloquée, elle DOIT l'être si il le faut à chaque opération sur les pixels (voir code)

    Citation Envoyé par JC_Master
    Et si on peut savoir si une surface est bloquer ou pas, on peut alors modifier SetPixel pour qu'elle bloque la surface si elle n'est pas déja bloquée.
    Même réponse, il faut employer le bout de code ci-dessus avant et après tes opérations dans ta fonction SetPixel(). Ca ne doit pas poser problème si l'utilisateur bloque la surface avant utilisation.
    Fiquet
    - FAQ SDL
    - FAQ C++

  11. #11
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Mais, je ne peut aps prédire si l'utilisateur de ma classe qui modifi souvent els pixels a déja bloquer la surface ou non. Esqu'il n'y a aucun moyen de savoir si c'est le cas? Et cela pose un problème si je blocke les surfaces si elles sont déja bloquer? Parce que j'ai quelques fonctions qui font d'importante modification sur els surfaces, et j'aimerais pouvoir bloquer/debloquer seulement si l'utilisateur ne la pas fait et que la surface le require.

    Edit : Et saé ne pose pas de problème de blocker deux surfaces diférentes a la fois?
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  12. #12
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    En fait, depuis un moment déjà, les appels de SDL_LockSurface() sont récursifs, ça veut dire que tu peux bloquer plusieurs fois une surface, mais tu devras la débloquer autant de fois que tu l'as bloquée. C'est pour ça que je trouve que ça devient compliquer ton problème de tester avec l'utilisateur, etc. Si vraiment tu veux t'amuser tu as un membre locked dans SDL_Surface qui indique le nombre de fois que la surface est bloquée (0 si débloquée), alors au pire tu peux tester avec ça, mais ça ne sert pas à grand chose.

    Citation Envoyé par JC_Master
    Et saé ne pose pas de problème de blocker deux surfaces diférentes a la fois?
    Je comprends pas là. En un appel c'est impossible, par contre si tu bloques 2 surfaces et qu'à la fin de tes opérations tu les débloque bien les 2, je vois pas ce qui pourrait gêner.

    Toutes ces réponses sont sûrement dans la doc donc essaie de chercher un peu plus la prochaine fois .
    Fiquet
    - FAQ SDL
    - FAQ C++

  13. #13
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Ok, merci.
    Donc, je ferais un blockage/Deblocage pour les opérations qui manipule tous les pixels des surfaces(copies ect.)
    Je ferais bien atention a les blocker et les débloquer. Merci pour toute ces informations.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Blocage des téléchargements
    Par Irimi_dev dans le forum Dépannage et Assistance
    Réponses: 7
    Dernier message: 10/07/2006, 15h22
  2. [Graphics2D] generer des surfaces
    Par ankou82 dans le forum 2D
    Réponses: 9
    Dernier message: 15/05/2006, 02h17
  3. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 11h33
  4. DirectDraw: Créer des surfaces 256 couleurs
    Par Magus (Dave) dans le forum DirectX
    Réponses: 5
    Dernier message: 14/10/2002, 23h28
  5. Taille des surfaces avec DirectDraw
    Par Shakram dans le forum DirectX
    Réponses: 5
    Dernier message: 09/09/2002, 01h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo