Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Otro problemita...

Iniciado por Halcon07, 14 de Marzo de 2008, 11:28:05 PM

« anterior - próximo »

Halcon07

Como les va? en esta ocacion me gustaria saber si alguien me podria ayudar a resolver un problema que tengo con el juego que estoy creando pues resulta que ahora consume recursos de la maquina de manera imprecionante casi cada dos segundos aumenta el uso de memoria del sistema 2 MB :shock:  y pues esto hace que despues de un tiempo el juego se torne muy lento, tengo un personaje que se mueve en un mapa de forma animada con el uso de un timer de vb. Eh pensado la posibilidad de que se deba a que en el bucle principal dibujo demaciados graficos y tal vez cada vez que se recorre el ciclo esto consume la memoria, esto es lo que mas o menos hago:


While Ciclo
       
       'Trazo del Piso
       Call DirectDraw.DRAW_AdvMap(ImgPiso1, 450, 85, 0, 50, 50, Blendop_Color, &HFFFFFFFF, Mirror_None, Filter_Bilinear, Isometric_Base)
       Call DirectDraw.DRAW_AdvMap(ImgPiso2, 500, 110, 0, 50, 50, Blendop_Color, &HFFFFFFFF, Mirror_None, Filter_Bilinear, Isometric_Base)
       Call DirectDraw.DRAW_AdvMap(ImgPiso1, 550, 135, 0, 50, 50, Blendop_Color, &HFFFFFFFF, Mirror_None, Filter_Bilinear, Isometric_Base)

       ...



Y asi sucesivamente hasta dibujar 64 pisos y 32 paredes, ademas de algunos objetos decorativos...
Se que hay alguna forma de hacer esto mas simple pero lo que no se es si este sea el problema del consumo de memoria o sea otro inconveniete.

[EX3]

No estaras cargando los graficos continuamente en el juego? El que dibujes o no dibujes no tiene por que aumentar consumo de recursos en RAM de forma tan excesiva.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Halcon07

Cita de: "[EX3"]No estaras cargando los graficos continuamente en el juego? El que dibujes o no dibujes no tiene por que aumentar consumo de recursos en RAM de forma tan excesiva.

Salu2...

Si haci es... cargo una imagen en el ciclo constantemente que indica que la accion del jugador si esta moviendoce hacia alguna direccion o si esta quieto...
Prove quitar la carga de esas imagenes y efectivamente ese es el gran consumo en ram. Pero ahora no se como hago para que la imagen cambie haciendo el efecto de animacion :? ...

[EX3]

Es que no debes cargar continuamente imagenes si no almacenar en memoria las que vayas a usar en escena. Cada vez que cargas una nueva imagen estas creando un grafico nuevo en memoria (en caso de que no descargues la anterior) y esto no solo te consume mas memoria si no que tambien baja considerablemente el rendimiento del programa, y esto pasa con cualquier api grafico que utilices, no solo con dx_lib32.

Para hacer animaciones tendrias dos formas. Una seria cargar todos los fotogramas de la secuencia de animacion en un array y simplemente ir cambiando el grafico a dibujar. La otra seria similar a la primera pero tendrias solo una textura similar a esta:

Y definir las areas de los fotogramas de la animacion y seleccionarlas con MAP_SetRegion() para dibujarlas.

Aunque sea un poco mas coñazo te recomiendo el segundo metodo ya que es mas optimo en rendimiento y aprovecha mejor la memoria (menos consumo de memoria y mas rapido leer de una textura de 512x512 que leer 25 texturas de 32x64)

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Halcon07

Muy bien!!!
Gracias por la ayuda [EX3] , era exactamente lo que queria, el metodo que estaba usando era el primero que me decis, pero con el segundo tendre un entorno de trabajo mas optimo al manejar menos lineas en carga de graficos. Si nececito algo mas ya les molestare despues :P ...nos vemos luego.

[EX3]

El primer metodo te resulta igual de valido, pero cargando todas las imagenes en memoria la principio, no una a una cada vez que actualizas la animacion :P Aun asi el segundo metodo resulta mas optimo por lo que te comentaba.

Tienes que tener en cuenta eso que te comento de cargar previamente todos los recursos del juego, si es un juego grande entonces solo los recursos del nivel o escenario que vayas a mostrar, pero nunca cargues "dinamicamente" en mitad del juego. Igualmente, cuando ya no vayas a utilizar un recurso, descargalo de memoria, preferiblemente al finalizar un nivel para pasar a otro.

// nuevo nivel //

// cargar recursos para este nivel
cargar graficos()
cargar sonidos()
// ejecutar bucle del juego
gameloop
{
  ejecutar logica()
  dibujar escena()
}
// al finalizar nivel, descargamos los recursos que ya no necesitamos
descargar recursos()


Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Halcon07

Arrrggg!!! ahora se me daño lo que tenia :evil:
Eh transportado el proyecto que tenia en vb 6.0 a vb.net 2005 y despues de varios retrazos consegui correrlo bien, ahora luego de hacer varias modificaciones me encontre con un nuevo problema a la hora de dibujar un sprite y llevo toda la mañana intentando resolverlo:

'en el ciclo prinsipal del programa tengo estas imagenes para cargar dependiendo del valor de JugPosReposo
If Jugador.JugPosReposo = 1 And DirectInput.Key(dx_lib32.Key_Const.Key_Up) = False Then Call DirectDraw.DRAW_Map((Mapa.ImgJugArr0), (Jugador.JugPosX), (Jugador.JugPosY), 0, 0, 0)
           If Jugador.JugPosReposo = 2 And DirectInput.Key(dx_lib32.Key_Const.Key_Up) = False Then Call DirectDraw.DRAW_Map((Mapa.ImgJugDer0), (Jugador.JugPosX), (Jugador.JugPosY), 0, 0, 0)
           If Jugador.JugPosReposo = 3 And DirectInput.Key(dx_lib32.Key_Const.Key_Up) = False Then Call DirectDraw.DRAW_Map((Mapa.ImgJugAba0), (Jugador.JugPosX), (Jugador.JugPosY), 0, 0, 0)
           If Jugador.JugPosReposo = 4 And DirectInput.Key(dx_lib32.Key_Const.Key_Up) = False Then Call DirectDraw.DRAW_Map((Mapa.ImgJugIzq0), (Jugador.JugPosX), (Jugador.JugPosY), 0, 0, 0)


el problema viene en la carga de la primera imagen ImgJugArr0 lo hago en una clase llamada mapa asi:


ImgJugArr0 = Demo.DirectDraw.MAP_Load("Imagenes/JugArr0.png", 0)
ImgJugArr0 = Demo.DirectDraw.MAP_Load("Imagenes/JugArr0.png", 0)
ImgJugDer0 = Demo.DirectDraw.MAP_Load("Imagenes/JugDer0.png", 0)
ImgJugIzq0 = Demo.DirectDraw.MAP_Load("Imagenes/JugIzq0.png", 0)
ImgJugAba0 = Demo.DirectDraw.MAP_Load("Imagenes/JugAba0.png", 0)


??? de manera extraña debo cargar ImgJugArr0 dos veces seguidas por que de lo contrario la imagen no aparece y cada vez que la invoco simplemente no aparece, queda negro ese espacio, y tan solo ocurre con esa imagen, que explicacion podria tener ese problema? llevo toda la mañana buscando el incombeniente y apuesto que es una tonteria bien grande :evil:

[EX3]

Pues sinceramente, ni idea. Te pasa con cualquier textura o solo con esa cuando la cargas la primera vez? Llevo desarrollando un motor en .NET con dx_lib32 desde Noviembre y no me ha sucedido tal error que comentas :? Si esta fallando la primera carga recoge el valor que te devuelve la funcion y comprueba con cual constante de error de la enumeracion  dx_lib32.GFX_ErrorCodes coincide con el.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.