Optimisation affichage image bitmap en dynamique

juliens81
Messages postés
26
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
6 juin 2012
- 26 juil. 2010 à 15:30
juliens81
Messages postés
26
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
6 juin 2012
- 26 juil. 2010 à 17:45
Bonjour,

Je fait un jeu de carte. Il fonctionne comme suit, un serveur reçoit les changements d'états des parties en cours et renvoi la partie modifiée, X clients affichent aux joueurs la partie telle que communiquée par le serveur.
Comme le client ne sait pas ou seront les cartes ni combien elles seront, j ai un tableau dynamique d image.

mon problème est le suivant, entre chaque "rafraichissement" de partie je dois attendre entre 1000 et 2500ms (ce qui fait pas vraiment temps réel)
j'ai vérifié au niveau du serveur, il ne met pas plus de 50ms secondes à répondre et au niveau du client pas plus de 200ms entre l'envoi et la réception de la requête. Ce qui place le ralentissement au niveau de l'affichage des images.

avez-vous une idée pour afficher rapidement un tableau d'images bitmap de manière dynamique?
pour le moment je charge les images au fur et à mesure qu'elles arrivent pour ne pas prendre trop de mémoire.
est ce que j'y gagnerais à toutes les charger au départ quitte à les rendre visible/invisible et à les déplacer si besoin est?

merci d avance
ps si vous avez besoin de précisions n'hésitez pas

8 réponses

Utilisateur anonyme
26 juil. 2010 à 16:26
Salut,

Ta question n'est pas clair en fait :

1)Utilises tu TCP ou UDP pour transférer tes données ? Pour un jeu en réseau, on utilise souvent UDP .

2)Tu parles d'images et de BitMap mais ce n'est pas la même chose. Don concrètement tu transfères quoi : des BitMap ou des TImages ?

3)Tu affiches tes images mais tu ne présises pas comment : tu utilises des TImages ?


Perso j'utiliserai un tableau de JPeg . Par contre ne surtout pas utiliser un tableau de TImages qui va méchamment allourdir le temps de téléchargement et d'affichage
0
Bacterius
Messages postés
3792
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
9
26 juil. 2010 à 16:27
Salut,
moi ce que j'aurai fait, c'est que j'aurai fait en sorte que le serveur envoie tout d'abord un nombre, qui indique le nombre de cartes à recevoir. Quand le client lit ce nombre, il alloue juste la place nécessaire, lit une carte, traite, lit une autre carte, traite, ...

Pour ce qui est des cartes, moi je les chargerai toutes en mémoire dès le début du programme dans un tableau de bitmaps, et j'enverrai que le numéro des cartes sur le réseau, comme ça l'affichage est rapide (copie mémoire locale) et le trafic est bas.

Après, ça dépend de comment tu as conçu ton jeu. Es-tu passé directement par les sockets, ou as-tu utilisé une librairie réseau, genre Indy ?
Salut, dans ce cas, je ferais un tableau dynamique de taille maximale (il y a quand même une limite supérieure dans le nombre de cartes j'imagine)

Cordialement, Bacterius !
0
Bacterius
Messages postés
3792
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
9
26 juil. 2010 à 16:29
Oups échec à la fin de mon post, ignorer les deux dernières lignes.

Salut Francky,
pourquoi pas des PNG ? Car les JPG pour des jeux de carte, ça va mettre des problèmes de couleur (le rouge est souvent beaucoup plus "rouge bordeaux"), et la compression sera meilleure en PNG. En transmettant non pas les images mais des numéros correspondant aux cartes. Mais bon, c'est une idée.

Cordialement, Bacterius !
0
Utilisateur anonyme
26 juil. 2010 à 16:57
Pourquoi pas des PNG car il me semble que le composant TImage ne gère pas ce format . Alors tu vas me dire qu'il y a des libs mais bon s'il peut éviter ce genre de chose c'est mieux.


Sinon effectivement, la façon de voir Juliens81 (Qui a pas mal floodé sur sa dernière question et risque de se faire disputer ) est à revoir. La meilleur des solutions serait la tienne, stratégiquement parlant (Bon après on peut améliorer le concept en créant des types et des records). Mais il est clair que de transférer des images, des bitmaps, des jpeg, des png est surement pas la bonne méthode pour avoir un truc optimisé.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
juliens81
Messages postés
26
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
6 juin 2012

26 juil. 2010 à 17:08
re bonjour,


tout d abord merci pour toutes ces reponses.

c est vrai que je n ai pas ete tres clair par rapport aux images que j utilisent. elles sont deja sur la machine du client dans un repertoire a part. le probleme ne vient donc pas du telechargement.
J ai essayer de mettre des JPG a la place de mes BMP mais ca n accelere pas l affichage (j ai meme l impression que c est l inverse)
pour mon affichage je fais un strech sur mes images, est ce que ca peut poser probleme?

pour ce qui est du protocole de communication je fais des sockets

j espere avoir ete plus clair cette fois ci
0
Cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
48
26 juil. 2010 à 17:24
Salut,

donne nous ta procédure de chargement et d'affichage des images qu'on y voit plus clair ... parce que normalement ça ne devrait pas poser de problème

ps: et la taille initial des images et la taille après stretch


[hr]@+Cirec
[hr]
0
juliens81
Messages postés
26
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
6 juin 2012

26 juil. 2010 à 17:33
la procedure de chargement en soit ne pose pas de probleme (j ai fait un log et en 200ms maximum mes donnees sont chargees)
pour la procedure d affichage d image la voici.

function creation_carte(cpt,identifiant_carte,hauteur,largeur:integer;position:Tpoint;lien_image:string):integer;
var temp,temp2:string;
begin
result:=0;
if cpt>nbcartes then begin
try
tabcartes[cpt]:=timage.Create(Form1);
tabcartes[cpt].Parent:=Form1;
// nbcartes:=cpt;
// nbcartes:=nbcartes+1;
inc(nbcartes);
except
result:=1;
end;
end;
tabcartes[cpt].Height:=hauteur;
tabcartes[cpt].Width:=largeur;
tabcartes[cpt].Stretch:=true;
if lien_image<>'' then begin
{if pos('.bmp',lien_image)>0 then begin
if fileexists(StringReplace(lien_image,'.bmp','.jpg',[rfReplaceAll, rfIgnoreCase])) then begin
lien_image:=StringReplace(lien_image,'.bmp','.jpg',[rfReplaceAll, rfIgnoreCase]);
end;
end;}
// si la carte est trop petite on charge une carte deja reduite pour accelerer l affichage
if hauteur<=150 then begin
temp:=lien_image;
temp2:='';
while pos('\',temp)>0 do begin
temp2:=copy(temp,1,pos('\',temp));
delete(temp,1,pos('\',temp));
end;
temp2:=temp2+'\mini\'+temp;
if fileexists(temp2) then
lien_image:=temp2;
end;
tabcartes[cpt].Picture.LoadFromFile(lien_image);
tabcartes[cpt].Visible:=true;
tabcartes[cpt].Enabled:=true;
end else begin
tabcartes[cpt].Visible:=false;
tabcartes[cpt].Enabled:=false;
end;
tabcartes[cpt].Left:=position.X;
tabcartes[cpt].top:=position.Y;
// tabcartes[cpt].Height:=235;
// tabcartes[cpt].Width:=161;
tabcartes[cpt].Tag:=identifiant_carte;
tabcartes[cpt].OnClick:=form1.Image1.OnClick;
tabcartes[cpt].OnDblClick:=form1.Image1.OnDblClick;
tabcartes[cpt].OnMouseMove:=form1.Image1.OnMouseMove;
end;

elle est appelle environ 40 fois et au maximum 90 fois (j ai fait en sorte de ne pas afficher les cartes qui se superpose.

pour la taille des images elles font 348x475 de base et dans le repertoire mini (les memes en reduites) elle font 144x200
0
juliens81
Messages postés
26
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
6 juin 2012

26 juil. 2010 à 17:45
je viens d essayer sur une autre machine et l affichage se fait correctement.
je vous remercie du temps que vous avez passez a m aider.

a une prochaine fois, pour une question que j espere plus pertinente.
0