JeuWeb - Crée ton jeu par navigateur
Quelle technologie pour un jeu de carte pseudo temps réel ? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Quelle technologie pour un jeu de carte pseudo temps réel ? (/showthread.php?tid=4624)

Pages : 1 2


Quelle technologie pour un jeu de carte pseudo temps réel ? - Soleo - 15-03-2014

Bonjour,

Je sais qu'il y a de nombreux sujets ici ayant déjà abordé cette problématique, j'en ai regardé la plupart mais il y a encore des éléments qui me paraissent obscurs...

J'ai pour but de coder un jeu de carte en ligne et j'ai par défaut fait mes tests en local et en utilisant de l'Ajax regardant dans la base de donnée toutes les 4 secondes si une action a été effectuée par l'adversaire entre temps, régissant alors l'ordre des tours.

Cependant cette méthode n'étant absolument pas optimisée du fait de 2 requêtes mysqli par 4 secondes multiplié par le nombre de joueurs... Voilà, bon, j'en ai bien conscience ce n'est pas adapté.

Alors j'ai parcouru nombreux forums (En retombant souvent sur le votre) et pu prendre connaissance de nombreuses technologies (Websockets, SSE, Node.js ...)

Je souhaite simplement que le changement partiel de la page (via Js) soit effectué uniquement lorsque la table en question avec l'id correspondant a été update. Pas de faire 1req/sec. (Quand un joueur joue une carte, l'autre la voit puis c'est à son tour)

Ma première question est donc, que serait le langage le plus adapté et le plus simple à mettre en oeuvre ?



Ma deuxième question est la suivante, j'ai fait un test simple en utilisant les Server Sent Event, la page streamée est approximativement de la sorte :

SELECT les utilisateurs connecté grâce à une requête mysqli
tant que $row $query->fetch_assoc
array_push(un array, $row['pseudo']);

$final = json_encode(un array)
echo 'data: {$final}\n\n'
flush

Tandis que la page qui affichera ne contient que le strict nécessaire en js pour voir le résultat, ce dernier m'ayant surpris:
La liste de tous les utilisateurs connectés s'affichent bien... Mais toutes les secondes ? Cela n'était pas censé afficher uniquement lorsque la liste change ? Ou bien une notion m'échappe ? Car dans ce cas c'est exactement pareil qu'un requête par seconde...
J'ai besoin d'un peu d'éclaircissement ^^'

Merci d'avance.


RE: Quelle technologie pour un jeu de carte pseudo temps réel ? - MadMass - 15-03-2014

Le mieux pour ce genre de trucs, outre le langage, c'est surtout la logique que tu déploies derrière.
La solution dont tu parles est très lente parce qu'à chaque fois il y a une requête GET, ce qui implique de charger la page, connecter à la db, effectuer toutes les opérations courantes (authentification sécurisée de l'utilisateur, etc) à chaque fois.
Je pense qu'il est mieux de se tourner vers un serveur qui tourne en permanence et des websockets pour ça. Ce faisant, tu pourras également reporter dans le temps les actions sur la base de donnée en ayant massivement recours à la RAM (c'est ce qui se fait sur les mmo avec client applicatif).


RE: Quelle technologie pour un jeu de carte pseudo temps réel ? - Soleo - 15-03-2014

Les websockets ne sont t'ils pas plus adaptés pour des sites avec interaction en temps réel ? (Une map qui s'actualise non-stop pour tous les joueurs par exemple)
Dans mon cas les changements ne s'appliquent que lors d'actions déclenchés par les joueurs, si ils ne font rien, rien n'est censé changer, à moins que je me trompe sur les websockets ? :x


RE: Quelle technologie pour un jeu de carte pseudo temps réel ? - Sephi-Chan - 15-03-2014

Tu as effectivement besoin d'une technologie de push, afin d'envoyer des informations du serveur vers un ou plusieurs clients.

Tu peux utiliser le langage que tu veux et te servir d'un service de push tiers (comme Pusher ou PubNub. Leur utilisation dépend surtout de tes convictions et de tes moyens : es-tu prêt à faire transiter des données sur un service tiers ? Es-tu prêt à payer un peu quand tu dépasseras leur pallier d'utilisation gratuit ? etc.

Si tu disposes d'un serveur dédié, tu peux aussi installer ton propre serveur de push (comme Faye) si tu es prêt à t'embêter un peu à le faire fonctionner.


Concernant ton essai de SSE, tu rends probablement la main au serveur, ce qu'il ne faut pas faire. Je ne sais pas comment il faut faire en PHP (qui n'est pas evented).


RE: Quelle technologie pour un jeu de carte pseudo temps réel ? - Soleo - 15-03-2014

Je n'ai pour l'instant qu'un mutualisé chez 000webhost, je pense que je vais accorder un peu d'attention à PubNub si les SSE ne me permettent pas de faire ça, je me contenterai de la sandbox pour la phase de développement/test, mais j'aimerais quand même comprendre le résultat de mon essai, tu dis que je rends peut être la main au serveur ? Sachant que ma page ne ressemble qu'à ça :

<script>
var source = new EventSource('test.php');
source.onmessage = function(e) {
document.body.innerHTML += e.data + '<br>';
};
</script>

Je ne sais pas trop...
Merci de vos réponses rapides en tout cas


RE: Quelle technologie pour un jeu de carte pseudo temps réel ? - Sephi-Chan - 15-03-2014

Dans ton expérimentation de SSE, c'est le côté PHP qui pose problème. Regarde cette discussion sur Stack Overflow, ça te mettra sur la voie.

Je pense que tu fais le bon choix en utilisant un service tiers : ça te permettra de te concentrer sur la partie fonctionnelle plutôt que de devoir recréer la couche que fournit PubNub (ou Pusher), notamment la sécurité des communications et la notion de canaux.


RE: Quelle technologie pour un jeu de carte pseudo temps réel ? - niahoo - 15-03-2014

mouais. pour un jeu de carte franchement y a pas besoin d'avoir de la technologie de malade. Déjà si au lieu de stocker tes parties dans une base sur disque, ce qui est lent, tu les stockais en RAM, ça irait plus vite. Il faut configurer mysql pour avoir la table des jeux en cours en RAM, avec un backup sur le disque de temps en temps.

Ou utiliser Redis.

A mon avis ça ira déjà beaucoup plus vite.

[...] edit : pour les SSE, oui en PHP c'est pas la peine de le faire à coups de sleep, ça revient à faire du long polling en plus limité. Pour cette partie la les services tiers seront quand même un plus.

Je ne sais pas si j'en ai déjà parlé sur le forum, j'ai porté une petite librairie websocket pour un serveur erlang bien connu, Yaws. C'est un simple lien websocket avec fallback Eventsource/Ajax ou Ajax seul. En gros c'est un socket.io minimal et c'est là : https://github.com/lud/flea


RE: Quelle technologie pour un jeu de carte pseudo temps réel ? - Soleo - 16-03-2014

Je n'utilise pourtant pas de sleep dans mon PHP, c'est ça qui me parait étrange...
Je vais voir pour utiliser la RAM des parties en cours


RE: Quelle technologie pour un jeu de carte pseudo temps réel ? - niahoo - 16-03-2014

Fais voir le code complet de ton SSE en PHP. Je vais t'expliquer.


RE: Quelle technologie pour un jeu de carte pseudo temps réel ? - Soleo - 16-03-2014

Voici le php donnant la liste des joueurs

Code :
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

require_once('bdd.php');
$link = mysqli_connect(HOST,USER,PASS,BDD);
mysqli_query($link, "SET NAMES UTF8");
$query = mysqli_query($link, "SELECT * from user WHERE lastActu - ".microtime(true)." > -300;");
$content = array();
while($row = $query->fetch_assoc())
{
    array_push($content, $row['pseudo']);
}
$final= json_encode($content);
echo "data: {$final}\n\n";
flush();
?>

Et voici la page utilisée pour tester ça

Code :
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
</head>
<body>
  <script>
    var source = new EventSource('test.php');
    source.onmessage = function(e) {
      document.body.innerHTML += e.data + '<br>';
    };
  </script>
</body>
</html>