Wc3WoW Forum
¡Bienvenido a Wc3WoW Forum! Aquí se encontrará
con una gran variedad de mapas, modelos, iconos,
texturas, tutoriales, herramientas, y muchas cosas
más para el World Editor de Warcraft III. Regístrese
para tener acceso a todo nuestro contenido, de una
forma rápida, segura, y sin anuncios molestos.
Conectarse

Recuperar mi contraseña

Últimos temas
» [Vídeo Tutorial] Convertir formatos OBJ. a MDX y BLP
Hoy a las 8:31 por JDTJ

» Hir'eek by Henry
Hoy a las 3:25 por JC

» (Iconos) Habilidades de Criaturas Venenosas by Alesus
Hoy a las 3:24 por JC

» Sally Whitemane (Muerta Viviente) by JDTJ
Hoy a las 0:36 por jho

» Profesor Putricidio by JDTJ
Ayer a las 22:27 por jho

» Mannoroth by FerSZ
Ayer a las 21:35 por NICO184

» Aenea by JDTJ
Ayer a las 19:09 por Dakhron Windrunner

» Campaña de Jaina
Ayer a las 18:07 por cruxwynn

» Memorias de Arthas
Ayer a las 18:05 por cruxwynn

» Campaña: Altos Elfos VS Elfos de Sangre
Ayer a las 17:55 por cruxwynn

Buscar
 
 

Resultados por:
 


Rechercher Búsqueda avanzada

Chatbox

[Tutorial] Remover Leaks

Ir abajo

Tema Resuelto [Tutorial] Remover Leaks

Mensaje por Asdf_guy el Dom 26 Dic - 12:11

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
avatar
Asdf_guy
Rango: Peón
Rango: Peón

Comentarios Comentarios : 27
Experiencia Experiencia : 2727
Reputación Reputación : 22
Alianza Monje Masculino
Vacío

Ver perfil de usuario

Volver arriba Ir abajo

Tema Resuelto Re: [Tutorial] Remover Leaks

Mensaje por Dannniel el Dom 26 Dic - 13:39

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?
avatar
Dannniel
Rango: Teniente
Rango: Teniente

Título : Wc3WoW Programmer
Comentarios Comentarios : 250
Experiencia Experiencia : 3557
Reputación Reputación : 221
Horda Renegado Brujo Alquimia Masculino
Premio Wc3WoW Premio Wc3WoW
Vacío
Tercer Gran Photoman
Tercer Lore Master
Vacío Colaborador Destacado Tutor Destacado

Ver perfil de usuario

Volver arriba Ir abajo

Tema Resuelto Re: [Tutorial] Remover Leaks

Mensaje por Asdf_guy el Dom 26 Dic - 14:45

Las unidades por si sola no generan Leaks asi que no es necesario. Solo los grupos generan leaks.
avatar
Asdf_guy
Rango: Peón
Rango: Peón

Comentarios Comentarios : 27
Experiencia Experiencia : 2727
Reputación Reputación : 22
Alianza Monje Masculino
Vacío

Ver perfil de usuario

Volver arriba Ir abajo

Tema Resuelto Re: [Tutorial] Remover Leaks

Mensaje por Dockijoe el Vie 8 Feb - 13:00

Muy buen aporte +rep
avatar
Dockijoe
Rango: Héroe
Rango: Héroe

Título : Top 12
Comentarios Comentarios : 639
Experiencia Experiencia : 3081
Reputación Reputación : 235
Alianza Caballero de la Muerte Masculino
Vacío
Team Fighter [3º Puesto]
Colaborador Destacado

Ver perfil de usuario

Volver arriba Ir abajo

Tema Resuelto Re: [Tutorial] Remover Leaks

Mensaje por Cefiro el Mar 26 Feb - 11:28

Buen tutorial
avatar
Cefiro
Rango: Leyenda
Rango: Leyenda

Título : Wc3WoW Champion
Comentarios Comentarios : 777
Experiencia Experiencia : 3358
Reputación Reputación : 431
Alianza Elfo de la Noche Mago Herrería Masculino
Premio Wc3WoW Premio Wc3WoW Premio Wc3WoW Premio Wc3WoW Premio Wc3WoW Premio Wc3WoW
Premio Wc3WoW Premio Wc3WoW Vacío Vacío Vacío Vacío
Forge Master
Primer Skinner Master
Forge Master Ultimate
Gran Colaborador Gladiador Ripper Destacado

Ver perfil de usuario

Volver arriba Ir abajo

Tema Resuelto Re: [Tutorial] Remover Leaks

Mensaje por Nekkrov el Miér 27 Feb - 14:43

Buen tutorial, deberias poner creditos :)
avatar
Nekkrov
Rango: Élite
Rango: Élite

Título : Top 1 - Elite
Comentarios Comentarios : 1318
Experiencia Experiencia : 2999
Reputación Reputación : 143
Neutral Trol Cazador Desuello Masculino
Vacío
Segundo Gran Mapper II
Colaborador Destacado

Ver perfil de usuario

Volver arriba Ir abajo

Tema Resuelto Re: [Tutorial] Remover Leaks

Mensaje por Dorgandash el Jue 28 Feb - 18:00

Otra buena forma de evitar leaks es añadiendo tiempo de expiración a las unidades dummy
avatar
Dorgandash
Rango: Campeón
Rango: Campeón

Título : Wc3WoW Developer
Comentarios Comentarios : 450
Experiencia Experiencia : 3042
Reputación Reputación : 230
Alianza Humano Pícaro Herrería Masculino
Premio Wc3WoW Premio Wc3WoW
Logo Master
Vacío
Tercer Gran Mapper II
Segundo Lore Master
Colaborador Destacado Tutor Destacado Gladiador

Ver perfil de usuario

Volver arriba Ir abajo

Tema Resuelto Re: [Tutorial] Remover Leaks

Mensaje por Piru el Vie 11 Oct - 16:14

Muy buen tutorial, aunque hubiera sido mejor con un mapa para descargar.
avatar
Piru
Rango: Leyenda
Rango: Leyenda

Título : Top 8
Comentarios Comentarios : 834
Experiencia Experiencia : 3154
Reputación Reputación : 275
Alianza Mago Masculino
Vacío
Segundo Gran Herrero
Colaborador Destacado Tutor Destacado

Ver perfil de usuario

Volver arriba Ir abajo

Tema Resuelto Re: [Tutorial] Remover Leaks

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba

- Temas similares

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