2010-10-31 16 views
7

Comme je le sais, le GC de suivi ne peut pas éviter le blocage de thread pendant GC complet.Le jeu GC de Lua et le jeu en temps réel

J'avais utilisé XNA + C#, et le temps de GC était impossible à enlever. Je suis donc passé au langage de niveau inférieur C, mais j'ai réalisé que j'avais besoin d'un langage de script. Je pense à Lua, mais je m'inquiète du mécanisme GC de Lua. Lua utilise GC de suivi incrémental, et le blocage des threads devrait l'être aussi.

Alors, comment dois-je gérer cela en jeu en temps réel?

+2

Vous n'écrivez pas un jeu avec des exigences FPS si strictes dans une langue GC'd, ou vous ne créez pas assez d'ordures pour faire un cycle GC prendre plus de temps que acceptable. Essayez d'abord s'il y a un impact perceptible. – delnan

Répondre

10

Le pouvoir de Lua, c'est qu'il vous libère de votre chemin. Voulez-vous des cours? Cela peut être construit avec des métabalises. Voulez-vous sandboxing? utiliser lua_setfenv.

En ce qui concerne le garbage collector. Utilisez-le comme d'abord. Si plus tard vous trouvez des problèmes de performance, utilisez lua_gc pour affiner son comportement.

Quelques exemples:

  • Désactiver le garbage collector au cours de ces moments où le ralentissement serait un problème.

  • Laissez le garbage collector désactivé et ne l'actionnez que lorsque la logique du jeu indique que vous avez une certaine marge de sécurité sur votre compte FPS. Vous pouvez pré-régler la taille du pas ou découvrir la taille de pas optimale lors de l'exécution.

  • Désactivez le collecteur et effectuez une collecte complète aux points d'arrêt, c'est-à-dire un écran de chargement ou une scène coupée ou changez à tour de rôle dans un jeu de siège chaud.

Vous pouvez également envisager un langage de script alternatif. Squirrel essaie très dur d'être une deuxième génération Lua. Il essaie de garder toutes les bonnes caractéristiques de Lua, tout en abandonnant toutes ses erreurs de conception. L'une des grandes différences entre les deux est squirrel uses reference counting au lieu de garbage collection. Il s'avère que le comptage des références peut être un peu plus lent que le garbage collection mais il est très déterministe (AKA en temps réel).

+0

Merci pour votre réponse. Votre suggestion 'Squirrel' semble très bien. Je vais le creuser bientôt :) – Eonil

3

La bonne façon de gérer est:

  1. Ecrire un petit prototype avec seulement les choses essentielles que vous souhaitez tester. Le profil beaucoup, reproduisant les différents scénarios qui pourraient arriver dans votre jeu (beaucoup de mémoire disponible, peu de mémoire disponible, différents nombres de fils, ce genre de chose)
  2. Si vous ne trouvez pas un goulot d'étranglement visible , vous pouvez utiliser Lua. Sinon, vous devrez chercher des solutions alternatives (peut-être Lisp ou Javascript)
+0

Il est triste ce problème est non-évitable, seulement peut être réduit. – Eonil

2

Vous pouvez patcher le CPG Lua de façon à limiter la durée de chaque cycle de collecte. E.g: http://www.altdevblogaday.com/2011/07/23/predictable-garbage-collection-with-lua/

Je crois qu'il est toujours possible d'avoir de longs temps de pas GC lors de la collecte de très grandes tables. Par conséquent, vous devez adopter un style de programmation qui évite les grandes tables.

L'article suivant présente deux stratégies d'utilisation de Lua pour le contrôle de robot en temps réel (1. ne génèrent pas d'ordures, ou 2.en utilisant un allocateur O (1) et syntonisez lorsque la collecte GC est exécutée): https://www.osadl.org/?id=1117

+0

Le premier lien a disparu 404. Heureusement, il a été republié et l'original peut encore être trouvé ici: http://kalogirou.net/2011/07/23/predictable-garbage-collection- avec-lua / –