LSL Script Memory/es

From Second Life Wiki
Jump to navigation Jump to search

Memoria de Script

Todos los scripts en LSL comienzan con 16 kilobytes de memoria y esa memoria se usa rápidamente. Abajo está una lista de código y uso de memoria.

Todos los datos a continuación fueron compilados usando llGetFreeMemory(). Como el compilador de LSL no es un programa simple, los datos abajo pueden no ser 100% correctos. De hecho, parte de los datos son incorrectos y necesitan correciones.

Todavía quedan partes que pueden mejorarse y muchas más que necesitan detalles adicionales. Si alguien tiene tiempo y no sabe que hacer, juege con el uso de memoria para diferentes funciones. Una lista de actualizaciones necesarias se encuentra al final de la página.

Variables

Declarando variables como globales

Uso de Memoria de Variables

integer  10
float    10
string   18 + 1 por carácter
key      18 + 1 por carácter
vector   18
rotation 22
list     21 + lista de uso de memoria

Lista de Uso de Memoria

integer  15
float    15
string   12 + 1 por carácter
key      12 + 1 por carácter
vector   23
rotation 27
list     Las Listas no pueden contener otras listas

Declarando variables dentro del estado predeterminado

Uso de Memoria de Variables

integer  15
float    15
string   12 + 1 por carácter
key      12 + 1 por carácter
vector   31
rotation 39
list     15 + lista de uso de memoria

Lista de Uso de Memoria

integer  7
float    7
string   4 + 1 por carácter
key      4 + 1 por carácter
vector   23
rotation 30
list     Las Listas no pueden contener otras listas

Simplemente declarando valores

Colocando un Valor en la Pila (Stack)

Integers 1 + 4 bytes para el valor
Float    1 + 4 bytes para el valor
String   1 + bytes por carácter + 1 byte para nulo
Key      1 + bytes por carácter + 1 byte para nulo
Vector   1 + 3 * float cost
Rotation 1 + 4 * float cost
List     1 + 4 para la longitud de la lista + uso de lista de memoria

Remover un valor de una pila cuesta 1 byte.

Lista de Uso de Memoria

Integers 7
Float    7
String   4 + 1 por carácter
Key      4 + 1 por carácter
Vector   23
Rotation 30
list     Las listas no pueden contener listas

Constantes

Todas las contantes de número entero usan 6 bytes de memoria.

Otras Constantes

ZERO_VECTOR   16
ZERO_ROTATION 21
NULL_KEY      39

Extras

6 bytes para variables de referencia

Ejemplos

integer i; //10 bytes

default {
 state_entry() {
  list l = ["Testing", "This"] //15 (list) + 15 (string) + 8 (string)
 }
}

Funciones

Declarando funciones

Las funciones requieren 16 bytes para crearse con 3 bytes por parámetro, además del tipo de retorno.

Tipos de retorno

integer  4
float    4
string   4
key      4
vector   20
rotation 27
list     4

Declarando variables en funciones

Uso de Memoria de Variables

integer  11
float    11
string   8 + 1 por carácter
key      8 + 1 por carácter
vector   19
rotation 23
list     11 + lista de uso de memoria

Lista de Uso de Memoria

integer  7
float    7
string   4 + 1 por carácter
key      4 + 1 por carácter
vector   23
rotation 30
list     Las listas no pueden contener listas

Llamando funciones

21 bytes para llamar a una función sin retorno
21 bytes para llamar a una función con cualquier retorno + tipo de retorno
Reste el número de parámetros ingresados

Tipos de Retorno

integer 2 float 2 string 10 + 1 por carácter devuelto key 10 + 1 por carácter devuelto vector 2 rotation 2 list 18 + lista de uso de memoria

Ejemplos

list f() {  //16 (function) + 4 (return)
    list ret = [0]; //11 (list) + 7 (integer)
    return ret; 6 (list)
}  
string f() {
    return "";
}

default {
    state_entry() {
        f();   //21 (call to f) + 10 (returns string)
    }
}

Operadores

Lista de Operadores

+  1
-  1
*  1
/  1
%  1
&  0
|  0
^  0
!  0
>> 0
<< 0
~  1
== 1
<= 1
<  1
>= 1
>  1
!= 1

Asignación

Asignar valores a variables toma muchos bytes menos uno.

Ejemplos

string s; //12 bytes
s;        //6 bytes
"";       //3 bytes (vea a continuación)
s = "";   //8 (6 (string) + 3 (null string) - 1) bytes

Pero...

string s = ""; //12 bytes
integer i; //15 bytes
i = i + 1 // 6 bytes (integer) + 6 bytes (integer) + 6 bytes (1) + 1 byte (addition) - 1 byte (assignment)

Declaraciones

if    6
while 11
for   11
do    6
jump  5
@     0
state 5

Ejemplos

if (5 < 10) { // 6 (if) + 6 (integer) + 6 (integer) + 1 (compare)
//Haz algo aquí
}
while (1 < 2 & 3 < 4) { // 11 (while) + 4*6 (4 integers) + 2 (2 compares)
//Haz algo aquí
}

Moldeado de Tipos (Typecasting)

integer  10
float    10
string   10
key      10
vector   10
rotation 10
list     25

Estados

14 bytes por cualquier event en un estado + 1 por cada parámetro 17 bytes para crear un estado nuevo

Actualizaciones Necesarias

Se necesitan varias actualizaciones para esta página. Las más urgentes se encuentran a continuación:

  • Verificar todos los datos
  • Aclaración de explicaciones
  • Investigar como trabajan las funciones
    • Llamar funciones
    • Como los tipos de retorno afectan los valores devueltos
  • En el código a continuación, la llamada llGetFreeMemory() regresa un valor diferente. ¿Cómo se afecta? ¿Por qué?
default {
     state_entry() {
          llOwnerSay((string)llGetFreeMemory());
          list l = ["", "", "", ""];
          llOwnerSay((string)llGetFreeMemory());
     }
}