Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++ > Langage
Langage Langage C++, Programmation Orientée Objet, Templates, etc. Avant de poster : FAQ C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 03/12/2012, 15h53   #1
benjahwest
Invité de passage
 
Inscription : février 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 7
Points : 2
Points : 2
Par défaut Transfert d'image en TCP pendant un jeu en réseaux

Bonjour à tous et à toutes !

Donc voila, tout est dans le titre.
A l'état où mon projet est; il ne fait que prendre des belles capture d'écran (ce qui déjà pas mal ). J'ai déjà pu obtenir un bonne compression avec le format jpeg: Les images ne font que 30 à 60 ko. C'est par la méthode GDI+ que je sauvegardes les captures.

Mais voila, je sollicite votre aide, afin de m'indiquer vers qu'elle direction aller pour la suite:
--> Transférer les captures et autres informations vers un master sans affecter la latence du jeu. Car si le jeu en question est un FPS, hors de question d'avoir des coups de lags !! Comme Punkbuster en fait (Personnes n'auraient son code source ?? )

Donc quelles fonctions TCP pourraient me permettre de réaliser cela ?
Quelles termes dois-je rechercher ?
Ne serrait-ce pas mieux d'envoyer directement la frame de capture plutôt que l'image enregistré sur le pc client... Je sais pas.

Merci à vous.
benjahwest est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2012, 17h11   #2
leternel
Expert Confirmé
 
Homme Pierre
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 1 211
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2007
Messages : 1 211
Points : 2 568
Points : 2 568
Tu as plusieurs possibilités:
Par exemple, faire un client de capture, lancé sur le serveur, qui recevrait les demandes de screens, et ferait les captures en local.

Tu peux aussi transférer l'image lentement (quelques kilos par secondes?).
Ou encore, la transmettre en fin de partie, ou sur les temps morts du joueur (délai de résurrection, menu, fin de partie, etc)

Le problème c'est la quantité de données à transmettre. Si faire la capture ne ralentit pas le joueur, il faut doser le flux parallèle pour ne pas faire laguer violemment
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
  • Une variable de moins est une source d'erreur en moins.
  • Un pointeur de moins est une montagne d'erreurs en moins.
  • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
  • La plus sotte des questions est celle qu'on ne pose pas.
leternel est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/12/2012, 18h20   #3
benjahwest
Invité de passage
 
Inscription : février 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 7
Points : 2
Points : 2
Bonjour et merci de votre réponse.
Citation:
Envoyé par leternel Voir le message
Tu as plusieurs possibilités:
Par exemple, faire un client de capture, lancé sur le serveur, qui recevrait les demandes de screens, et ferait les captures en local.
Les captures d'écrans doivent se faire côté client seulement, en effet c'est pour le surveiller.

Citation:
Envoyé par leternel Voir le message
Tu peux aussi transférer l'image lentement (quelques kilos par secondes?).
Cela m'intéresse beaucoup, c'est à tester, mais j'ai essayé de trouver sur le net, mais j'ai pas trouvé. Il me faudrait une base en faite, quelque chose de quoi je puisse partir.

Citation:
Envoyé par leternel Voir le message
Ou encore, la transmettre en fin de partie, ou sur les temps morts du joueur (délai de résurrection, menu, fin de partie, etc)
Là je suis d'accord aussi, mais je ne vois comment détecter un changements de carte, ou la fin du partie avec le Hooking de directX9.
Si quelqu'un à une idée ?

Citation:
Envoyé par leternel Voir le message
Le problème c'est la quantité de données à transmettre. Si faire la capture ne ralentit pas le joueur, il faut doser le flux parallèle pour ne pas faire laguer violemment
Euh là j'ai pas trop compris
benjahwest est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2012, 22h57   #4
Emmanuel Deloget
Expert Confirmé Sénior
 
Homme Emmanuel Deloget
Développeur informatique
Inscription : septembre 2007
Messages : 1 826
Détails du profil
Informations personnelles :
Nom : Homme Emmanuel Deloget
Âge : 37
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : septembre 2007
Messages : 1 826
Points : 4 381
Points : 4 381
Citation:
Envoyé par benjahwest Voir le message
Bonjour et merci de votre réponse.

Les captures d'écrans doivent se faire côté client seulement, en effet c'est pour le surveiller.
Le joueur va adorer l'idée

Citation:
Envoyé par benjahwest Voir le message
Cela m'intéresse beaucoup, c'est à tester, mais j'ai essayé de trouver sur le net, mais j'ai pas trouvé. Il me faudrait une base en faite, quelque chose de quoi je puisse partir.
C'est de la logique - tu n'as pas besoin de te baser sur le code de qui que ce soit. Tu as une socket TCP ; au lieu d'envoyer toute l'mage directement, tu n'envoie que quelques dizaines - ou centaines d'octets à chaque frame (ou toutes les 10 ms). De cette manière, tu limites l'impact sur l'autre flux de données (les données propres au jeu).

Citation:
Envoyé par benjahwest Voir le message
Là je suis d'accord aussi, mais je ne vois comment détecter un changements de carte, ou la fin du partie avec le Hooking de directX9.
Si quelqu'un à une idée ?
Meh ? C'est toi qui fait le jeu, donc tu sais parfaitement lorsqu'une map est terminée - du coté client comme du coté serveur. Si ton serveur n'est pas capable de savoir ça, alors tu risque d'avoir de gros soucis

Citation:
Envoyé par benjahwest Voir le message
Euh là j'ai pas trop compris
En gros : QoS, pour quality of service. Tu as deux flux à envoyer : le flux de données correspondant au jeu lui-même (probablement en UDP, n'est-ce pas ?) et le flux TCP contenant l'image. Il te faut trouver un moyen de donner une priorité à chaque flux, de manière à ce que le flux prioritaire passe toujours avec un très faible latence, pendant que le flux non prioritaire envoie ses données petit à petit.
__________________
[FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.
Emmanuel Deloget est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2012, 23h53   #5
benjahwest
Invité de passage
 
Inscription : février 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 7
Points : 2
Points : 2
Ah j'ai du mal me faire comprendre en fait; Je n'ai pas fait un jeu, loin de là !
J'ai fait un logiciel de capture d'écran, tout ceci est extérieur au jeu. Voila pourquoi je doit hooké le jeu afin d'y parvenir. Une dernière chose, l'utilisateur sera au courant de ce que fera le logiciel car c'est pour un but commun, l'anti-triche.

Mais bon, si j'ai bien compris, en limitant le nombre d'octets lors du transfert donc en TCP, cela me permettrait d'éviter d'affecter le ping du joueur.
Dois-je utiliser TCP NODELAY ou quelque chose comme ça ?
benjahwest est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2012, 10h09   #6
Emmanuel Deloget
Expert Confirmé Sénior
 
Homme Emmanuel Deloget
Développeur informatique
Inscription : septembre 2007
Messages : 1 826
Détails du profil
Informations personnelles :
Nom : Homme Emmanuel Deloget
Âge : 37
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : septembre 2007
Messages : 1 826
Points : 4 381
Points : 4 381
Citation:
Envoyé par benjahwest Voir le message
Ah j'ai du mal me faire comprendre en fait; Je n'ai pas fait un jeu, loin de là !
J'ai fait un logiciel de capture d'écran, tout ceci est extérieur au jeu. Voila pourquoi je doit hooké le jeu afin d'y parvenir. Une dernière chose, l'utilisateur sera au courant de ce que fera le logiciel car c'est pour un but commun, l'anti-triche.

Mais bon, si j'ai bien compris, en limitant le nombre d'octets lors du transfert donc en TCP, cela me permettrait d'éviter d'affecter le ping du joueur.
Dois-je utiliser TCP NODELAY ou quelque chose comme ça ?
J'avais mal compris

Sur l'utilisation de TCP NODELAY : non ; ça ne fait pas ce que je pense que tu crois (et par défaut, on est en nodelay dans la plupart des cas).

Il te faut vraiment limiter toi même l'envoi de données sur la socket TCP. Le plus simple : se fixer un budget par seconde (par exemple, 2ko par seconde), découper ça en plusieurs envois (par exemple 10, un toutes les 100 ms), et envoyer un packet de la taille correspondante à chaque envoi.

En pseudo-code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
t = taille totale de l'image en octets
s = socket TCP
b = budget par seconde en octets
i = buffer image
n = nombre d'envoi par seconde
 
b_envoi = b / n;
i_end = i + t;
while (i < i_end) {
  send(s, i, b_envoi);
  i += b_envoi;
  sleep_milliseconds(1000 / n);
}
En choisissant bien b et n, tu peux te retrouver à n'envoyer que des petits paquets TCP, à une fréquence qui ne mettra pas en péril le transfert des données de jeu.
__________________
[FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.
Emmanuel Deloget est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2012, 10h30   #7
leternel
Expert Confirmé
 
Homme Pierre
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 1 211
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2007
Messages : 1 211
Points : 2 568
Points : 2 568
Je n'ai pas tout compris. Où interviens-tu dans cette histoire?

Supposons un jeu en réseau classique, avec ses dix joueurs et son serveur.
De ce que j'ai cru comprendre, chacun des dix postes joueurs lance un programme de captures d'écran pour surveiller les joueurs.
Ce programme est censé envoyer les captures à un serveur qui sera chargé de les comparer.
Si c'est bien cela, ca ressemble diablement à la problématique d'un keylogger.

Une solution, c'est d'avoir une lib de capture vidéo pendant la partie puis chercher l'écran de fin de partie (reconnaissable au panneau de score, au VICTORY, etc) et d'envoyer au serveur ce qui ne l'a pas été depuis la dernière fin de partie (donc la vidéo de la partie).

Mais un anti-triche ne peut pas fonctionner avec l'accord du joueur. Pour qu'il soit utile, cela doit se faire plus ou moins sans son intervention.
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
  • Une variable de moins est une source d'erreur en moins.
  • Un pointeur de moins est une montagne d'erreurs en moins.
  • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
  • La plus sotte des questions est celle qu'on ne pose pas.
leternel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2012, 17h05   #8
benjahwest
Invité de passage
 
Inscription : février 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 7
Points : 2
Points : 2
Merci pour vos précisions à tout les deux.
benjahwest est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h43.


 
 
 
 
Partenaires

Hébergement Web