[Problema] Luces en casas

Lucho~

Usuario Bendecido
#1
Hola buenos días, bueno estuve haciendo un pequeño cambio en mi ao y quise poner de que en las casas (donde haya trigger 1) cuando es de noche o tarde, se pongan luces que iluminan alrededor de la casa.

Hice algo así.

Código:
Dim Y As Integer, X As Integer
    For Y = YMinMapSize To YMaxMapSize
        For X = XMinMapSize To XMaxMapSize
   If Clima = "Noche" Or Clima = "Tarde" Then
                           If MapData(X, Y).Trigger = 1 Then
    Engine.Light_Create X, Y, D3DColorXRGB(255, 255, 255), 1, 2
    End If
    End If
    Next X
    Next Y
Pero el tema es que tengo 100 fps y cuando pongo esto mis fps bajan a 10 o 12.

Necesitaría saber cual es la forma de que no laguee o otra forma de hacerlo

Cualquier ayuda me vendría de 10
 

Bau.

Mark my words, believe my soul.
#2
Hola buenos días, bueno estuve haciendo un pequeño cambio en mi ao y quise poner de que en las casas (donde haya trigger 1) cuando es de noche o tarde, se pongan luces que iluminan alrededor de la casa.

Hice algo así.

Código:
Dim Y As Integer, X As Integer
    For Y = YMinMapSize To YMaxMapSize
        For X = XMinMapSize To XMaxMapSize
   If Clima = "Noche" Or Clima = "Tarde" Then
                           If MapData(X, Y).Trigger = 1 Then
    Engine.Light_Create X, Y, D3DColorXRGB(255, 255, 255), 1, 2
    End If
    End If
    Next X
    Next Y
Pero el tema es que tengo 100 fps y cuando pongo esto mis fps bajan a 10 o 12.

Necesitaría saber cual es la forma de que no laguee o otra forma de hacerlo

Cualquier ayuda me vendría de 10
No entiendo mucho del tema pero eso no instanciaría una luz en cada tile con trigger 1? No podés intentar hacer menos luces pero más grandes? Quizás crear otro trigger que puedas poner en el centro de las casas y tenga la propiedad del trigger 1 y además agregue la luz.
 

Feer~

Oráculo Lvl 1
#3
Hola buenos días, bueno estuve haciendo un pequeño cambio en mi ao y quise poner de que en las casas (donde haya trigger 1) cuando es de noche o tarde, se pongan luces que iluminan alrededor de la casa.

Hice algo así.

Código:
Dim Y As Integer, X As Integer
    For Y = YMinMapSize To YMaxMapSize
        For X = XMinMapSize To XMaxMapSize
   If Clima = "Noche" Or Clima = "Tarde" Then
                           If MapData(X, Y).Trigger = 1 Then
    Engine.Light_Create X, Y, D3DColorXRGB(255, 255, 255), 1, 2
    End If
    End If
    Next X
    Next Y
Pero el tema es que tengo 100 fps y cuando pongo esto mis fps bajan a 10 o 12.

Necesitaría saber cual es la forma de que no laguee o otra forma de hacerlo

Cualquier ayuda me vendría de 10
Porque haces otros dos for anidados?
Pone la parte de las luces en donde se renderiza la capa 4, que es el techo.
 

Nait

Oráculo Lvl 1
#4
donde pones eso exactamente vos? mira te recomendaria una cosa en el sub Switch Map
abajo de

Código:
'Trigger used?
            If ByFlags And 16 Then
                Get handle, , MapData(X, Y).Trigger
            Else
                MapData(X, Y).Trigger = 0
            End If
pones
Código:
If Clima = "Noche" Or Clima = "Tarde" Then
                If MapData(X, Y).Trigger = 1 Then
                    Engine.Light_Create X, Y, D3DColorXRGB(255, 255, 255), 1, 2
                End If
            End If
debería funcionar y es optimo detecta el trigger 1 y coloca la luz en la posición y se lanza solo una vez el comando al cambiar de mapa obviamente.. salu2 espero que te sirva
 

NicolasRz

Newbie Lvl 4
#5
Código:
'Trigger used?
If ByFlags And 16 Then
    Get handle, , MapData(X, Y).Trigger
              
    If Clima = "Noche" Or Clima = "Tarde" Then
          If MapData(X, Y).Trigger = 1 Then
              Engine.Light_Create X, Y, D3DColorXRGB(255, 255, 255), 1, 2
        End If
    End If
              
Else
     MapData(X, Y).Trigger = 0
End If
Si lo queres mas optimo todavía, lo pones justo ahí abajo y evitas que compruebe si es un trigger valido > 0
 

Nait

Oráculo Lvl 1
#6
Código:
'Trigger used?
If ByFlags And 16 Then
    Get handle, , MapData(X, Y).Trigger
             
    If Clima = "Noche" Or Clima = "Tarde" Then
          If MapData(X, Y).Trigger = 1 Then
              Engine.Light_Create X, Y, D3DColorXRGB(255, 255, 255), 1, 2
        End If
    End If
             
Else
     MapData(X, Y).Trigger = 0
End If
Si lo queres mas optimo todavía, lo pones justo ahí abajo y evitas que compruebe si es un trigger valido > 0
contame que tiene de optimo tu formula?? si es igual a la que hice yo simplemente que dentro del IF del trigger agregar lo que puse
PD: NO CAMBIA ABSOLUTAMENTE NADA UN IF APARTE PORQUE NO TENEMOS QUE HACER NADA MAS QUE PREGUNTARLE AL VB SI EXISTE EL TRIGGER 1, Y SI EXISTE MANDAMOS LA LUZ SOBRE LAS POSICIONES X, Y asi que nose de donde sacas la palabra "MAS OPTIMO"
 

NicolasRz

Newbie Lvl 4
#7
Estas comparando Strings y después fijándose si en esa pos hay un trigger 1, Es mucho mejor que compruebe si hay un trigger valido y así evitamos el procesamiento al pedo. Por ende es mas optimo
 
Última edición:

Nait

Oráculo Lvl 1
#8
:/ bueno no me voy a volver a gastar en explicarte espero que te sirva esta solucion aconsejo para mantener el orden aca ese OPTIMO no existe ponelo aparte para mantener el orden y no hagas macanas ya es optimo cuando sacamos el FOR (BUCLE) asi que nada salu2
 

Wolftein

Computer's Scientist
Miembro del equipo
Administrador
Especialista de Tecnología
#9
:/ bueno no me voy a volver a gastar en explicarte espero que te sirva esta solucion aconsejo para mantener el orden aca ese OPTIMO no existe ponelo aparte para mantener el orden y no hagas macanas ya es optimo cuando sacamos el FOR (BUCLE) asi que nada salu2
@NicolasRz tiene razón, es inútil seguir preguntando en cada tile (donde nunca se cargo ningún 'Trigger'), que solo aquellos que si tienen. Sigue siendo mas óptimo y mejor (sea el grado que sea) que tu solución.

La solucion mas optima seria:

Código:
Dim IsNocheOrTarde as Boolean
IsNocheOrTarde = (Clima = "Noche" Or Clima = "Tarde")

For Y = YMinMapSize To YMaxMapSize
        For X = XMinMapSize To XMaxMapSize
          ' ... La carga del mapa como esta
          If ByFlags And 16 Then
               Get handle, , MapData(X, Y).Trigger
          
               If MapData(X, Y).Trigger = 1 And IsNocheOrTarde Then
                  Engine.Light_Create X, Y, D3DColorXRGB(255, 255, 255), 1, 2
               End if

         Else
               MapData(X, Y).Trigger = 0
         End If
      Next X
Next Y
Esta solución previene la comparación reiterada de 2 String (costoso) y previene comparar aquellos tiles que no tienen 'Trigger' y si lo tienen, que sean aquellos que sean '1'.

@Nait con esa actitud no creo que llegues muy lejos, no cuesta nada aceptar consejos de los demás, y es beneficioso.
 
Última edición:

Nait

Oráculo Lvl 1
#10
:/ pero es lo mismo esta dentro del BUCLE osea cuando llegue al if no vuelve a preguntar -.- sino que el valor de X & Y es igual eso es lo qe no entiende preguntas lo mismo es desordenar nada mas no mejora en nada
 
#11
Ya se sabe que no vuelve a preguntar pero si en el siguiente ciclo, a lo que se va es que puede ser mas optimo evitando que tenga 10k interacciones dentro del bucle a la cantidad justa de interacciones osea la cantidad de trigger validos <> 0 poniéndolo abajo Get handle, y comparar los strings 1 sola vez como hizo @Wolftein. Hace mas rápido el bucle y mas optimo. Aunque sea ínfima la optimización a la larga te darás cuenta.
 
Última edición:
#13
Agregaría que el D3DColorXRGB(255, 255, 255) lo calcules una única vez afuera de los bucles en una variable aparte; o que si solo vas a poner luces blancas lo reemplaces por un -1 y listo.

Y para hacerlo aún más óptimo, si pensás cambiar el "tiempo" o clima durante el transcurso del juego por lo que habría que estar prendiendo o apagando las luces, te diría que al cargar el mapa armes un array con las pociones que tengan el trigger 1. Entonces cuando tengas que prender/apagar luces solo recorres ese array actualizando posiciones específicas. Eso te va a ahorrar miles y miles de líneas que estás recorriendo y validando al pedo.

Por último, no te recomiendo usar los triggers para este tipo de cosas. Si vas a estar creando cosas de este estilo te va a ser mucho más útil crear una máscara de propiedades, que te permite setear múltiples a la vez en un mismo tile.

Saludos!

PD: También podes dejar las luces creadas y prendidas siempre, desde el mapeador, y cuando bajes la luz para que sea de noche/tarde, ya se van a notar por si solas xD
 

Lucho~

Usuario Bendecido
#14
Bueno estuve viendo sus comentarios y lo que me dijeron que ponga, no me resulta util, pero voy a ver si lo puedo incorporar al world editor aver si laguearia menos, y no constantemente. Muchas gracias y cualquier cosa vuelvo a responder a ver como me fue.
 
#15
Bueno estuve viendo sus comentarios y lo que me dijeron que ponga, no me resulta util, pero voy a ver si lo puedo incorporar al world editor aver si laguearia menos, y no constantemente. Muchas gracias y cualquier cosa vuelvo a responder a ver como me fue.
Si haces lo que te dijeron arriba, y el problema del bajón de FPS persiste, entonces el problema está en otro lado y no ahí. Ya que si cargas las luces directamente en la carga del mapa, se hará solo una vez y no tendría porque bajonearte los fps.
 

Lucho~

Usuario Bendecido
#16
Si sinceramente el bajon de fps sigue, lo cargo solamente en el mapas pero el bajon esta, no entiendo por que ya que tendria que laguearse al cambiar del mapa supongo y no constantemente, pero es algo raro, por que me va a 100 fps y cuando va a lugares donde hay luces, baja de una manera impresionante.
 
Arriba