2010-10-31 32 views
7

Como sé, el GC de rastreo no puede evitar el bloqueo de roscas durante el GC completo.GC de Lua y juego en tiempo real

He usado XNA + C#, y la hora del GC era imposible de eliminar. Así que cambié al lenguaje de nivel inferior C, pero me di cuenta de que necesitaba un lenguaje de scripting. Estoy considerando a Lua, pero estoy preocupado por el mecanismo de GC de Lua. Lua está usando GC de rastreo incremental, y el bloqueo de subprocesos también debería ser.

Entonces, ¿cómo debo manejar esto en el juego en tiempo real?

+2

No escribe un juego con requisitos tan estrictos de FPS en un lenguaje GC, o no crea suficiente basura para hacer que un ciclo de GC tarde más de lo aceptable. Primero prueba si hay un golpe notable. – delnan

Respuesta

10

El poder de Lua es que se sale de su camino. ¿Quieres clases? Eso se puede construir con metatables. ¿Quieres sandboxing? use lua_setfenv.

En cuanto al recolector de basura. Úselo como es primero. Si luego encuentra problemas de rendimiento, use lua_gc para ajustar su comportamiento.

Algunos ejemplos:

  • Desactiva el recolector de basura durante esos momentos en los que la desaceleración sería un problema.

  • Deje el recolector de elementos no utilizados deshabilitado y solo párelo cuando la lógica del juego indique que tiene espacio para la cabeza en su conteo de FPS. Puede preajustar el tamaño de paso o descubrir el tamaño de paso óptimo en tiempo de ejecución.

  • Desactive el colector y realice una recopilación completa en los puntos de parada, es decir, una pantalla de carga o una escena de corte o un cambio de turno en un juego de asientos calientes.

También podría considerar un lenguaje de scripting alternativo. Squirrel trata muy duro de ser una segunda generación de Lua. Intenta mantener todas las buenas características de Lua, al tiempo que abandona cualquiera de sus errores de diseño. Una de las grandes diferencias entre los dos es squirrel uses reference counting en lugar de la recolección de basura. Resulta que el recuento de referencias puede ser un poco más lento que la recolección de basura, pero es muy determinista (AKA en tiempo real).

+0

Gracias por la respuesta. Su sugerencia 'Squirrel' se ve muy bien. Voy a cavar pronto :) – Eonil

3

La forma correcta de manejar esto es:

  1. escribir un pequeño prototipo con sólo las cosas básicas que desee probar.
  2. Perfíllo mucho, reproduciendo los diferentes escenarios que podrían suceder en tu juego (mucha memoria disponible, poca memoria disponible, diferentes números de hilos, ese tipo de cosas)
  3. Si no encuentras un cuello de botella visible , puedes usar Lua. De lo contrario, tendrá que buscar soluciones alternativas (tal vez Lisp o Javascript)
+0

Es triste que este problema no se pueda evitar, solo se puede reducir. – Eonil

2

Puede parchar el Lua GC para limitar el tiempo de cada ciclo de recolección. E.g: http://www.altdevblogaday.com/2011/07/23/predictable-garbage-collection-with-lua/

Creo que todavía es posible tener largos tiempos de paso del GC al recopilar tablas muy grandes. Por lo tanto, debe adoptar un estilo de programación que evite tablas grandes.

En el siguiente artículo se describen dos estrategias para usar Lua para el control de robot en tiempo real (1. no generar basura, o 2.utilizando un asignador O (1) y sintonizar cuando se ejecuta la recopilación de GC): https://www.osadl.org/?id=1117

+0

El primer enlace ha sido 404. Afortunadamente fue un repost y el original todavía se puede encontrar aquí: http://kalogirou.net/2011/07/23/predictable-garbage-collection- con-lua / –

Cuestiones relacionadas