Question sur l'optimisation du code d'un jeu

Alors voilà, il y a plein de petites questions sur le fonctionnement de Game Develop
que je me pose depuis longtemps, notamment liées à l’optimisation du code des jeux,
et je me suis dit qu’il était temps de les poser !
Donc voici une petite liste pour toi 4ian, quand tu auras le temps :stuck_out_tongue: :

  • J’ai beaucoup d’actions liées à des condition “Toujours” que je groupe en général
    dans un seul et même évènement. Mais j’aime bien classer mes évènements en catégories
    comme vaisseau, ennemi, décor, armes, etc… Et cela afin de m’y retrouver dans mes évènements.
    J’aimerais mettre à chaque catégorie son évènement avec la condition “Toujours”, regroupant les
    actions qui lui sont propres. Je voudrais savoir si toutes ces répétitions de conditions “Toujours”
    créent une différence (sensible) au niveau du calcul de l’ordinateur, par rapport à un regroupement
    dans une seule et unique condition “Toujours”. Tu vas peut-être rigoler et me dire que la différence
    se calcule en quelques millisecondes, mais vu le nombre d’évènements de mon jeu, je me dis que
    ça vaut le coup de demander…

  • L’expression “Temps écoulé depuis la dernière image” ou “TimeDelta” bien mystérieuse…
    J’ai vu que tu ne jures que par cela, autant dans tes conseils sur le forum que dans tes exemples
    de jeux. Personnellement, avant que tu ne la mentionnes, je ne l’utilisais jamais; utiliser une
    fonction qui dépend du temps entre chaque image, et qui dépendrait donc de la vitesse variable
    sur chaque l’ordinateur me semblait aussi bizarre que de construire un jeu sans aucun chronomètre.
    Mais en m’attardant sur son expression exacte (TimeDelta), j’ai compris que cela avait un rapport
    sur l’écoulement absolu du temps, mais pas entre chaque image. Je me trompe ? Parce que sinon,
    pourquoi utiliser une fonction si dépendante des images par seconde ? :confused:

  • Sauvegarder des données dans un fichier, une action indispensable, rien que pour mémoriser
    les options d’un jeu. Mais cette action fonctionne-t-elle en local (comme pour un site web) ?
    Peut-on créer un fichier de sauvegarde dans le répertoire racine d’un jeu installé ? Personnellement,
    j’utilise un programme d’installation pour mon jeu, ce qui permet entre autres à chaque joueur
    de l’installer n’importe où sur son(ses) disque(s) dur(s). Bien entendu, comme l’emplacement
    n’est pas prévisible et que je ne veux pas en imposer un, un problème se pose…

Désolé de t’imposer tout ce texte à lire, mais tout ça me trottait dans la tête depuis trop longtemps ! :stuck_out_tongue:

Pour sauver sur un réseau local tu peut si tout es ordis on accès au dossier et on le droit de le lire et modifier bref la tu teste jusqu 'as ce que ça marche
Sur un serveur non en lignn on ne peut pas je sais c’est embettant on aurait pu faire des tonnes de choses en plus mais on ne peut pas :frowning:
pour le reste aucune idée :slight_smile:

En fait, tu peux généralement carrément supprimer la condition “Toujours” et laisser “Pas de conditions”.
Ainsi, Game Develop n’entrera même pas dans la boucle pour tester les conditions. ( Je n’avais pas prévu à la création de Game Develop qu’on puisse ne pas mettre de conditions, d’où la création d’une condition “Toujours”. )

Pour ce qui est de mettre ensuite tout dans un seul évènement ou dans plusieurs, théoriquement un seul devrait être plus efficace que plusieurs, mais je sais pas si ça vaut vraiment le coup de casser l’organisation pour ça…

En fait, il n’y a pas que moi qui ne jure que par cela, mais l’ensemble d’un jeu est dépendant de ça. Je m’explique :
Imaginons que quand tu appuye sur la touche Haut, la variable Accélération de la voiture augmente.

Naïvement, on metterais :
Si la touche “Haut” est appuyée Alors Faire +1 à la variable Accélération de voiture.

Le problème, c’est que sur un ordinateur lent, les évènements seront executés, disons 30 fois par secondes ( 30 FPS donc ). Donc en une seconde, la variable accélération aura augmentée de 30. Mais sur un ordinateur rapide, qui execute les évènements 150 fois par secondes, la variable Accélération aura augmenté de 150 en une seconde.

Pour éviter cela, on augmente un petit peu la variable suivant le temps qui s’est écoulé depuis la dernière image :
Si la touche “Haut” est appuyée Alors Faire +100*VAL(timeDelta[]) à la variable Accélération de voiture.

Ainsi, c’est que sur un ordinateur lent, VAL(timeDelta) sera relativement important, et la variable sera plus augmentée à chaque passage des évènements, mais il y aura moins de passage d’évènements… Inversement sur un ordinateur rapide, VAL(timeDelta) sera plus faible, et la variable sera moins augmenté à chaque passage des évènements, mais il y aura plus de passage d’évènements. On se neutralise ainsi la dépendance de l’évolution de la variable vis à vis de la rapidité d’exécution du jeu.

Game Develop utilise ceci en interne pour les forces. Quand tu utilise un chronomètre, c’est un peu comme si tu utilisait VAL(timeDelta) mais en attendant que le temps écoulé atteigne un certain seuil.

Pour résumer, si tu dois faire augmenter une valeur de façon continue, multiple la par VAL(timeDelta) pour éviter que la rapidité de l’évolution de cette valeur dépende de la rapidité de l’ordinateur.
Si tu fais quelque chose à intervalle régulier, un chronomètre est tout indiqué.

Il suffit d’entrer simplement le nom de ton fichier ( “MaSauvegarde.sav” ), et il sera créé dans le répertoire courant du jeu, c’est à dire le répertoire de l’exécutable une fois le jeu compilé. Le nom de fichier que tu as entré est dit relatif, il dépend du répertoire de l’executable. ( Et un nom de fichier tel que “C:\MonDossier\MonFichier” est dit absolu.)
Attention, si tu compile en mode fichier exécutable unique, le répertoire d’exécution est mal renseigné, il te faut donc obligatoirement compiler normalement si tu utilise des noms de fichiers relatifs.

Merci beaucoup pour tous ces renseignements, cela m’aidera à faire les choses plus intelligemment :slight_smile:.
J’avais déjà commencé à supprimer les dizaines de chronomètres que j’avais par des actions avec TimeDelta,
maintenant je peux continuer sereinement ! Bien vu, le coup d’enlever la condition “Toujours”, je n’y avais même pas pensé… :blush:

EDIT: Ayant parcouru certains messages assez “spéciaux” sur le forum, je te souhaite sincèrement bon courage :stuck_out_tongue:

Bon je up le sujet mais ca fait un bail que je suis pas passé.
D’après ce que j’ai compris je vais pouvoir faire des heux qui tourneront QUASIMENT à la même vitesse chez moi que chez d’autres? Cool ^^

Euh je ne sais pas
j’était confronté au même problème que toi alors :frowning:
Mais mon jeu était hyper rapide sur un seven(le mien actuel)
Je dis vraiment c’est gênant quand il faut tout refaire pour les autres :frowning:
C’est le but de crée un jeu mais c’est quand même chiant :frowning:
[size=50]Mais encore un fois ce qui manque vraiment a gd c’est le jeu en ligne ou en réseau local
Il faudra un jour faire ça :smiley:
[/size]Voila
EDIT:désolé pour le hors sujet :cry:

Il faut pas tout refaire pour les autres, il faut s’assurer que tout ce qui a un rapport au temps s’execute avec la même vitesse chez tout le monde, en utilisant chronomètre ou VAL(timeDelta).

Euh, évite de passer du coq à l’âne, c’est pas le sujet ici.
Et si tu n’a rien de plus à rajouter à une conversation Crone123, alors ne le rajoute pas. C’est pas la première fois que je te fais la remarque.

Donc d’après ce que j’ai compris grâce à cete “fonction” mon jeu tournera quasiment à la même vitesse partout?

En utilisant VAL(timeDelta[]) pour modifier ce qui doit être fait de façon continue suivant le temps ( comme l’accéleration d’une voiture ), tu sera sur que ça ne se fera plus rapidement sur un PC plus puissant.

ok mici :slight_smile: exaftement ce dont j’avais besoin ^^

L’utilisation d’un chronomètre produit exactement le même effet ( comparaison entre les deux types d’actions qui produisent théoriquement le même effet bien sûr ) ?

Par contre, en regardant ton jeu, j’ai vu que tu avais mis aussi des VAL(timeDelta[]) pour les forces.
Attention à bien lire ce que je met auparavant aussi, les forces prennent déjà en compte le temps écoulé depuis la dernière image.

[b]Les VAL(timeDelta[]) ne sont à utiliser que lorsque :

-Les actions ne sont pas faites en fonction d’un chronomètre. ( Vu que le chronomètre mesure déjà le temps ).
-Les actions ne concernent pas les forces. ( Vu que les forces utilisent déjà ça pour être constantes sur tous les ordis ).
-Les actions concernent une grandeur qui doit évoluer en fonction du temps.[/b]

EDIT pour Cross : Un chronomètre est plus indiqué pour quelque chose qui doit se produire régulièrement, pas de de façon continuelle.

Donc les VAL(timeDelta[]) (ou des chronomètres) sont à utiliser avec des forces évoluant avec une dissipation de -1.25 par exemple ? (lorsqu’une touche est appuyée)

Non, aucun VAL(timeDelta[]) avec les forces.

Seulement si vous avez besoin de faire évoluer quelque chose de façon continue et régulière, comme l’accélération, un changement de direction d’une voiture, une perte progressive de vie.

Par exemple :
Pas besoin de VAL(timeDelta[]) pour mettre une variable directement à 1, ou mettre la vie du joueur directement à 500 par exemple, car ce sont des actions à faire directement et en une seule fois.
Pas besoin d’utiliser VAL(timeDelta[]) si vous manipulez des forces.
Pas besoin d’utiliser VAL(timeDelta[]) si vous ajouter régulièrement 5 point de vie toutes les 3 secondes avec un chronomètre
Besoin d’utiliser VAL(timeDelta[]) si vous voulez ajouter régulièrement 5 point de vie de façon continue.

avec une dissipation de -1.25, il y a et accélération et changement progressive de direction, donc > chronomètre ( ça me parait plus facile que d’utiliser VAL(timeDelta[]), parce que j’ai pas tout compris )
Et j’imagine que c’est pareil avec un effet de “fondue”.

Avec un effet de fondu, on a une modification continue et régulière donc on aura quelque chose du genre :

Faire +255*VAL(timeDelta) à l’opacité de monFondNoir.

L’unité de VAL(timeDelta) étant la seconde, le fond noir apparaitra en 1 seconde.

Euh, changement de direction, tu gère ça avec VAL(timeDelta) ( ou avec un chronomètre au pire ), mais ne met pas de VAL(timeDelta) avec les forces, ça va faire double-emploi, et donner des choses très bizarres, et variables suivant les PC en plus.
Par contre oui, tu peux utiliser un chronomètre pour ajouter par exemple régulièrement une force avec une dissipation de -1.25 à un objet.

Ok, merci pour les infos :wink:

heuuu c’était dédjà le cas pour timedelta dans les forces das les versions précédentes de gd car il y avait une énorme différence de vitesse entre les pcs.

Les forces prennent compte du temps depuis la première version de Game Develop.

Ben alors c’est bizarre car dans mon jeu The Labnyrinth le vaisseau va beaucoup plus vite sur d’autres pc alors que c est le déplacement pas des forces…
édit : je viens de vérifier et la différence de vitesse était surement du à la différence de rapidité de changement d’angle du vaisseau. La perception humaine devait faire le reste.