Fixe ouvitesses variables dans les jeux:quel est le meilleur, et quand?

StackOverflow https://stackoverflow.com/questions/53164

  •  09-06-2019
  •  | 
  •  

Question

Après avoir travaillé pendant un certain temps à développer des jeux, j'ai été exposée à deux vitesses variables (où vous le travail de la façon dont beaucoup de temps est passé depuis le dernier tick et mise à jour le mouvement d'acteur en conséquence) et fixe des taux de trame (où vous le travail de la façon dont beaucoup de temps est passé et choisissez l'option de cocher un montant fixe de temps ou de dormir jusqu'à la prochaine fenêtre vient).

La méthode qui fonctionne le mieux pour des situations spécifiques?Veuillez considérer:

  • De la restauration à différentes spécifications du système;
  • La facilité de développement et de la maintenance;
  • La facilité de portage;
  • La performance finale.
Était-ce utile?

La solution

Il semble que la plupart des 3D développeurs préfèrent variable FPS:le Quake, Doom et Irréel moteurs à la fois à l'échelle en haut et en bas basé sur les performances du système.

  • À tout le moins, vous avez pour compenser la trop rapide des taux de trame (à la différence de 80 jeux de course dans les années 90, trop vite)
  • Votre boucle principale doit être paramétré par le timestep de toute façon, et tant qu'il n'est pas trop long, un bon intégrateur comme RK4 doit gérer la physique en douceur Certains types d'animation (images clés sprites) pourrait être une douleur à paramétrer.Code de réseau aura besoin d'être intelligent, ainsi, d'éviter les joueurs avec des machines plus rapides de la prise de vue trop de balles par exemple, mais ce genre de limitation devra être fait pour la compensation de latence de toute façon (l'animation de paramétrage permettrait de masquer la latence réseau trop)
  • Le code de timing devra être modifiée pour chaque plate-forme, mais c'est un petit localisée changer (même si certains systèmes extrêmement précis calendrier difficile, Windows, Mac, Linux semble ok)
  • Vitesses variables pour un maximum de performance.Châssis fixe les taux de permettre des performances constantes, mais ne sera jamais atteindre le maximum sur tous les systèmes (qui semble être un frein pour n'importe quel jeu sérieux)

Si vous êtes à la rédaction d'un réseau de jeu en 3D où la performance est importante, je dirais, mordre la balle et mettre en œuvre des vitesses variables.

Si c'est un 2D jeu de puzzle, vous pouvez probablement vous en sortir avec une trame fixe le taux, peut-être un peu paramétrable pour les super-ordinateurs lents et les prochaines années modèles.

Autres conseils

Je me penche vers une variable de fréquence d'images du modèle, mais en interne, certains systèmes sont cochées sur un fixed timestep.C'est assez facile à faire en utilisant un accumulateur de temps.La physique est un système qui est le mieux exécuter sur un fixe timestep, et coché plusieurs fois par image, si nécessaire pour éviter une perte de la stabilité et de garder la simulation lisse.

Un peu de code pour illustrer l'utilisation d'un accumulateur:

const float STEP = 60.f / 1000.f;
float accumulator = 0.f;

void Update(float delta)
{
    accumulator += delta;

    while(accumulator > STEP)
    {
        Simulate(STEP);
        accumulator -= STEP;
    }
}

Ce n'est pas parfait, mais présente l'idée de base - il y a de nombreuses façons d'améliorer ce modèle.Évidemment il y a des problèmes à régler au moment de l'entrée framerate est obscène lent.Cependant, le gros avantage est que peu importe comment rapide ou lent, le delta, la simulation est en mouvement à une surface lisse taux de "lecteur", c'est là où tous les problèmes sont perçus par l'utilisateur.

En général, je n'entre pas dans les graphiques et audio sur le côté des choses, mais je ne pense pas qu'ils sont touchés autant que la Physique, l'entrée et le code réseau.

Une option que j'ai, en tant qu'utilisateur, aimerait voir plus souvent est de changer dynamiquement le niveau de détail (au sens large, pas seulement au sens technique du terme) lors de la cadence des images de varier à l'extérieur d'un certian de l'enveloppe.Si vous êtes rendu à 5FPS, puis éteignez le bump-mapping.Si vous êtes rendu à 90FPS, augmenter les cloches et de sifflets un peu, et donner à l'utilisateur quelques jolies images à perdre leur CPU et GPU avec.

Si fait correctement, l'utilisateur doit obtenir le meilleur metier du jeu sans avoir à aller dans les paramètres de l'écran et de modifier eux-mêmes, et vous devriez avoir à s'inquiéter moins, en tant que level designer, sur le maintien du nombre de polygones de même à travers la différence des scènes.

Bien sûr, je dis cela en tant qu'utilisateur de jeux, et pas un de sérieux qui -- je n'ai jamais tenté d'écrire un non trivial jeu.

Le principal problème que j'ai rencontré avec de la longueur variable de cadre de temps est la précision en virgule flottante, et d'images variable de fois pouvez-vous surprendre dans la façon dont ils vous mordent.

Si, par exemple, vous ajoutez le cadre de l'heure * vitesse à la position et le cadre de temps est petit, et la position est largish, vos objets peuvent ralentir ou arrêter de bouger parce que tous vos delta a été perdu en raison de la précision.Vous pouvez compenser cela en utilisant une erreur séparée de l'accumulateur, mais c'est une douleur.

Ayant fixé (ou au moins une borne inférieure sur la longueur de trame) de cadre de temps vous permet de contrôler la façon dont beaucoup d'erreur FP vous devez prendre en compte.

Mon expérience est assez limitée à un peu à des jeux simples (développé avec la SDL et C++), mais j'ai trouvé que c'est assez facile il suffit de mettre en œuvre une image statique de taux.Travaillez-vous avec 2d ou en 3d, des jeux?Je suppose que le plus complexe des environnements 3d serait plus utile à partir d'une fréquence d'image variable et que la difficulté serait plus grande.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top