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 ?
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/
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/
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.
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 :
comme ça, plus de soucis
Code : Sélectionner tout - Visualiser dans une fenêtre à part if(SDL_MUSTLOCK(Surface))
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.
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.
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.
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 :Envoyé par JC_Master
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) ...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)Envoyé par JC_Master
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.Envoyé par JC_Master
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.
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.
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.Envoyé par JC_Master
Toutes ces réponses sont sûrement dans la doc donc essaie de chercher un peu plus la prochaine fois .
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager