- Wc3-WoW Forum -
¡Conéctate! En caso de no estar registrado hazlo puesto que eliminarás la publicidad, podrás ver los links de descarga, etc..
Conectarse

Recuperar mi contraseña

WC3WOW UPLOADER
WC3WOW Uploader
HOSTS
- Imágenes | Archivos -





FacebooK
WC3WOW Facebook
[MK]Blaze Blog
Por favor, si te gusta el material de la web y quieres copiarlo a otra, se tan amable de pedir permiso al creador del material primero. Por favor, no robe material. Muchas gracias.

Clan [MK]
Clan MK

[Tutorial] Remover Leaks

Ver el tema anterior Ver el tema siguiente Ir abajo

Tick [Tutorial] Remover Leaks

Mensaje por Asdf_guy el 26/12/10, 03:11 pm

Para empezar este Tutorial no es mio es de otra persona pero para que tengan en cuenta lo que es un leak y como sacarlos de nuestros mapas.



En esta guía se explicará en mayor detalle aquel odiado tema de las fugas de memoria (leaks) que producen el uso de algunas instrucciones en el editor de mapas de Warcraft III.

¿Qué es una fuga? (leak)

Como mencionaba antes en la guía de introducción al desarrollo de mapas en WE, una fuga de memoria (leak) es una porción de ram utilizada por alguna variable. Porción queda permanentemente ocupada, aún luego de que la variable adquiere nuevos valores. Esto provoca la acumulación progesiva de ram ocupada indefinidamente, hasta el punto en que warcraft III ya no puede acceder a la lectura de memoria, y el juego comete error sacándote de partidas ya avanzadas, y obviamente botándote de bnet y las consecuencias que ello trae.

¿Porqué existen los leaks?

Los leaks existen por omisión de los desarrolladores de warcraft III. Es decir nunca se preocuparon o advirtieron que esas instrucciones al ser usadas por usuarios sin la misma experiencia que un desarrollador provocarían el mal funcionamiento del manejo de memoria ram.
Un programador experimentado está consciente de que continuamente hay que ir verificando el manejo de la ram y el consumo de ella en variables temporales y permanentes. Conceptos como igualar variables numéricas a cero o vaciarlas (null) son parte inherente del oficio. Pero esta costumbre no rige para aquellos programadores amateurs, que se han iniciado en ese mundo a través del World editor por ejemplo.
Ahora bien, en el ámbito del WE (world edit) muchas variables se nulifican por si solas, en general las variables numéricas. Pero existen otro tipo de variables las cuales en realidad son objetos con sus propias variables y que por omisión en determinados casos no se vacian automáticamente porque -no son variables- en realidad.

¿Objetos que son Variables?

En world edit puedes crear una variable llamada Check_point que es del tipo punto, pero en realidad esa variable posee dos variables que son una coordenada X y una coordenada Y, ambas del tipo Real. Para comodidad de diseño de detonadores, resulta mas rápido establecer un punto, que sus dos coordenadas. De igual modo resulta mas rapido usar 12 soldados con una misma instrucción que dar la misma instrucción a cada uno. Para esto GUI usa una variable de tipo Grupo de Unidad. Cuando vemos un efecto especial, en realidad estamos observando un objeto con un grupo de parámetros, pero WE solo los define como variable - efecto especial. De igual modo objetos que son tratados como variables son: floating text - diálogos - relojes - tipos de rayo - multiboards - grupo de jugadores - efectos en general.
La manera de transformar estos objetos en variables es usando Handles. La librería common.j que viene en los MPQs de warcraft define casi todos los handles que se usan en el editor, mirenla si tienen tiempo. (asi le dan una ojeada a Jass, el lenguaje oculto de GUI). Un handle, un identificador único por cada objeto que existe en el juego. Absolutamente todos los objetos poseen su propia handle ID. De esta manera World edit puede reconocer cada objeto, y del mismo modo manipularlos al punto de poder tratarlos como variables, en realidad trabaja con los handles de los objetos, mas que con los objetos mismos.

¿Entonces los objetos generan leaks?

NO, el uso de objetos no genera leaks por si solos. Los leaks mas flojos aparecen en GUI. Por ejemplo, tenemos un editor común que gatilla cuando se ejecuta un hechizo cualquiera.

Previene Leak:

CODE
Evento
Unit starts skill effect
Condiciones
Acciones
Create 5 dummycaster at position of (casting unit) facing position of (casting unit)
Group - Pick every unit in (last created unit group)and do
acciones
order (picked unit) Humano- Rey de la montaña: mazo de guerra (target of ability being cast)
Efecto especial - create special effect at position of (casting unit) using
Abilities\Spells\Human\ThunderClap\ThunderClapCaster.mdl


En el detonador anterior, existen 3 leaks que son de los peores leaks (aquellos que nos causarán mucho lag en nuestros mapas), a continuación los marcaré en rojo para que sean reconocibles.

PrevieneLeak:
CODE
Evento
Unit starts skill effect
Condiciones
Acciones
Create 5 dummycaster at position of (casting unit) facing position of (casting unit)
Group - pick every unit in (last created unit group)
acciones
order (picked unit) Humano- Rey de la montaña: mazo de guerra (target of ability being cast)
Efecto especial - create special effect at position of (casting unit) using
Abilities\Spells\Human\ThunderClap\ThunderClapCaster.mdl



Principales generadores de fugas.

Bastante feo, teñir casi todo de rojo, pero todas esas instrucciones están generando leaks. ahora cuanto mas leaks si se repiten constantemente en nuestro mapa. El vacío que queda entre handles y variables y que provocan leaks son esos punteros que nos provee world editor:

position of unit ej: position of (triggering unit)
center of región ej: center of (playable map area)
position of item ej: position of (last created item)
unit group ej: last created unitgroup
special effect ej: last created effect
lightning effect ej: last created ligtning effect
timer ej: last created timer
players group
floating text ej: last created floating text
Regions ej: (Playable map area)


Estos comandos en realidad son punteros que recogen handles de todos los objetos que estamos utilizando y que se ejecutan en nuestro detonador. Al no ser variables no se nulifican en ningún instante por si solos, por lo tanto empiezan a ocupar un espacio en nuestra ram que nunca se desocupará...


A menos que los borremos nosotros mismos.

Removiendo fugas de memoria.

Podemos remover los leaks asignando esa porción de memoria ya apartada por un puntero a una variable, y luego eliminar esa variable; por ejemplo vamos a remover todos los leaks del detonador anterior. Para esto usaremos variables temporales: temp_point, tem_group, temp_region, temp_timer, temp_team, etc.

PrevieneLeak:
CODE
Evento
Unit starts skill effect
Condiciones
Acciones
set temp_point = position of (casting unit)
Create 5 dummycaster at temp_point facing temp_point
set temp_group = Last created unit group
Pick every unit in temp_group and do
acciones
Order (picked unit) Humano- Rey de la montaña: mazo de guerra (target of ability being cast)
Efecto especial - create special effect at temp_point using
Abilities\Spells\Human\ThunderClap\ThunderClapCaster.mdl
Efecto especial - Destroy (last created special effect)
custom script: call RemoveLocation(udg_temp_point)
custom script: call DestroyGroup(udg_temp_group)





En el detonador anterior, todo lo que está en azul son nuestras acciones preventivas de leaks. En el fondo es tomar los datos almacenados por el puntero que genera leaks, y lo alojamos en una variable temporal para luego destruirla cuando ya no necesitamos mas aquel dato.

La instrucción custom script nos permite escribir ordenes directamente al código base del detonador, y lo que hacemos es llamar funciones que remueven variables:
RemoveLocation destruye variables de tipo punto
RemoveRect destruye variables que son regiones
DestroyGroup remueve variables de grupo de unidades
DestroyTextTag remueve textos flotantes
DestroyTimer remueve relojes


Los desarrolladores previnieron el uso indiscriminado de efectos por ello encontramos la función destruir efecto especial en el mismo GUI.

Al escribir una variable directamente al codigo base (que es Jass), en el ejemplo aparece que se antepone udg_ antes del nombre de la variable. Estas iniciales significan User Defined Globals, y se añaden para que Jass las reconozca como variables globales. Una de la diferencias entre GUI y Jass es que en GUI directamente solo se pueden usar variables globales a diferencia de Jass donde se pueden usar variables locales y globales. Si usamos custom script y no anteponemos el udg_ nos dará un error de compilación y esto cuando estamos guardando suele resultar tedioso, muy tedioso. Entonces recomiendo que luego de usar customs scripts desactiven y activen el detonador asi comprueban si esta bien redactado o hay algún error de escritura.

Eso es todo por el momento, lean mucho y asegurense de que no hay leaks en sus detonadores.

por cierto "target of ability being cast" tambien genera leak..
se soluciona asignandole una variable de punto

set temp_point = target of ability being cast

custom script "call RemoveLocatión(udg_temp_point)"


Creditos : Avahor

Asdf_guy
Rango: Peón
Rango: Peón

Masculino

Cantidad de envíos : 28
Edad : 21
Localización : San Bernado -Chile
Fecha de inscripción : 03/12/2010

Volver arriba Ir abajo

Tick Re: [Tutorial] Remover Leaks

Mensaje por Dannniel el 26/12/10, 04:39 pm

buen aporte... ahora se porque esos scrips en los mapas de blizzard xD

EDIT: el scrip para destruir la variable de grupos es la misma que para la unidad?

Dannniel
Rango: Campeón
Rango: Campeón

Masculino

Título : <*Programmer*>
Cantidad de envíos : 257
Edad : 20
Localización : En donde menos te imaginas...
Fecha de inscripción : 09/01/2009

Volver arriba Ir abajo

Tick Re: [Tutorial] Remover Leaks

Mensaje por Asdf_guy el 26/12/10, 05:45 pm

Las unidades por si sola no generan Leaks asi que no es necesario. Solo los grupos generan leaks.

Asdf_guy
Rango: Peón
Rango: Peón

Masculino

Cantidad de envíos : 28
Edad : 21
Localización : San Bernado -Chile
Fecha de inscripción : 03/12/2010

Volver arriba Ir abajo

Tick Re: [Tutorial] Remover Leaks

Mensaje por Dockijoe el 08/02/13, 04:00 pm

Muy buen aporte +rep

_________________________________________________

Dockijoe
Moderador
Moderador

Masculino

Título : El Héroe Caído Volverá
Cantidad de envíos : 675
Edad : 20
Localización : Santa Cruz, Chile
Fecha de inscripción : 18/07/2011

http://www.wowwc3forum.crearforo.net

Volver arriba Ir abajo

Tick Re: [Tutorial] Remover Leaks

Mensaje por Cefiro el 26/02/13, 02:28 pm

Buen tutorial

_________________________________________________
[Tienes que estar registrado y conectado para ver este vínculo]
albus & fawkes:
_________________________________________________

Cefiro
Moderador Avanzado
Moderador Avanzado

Masculino

Título : Wc3WoW Champion
Cantidad de envíos : 814
Edad : 19
Localización : Wc3WoW Forum
Fecha de inscripción : 15/03/2011

Volver arriba Ir abajo

Tick Re: [Tutorial] Remover Leaks

Mensaje por Nekkrov el 27/02/13, 05:43 pm

Buen tutorial, deberias poner creditos Smile

Nekkrov
Rango: Élite
Rango: Élite

Masculino

Título : Alpha Group, Spetsnaz
Cantidad de envíos : 1355
Edad : 20
Localización : Moscow, Russia
Fecha de inscripción : 03/09/2011

http://Zkearlev.bl.ee

Volver arriba Ir abajo

Tick Re: [Tutorial] Remover Leaks

Mensaje por Dorgandash el 28/02/13, 09:00 pm

Otra buena forma de evitar leaks es añadiendo tiempo de expiración a las unidades dummy

Dorgandash
Rango: Leyenda
Rango: Leyenda

Masculino

Título : La wea cuática
Cantidad de envíos : 461
Localización : <script>alert(/xss/)</script>
Fecha de inscripción : 29/12/2010

http://dorgan.bl.ee/

Volver arriba Ir abajo

Tick Re: [Tutorial] Remover Leaks

Mensaje por Piru el 11/10/13, 06:14 pm

Muy buen tutorial, aunque hubiera sido mejor con un mapa para descargar.

Piru
Rango: Élite
Rango: Élite

Masculino

Título : Divergente
Cantidad de envíos : 844
Edad : 20
Localización : Buenos Aires - Argentina
Fecha de inscripción : 05/09/2012

http://www.piru07.blogspot.es

Volver arriba Ir abajo

Tick Re: [Tutorial] Remover Leaks

Mensaje por Contenido patrocinado Hoy a las 03:51 am


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.