2009-09-05 20 views
6

Gente, ¿hay alguna manera de clonar un estado de Lua?Clonación del estado de Lua

En mi aplicación de juego, el procedimiento de inicialización de la máquina virtual Lua es bastante pesado (alrededor de 1 segundo, ya que muchos scripts se cargan a la vez). Tengo una máquina virtual Lua separada para cada agente autónomo y una vez que se crea el agente, su inicialización Lua afecta bastante al FPS.

Estoy pensando en el siguiente esquema: ¿qué hay de mantener el estado de Lua "prefabricado" que luego simplemente se clona para cada agente? ¿Es posible?

+2

Muchas personas escriben Lua mal, no es un acrónimo. ¿Podría modificar amablemente lo anterior para que siga la nomenclatura estándar? Nosotros tampoco escribimos PYTHON. Lua resulta ser un nombre de tres letras. Ver: http://www.lua.org/about.html – akauppi

+3

Oh, lo siento por eso. Gracias por la cabeza. – pachanga

+0

¿alguna vez encontró una manera de hacer esto? – DShook

Respuesta

4

Desea considerar el uso de corutinas de Lua para cada agente autónomo, en lugar de una máquina virtual completamente separada. Las coroutinas son una solución más liviana, pero pueden o no ser adecuadas para su aplicación.

Si no puede cambiar la arquitectura, puede intentar LuaJIT. Es podría hacer la inicialización lo suficientemente rápido para sus propósitos.

Más opciones:

  1. Rings: "Anillos es una biblioteca que proporciona una forma de crear nueva Lua afirma desde dentro Lua También ofrece una forma sencilla de comunicarse entre el creador (maestro) y el. estados creados (esclavos) ".

  2. Pluto: "en un archivo plano, y luego leer de nuevo en el mismo o en un universo diferente Lua '' Plutón es una biblioteca que permite a los usuarios escribir arbitrariamente grandes porciones de la" Lua universo

+0

Estaba pensando en usar coroutines, pero me temo que un error fatal en una corutina afectará a los demás, por eso no es opción ATM. Gracias por los enlaces! Actualmente estoy mirando LuaJIT y Rings. Los anillos parecen ser una posible solución para mi problema. – pachanga

+3

El error fatal en una corutina no afectaría a los demás de ninguna manera. Mientras estemos hablando del código Lua, las cosas suministradas por el usuario pueden ocasionar cualquier daño, por supuesto, está programado. –

+0

De hecho, necesito clonar un estado. Es por un marco de POS que estoy haciendo, y no quiero que el tipo que escribe el guión pueda robar contraseñas de tarjetas de crédito. La biblioteca EMV permite que el usuario personalice las pantallas a través de devoluciones de llamadas, y cada devolución de llamada activa una lua coroutine que carga las pantallas. Pero las corutinas comparten variables, y quiero todas las modificaciones al entorno variable durante la llamada de la contraseña revertida ... ¿Debería crear una nueva pregunta para esto? –

1

También hay carriles (download, docs) y dentro de la comparison a todos los productos similares que conozco.

sobre los anillos de la hoja de comparación dice:

Anillos ofertas separadas Lua estados, pero sin multihilo. Esto hace que sea simple, pero no usará más de un núcleo de CPU .

Nota: La hoja de comparación dice Lanes haría sólo 'tablas no cíclicos' mariscal. Sí hace ciclos, y gestiona funciones, valores ascendentes, etc. Y hace las copias entre estados Lua como copias directas, sin necesidad de codificar los contenidos en el medio. Esto lo hace rápido.

1

Si está en Linux, puede probar la biblioteca experimental lper, LPSM basada en uno de los autores de Lua.

+0

Sí, estoy en Linux, gracias por el enlace! – pachanga

1

Aviso, trabaja con Lua 5.2 y por encima de

Usted sólo puede restringir el acceso a la máquina virtual. Cree una instancia con todas las funciones requeridas, que no dependerá de _G (estado Lua global) y luego cree una tabla separada para cada cliente. Que usarán como su espacio de nombres global. Establecer una tabla como _G actual es posible a través de _ENV. Es un tema bastante difícil de explicar en una publicación. En resumen, usted prepara un _G "virtual" para su nuevo cliente y luego simplemente reemplaza _G por el código del cliente. There is where I advice you to start.

Aquí está el punto.

local _ENV = t -- change the environment. without the local, this would change the environment for the entire chunk

Basta con retirar local y se le cambia _ENV para todos código adicional. Buena suerte con los experimentos!

P. S. No olvide que puede establecer metatabla para las tablas _ENV y _G y prohíbe cambiar esa metatabla. Lua es realmente flexible aquí.