Jeu en ligne

Petit nouveau ! | 8 Messages

15 avr. 2006, 12:57

Bonjour,

Je développe actuellement une application web, et plus précisement un jeu en ligne.
Pour cela, j'utilise les technologies suivantes :
Apache/PHP5 côté serveur
XHTML/JavaScript côté client
PostGres 8 pour la base de donnée

Mais je suis actuellement confronté à un problème. Dans ce jeu, je dois mettre à jour les ressources des joueurs, les déplacements, les constructions de bâtiments, les combats...
Pour l'instant je fais tout ça côté PHP avec le système suivant :
à chaque page, je regarde dans la base de donnée les différents élements à mettre à jour, je récupère la date de la dernière mise à jours de l'élement.
Pour les ressources, je soustrais cette date de mise à jours à la date actuelle, je multiplie par un coefficient de production et j'ajoute les ressources gagnées dans la base de donnée.
Pour les autres actions, je récupère la date de fin. SI elle est inférieur à la date actuelle, alors l'action est terminé et j'effectue les traitements nécessaires.

Tous ces controles nécessitent beaucoup de ressources et sont éxecutés à chaque page par PHP.

Je pense qu'il ne s'agisse pas de la meilleur solution, alors on a pensé à un système de démon.
Une application (en java), s'occuperait de mettre à jour la base de donnée complète à intervalles réguliers. Cependant, il ne faut pas que ces intervalles excedent deux minutes.

Le problème est qu'on a des tables relativement grande en lignes (généralement plusieurs dizaines de milliers d'enregistrements), mais pas trop en colonne (souvent entre 3 et 5 au maximum et ce sont des valeurs numériques, souvent entières).

Donc il faut itérer sur les 10aine de milliers d'enregistrement, faire les controles et les traitements adéquats, tout ça en moins d'une minute.
Est-ce possible ? Je n'ai pas trop d'idée d'ordre de grandeur pour les temps de traitements par les bases de donnnées.

Que pensez-vous de ces solutions ? En avez-vous une autre ?

Merci d'avance pour vos réponses.

PS : j'ai oublié de préciser. En principe la base de donnée tournera sur un serveur bi-xeon et le serveur web (apache + PHP5) sur un second serveur bi-xeon.
Mais il y a de fortes chances qu'on commence avec seulement un ou deux serveurs athlons.

Mammouth du PHP | 19672 Messages

15 avr. 2006, 13:28

Salut,
pour réduire un peu les problème de demande de ressource quand il y a une grosse montée en charge, passer par un système intermédiaire n'allègera pas la charge du SGBD : donc il faut envisager à mon avis deux choses :
- d'abord soigneusement choisir certaines colonnes et les indexer;
- Ensuite créer des vues serait peut-être approprié ?
Enfin, peut-être que quelques procédures stockées accélèreraient certains traitements ?

D'autres avis viendront sûrement apporter d'autres éléments.. :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 8 Messages

15 avr. 2006, 15:07

Merci pour ta réponse.
pour réduire un peu les problème de demande de ressource quand il y a une grosse montée en charge, passer par un système intermédiaire n'allègera pas la charge du SGBD
Ben disons que moi je voyais ça différement :
-Avec le systeme actuel (tout par PHP), à chaque page on effectue beaucoup de traitement (mais seulement ce qui est nécessaire.
Donc quand il y a une montée en charge, tout ces traitements peuvent poser de serieux problème.
-Avec le systeme proposé (demon Java), on met tout à jour à intervalle régulier.
Cela permet par la même occasion d'augmenter l'intervalle de temps entre deux mises à jours lors d'une montée en charge assez importante.

Eléphanteau du PHP | 22 Messages

18 avr. 2006, 12:03

>Pour ma part, je m'amuse moi aussi a faire un systeme qui permettrait de faire tourner un jeu en ligne.
La partie de gestion des ressources est celle qui m'a posée le moins de problème; je ne met a jour que les comptes concérnés, (soit par une attaque soit par une connexion).
Le compte connécté se met a jour que sur certaines page (1 page sur 3 de son compte) et le compte attaqué 1 fois au lancement de l'attaque.


Au départ j'été partie sur un systeme qui mettait tout les comptes a jour a chaque connexion d'une personne.
Or la personne se connectant était souvent obligés d'attendre plusieurs dizaine de secondes alors que mes test se sont portés sur 50 a 60 comptes...
La d'après mes test ca tourne plutot bien....


(je n'azi pas tester en réel mais en faisant tourner le script directement ;) )

Petit nouveau ! | 8 Messages

18 avr. 2006, 12:18

>Pour ma part, je m'amuse moi aussi a faire un systeme qui permettrait de faire tourner un jeu en ligne.
La partie de gestion des ressources est celle qui m'a posée le moins de problème; je ne met a jour que les comptes concérnés, (soit par une attaque soit par une connexion).
Le compte connécté se met a jour que sur certaines page (1 page sur 3 de son compte) et le compte attaqué 1 fois au lancement de l'attaque.)
C'est exactement comme ça que je fais actuellement (sauf que moi pour les ressources je le fais à chaque page).
En faite c'est en gros un systeme de déclencheur. On a une action qui nécessite d'afficher les ressources (declencheur), donc on lance la mise à jours des ressources par exemple.

Eléphanteau du PHP | 22 Messages

18 avr. 2006, 12:24

Et c'est trop lent pour toi ?
Ou est-ce par simple soucis de MAJ generale ^^

Car traité tout les membres en même temps !!!!

Ou est-ce par ex 3 fois par jour pour mettre a jour les points (pour ex ^^)
Car je n'en suis pas encore la, mais je serait curieux de savoir comment tu va t'en soritr ;)


Bonne chance !

ViPHP
ViPHP | 1024 Messages

18 avr. 2006, 14:41

regle #1:
_ ne mettre à jour que ce qu'il est utile de mettre à jour
regle #2:
_ ne mettre à jour que ce qu'il est utile de mettre à jour

sinon, chercher sur les sites qui parlent de jeu:
Tutorial : Gestion des ressources en "temps réel"
http://jeuphp.forumactif.com/viewtopic.forum?t=679
tour de jeu (cf le forum)
http://www.tourdejeu.net/
un blog qui en parle aussi:
http://x1fr.free.fr/dotclear/2005/06/13 ... eriodiques

(je n'ai pas tout décortiqué, je n'ai pas encore regardé les ressources pour mes projets)

A+

Pascal

Eléphanteau du PHP | 22 Messages

18 avr. 2006, 14:56

WoW, joli script mais je le trouve bien trop lourd ^^
Je préfère ma bonne vieille méthode d'update de compte concerné ^^ (peut être pas plus rapide mais plus simple a la compréhension...)

Soit dit en passant le forum cité est plutot interessant ;)
Merci !


ps: J'ai trouvé comment faire pour les maj de point généralisée ! Dans une console d'administration (que admin) on lance un script qui maj tout au moins même si ca met 5 secondes c'est pas très grave ;)
Par contre faudra que je bloque le eju pdt 5 sec pour ne pas avoir 2 modifs en même temps qui pourrait faire pêter le smilblick ^^

A voir !

Petit nouveau ! | 8 Messages

18 avr. 2006, 15:47

Bon c'est exactement comme décrit dans les liens que je fonctionne.

En faite moi j'aimais bien ma façon de faire les choses. Sauf qu'on l'a critiqué sur d'autres forums donc j'ai remis en cause mon système de jeu.
Le truc c'est qu'on met à jour les ressources, les constructions d'unités, de batiments, de technologies, le déplacement de flottes, de transert de ressources, et surtout le traitement des combats (qui sont des combats non pas instantannés mais qui se jouent dans le temps).

Actuellement tout ça correspond à une classe qui comporte 6 méthodes, pour un total d'un peu moins de 500 lignes.
Mais ce qui me dérange le plus c'est le très grand nombre de requete apres avoir pourtant optimiser pas mal le script.

Mais bon, pour l'instant je vais continuer avec mon systeme actuel.

ViPHP
ViPHP | 1024 Messages

18 avr. 2006, 16:18

pour les requetes, il y a un seuil minimal (le nombre de tables différentes à mettre à jour ) ;

mais tu peux peut être diminuer le nombre de requetes en regroupant en une seule plusieurs choses:
test des données + jointure pour mettre à jour les données en fonction d'autres tables.

Bonne optimisation!

A+

Pascal

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

18 avr. 2006, 16:39

et pourquoi ne pas utiliser AJAX et les Dynamic DataSets côté client et implémenter un méchanisme transactionnel optimisé entre le client et le serveur. Avec ces technologies, le client prend en charge une grande partie du contrôle et du stockage de données temporaires avant les mises à jour différées.
L'idée: pour ne pas saturer les serveurs, le client peut calculer à leur place.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

18 avr. 2006, 17:33

Dynamic DataSets ? quelles est cette chose ?

Petit nouveau ! | 8 Messages

18 avr. 2006, 18:09

et pourquoi ne pas utiliser AJAX et les Dynamic DataSets côté client et implémenter un méchanisme transactionnel optimisé entre le client et le serveur. Avec ces technologies, le client prend en charge une grande partie du contrôle et du stockage de données temporaires avant les mises à jour différées.
L'idée: pour ne pas saturer les serveurs, le client peut calculer à leur place.
J'y ai déjà pensé mais implémenter de telles traitements côtés client avec JavaScript...ça ne me plaît pas trop.
On utilise déjà AJAX pour agrémenter l'interface, pour éviter la charge au niveau du serveur en recalculant à chaque fois la page, mais je reste persuader qu'il est nécessaire d'effectuer les vérifications et de telles traitements côté serveur.

De plus cela ne fait que déplacer le problème car d'une part, le temps de latence entre les serveurs entre en jeu. On a de nouveaux transferts entre le client et le serveur.
Et cela est pire si la base de donnée se trouve sur un troisieme serveur car ça fera : CLIENT -> SERVEUR WEB -> SERVEUR DE BASE DE DONNEE

Maintenant effectivement, cela permet de diminuer la charge au niveau du serveur web. À voir..

tayK
Invité n'ayant pas de compte PHPfrance

19 mai 2006, 13:18

est-il possible par curiosité d'avoir un lien ?