Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Un Poco De Ifs Y Bools

Iniciado por shephiroth, 26 de Abril de 2004, 01:28:02 PM

« anterior - próximo »

shephiroth

 Buenas. Estoy haciendo un 2d en tiles en c usando opengl, pero esa no es la cuestion de la pregunta. Hay en un punto que he de optar por usar muchos ifs, o evaluar antes unos pocos bools, y luego hacer un if tocho. Pa que se vea más visual:


if (1=1){
if (2=2){
if (3=3){
return false;
}else{
if (5=5)
return false;
}else{
if (7=7)
....

ó

a=(1=1);
b=(2=2);
c=(3=3);
d=(5=5);
e=(7=7);
if ((a && b && !c) || (a && b && c && e))
return false
return true


No he puesto mucho porque no se me ocurria, y porque no quiero llenar esto de ifs, pero creo que la idea se quedo reflejada. Este es un codigo que mi programa ejecuta multitud de veces en cada frame, por lo que una milesimas de diferencia en este codigo podría acelerar o decelerar mucho el programa.

Alguien me podría guiar en este tema??

GRACIAS.

DraKKaR

 Yo lo único que te aconsejaría es que le dedicarás tiempo de optimización a partes del código que de verdad notarás mejora de rendimiento. Estoy seguro que por muy rebuscados que pongas esos ifs, no va a suponer ningún impacto en la velocidad de ejecución. Es más, los compiladores están lo suficientemente avanzados como para reordenar tu código de la forma más oóptima posible.
Estudia tu código y determina el cuello de botella, y una vez hecho eso optimiza únicamente eso.

De todas formas, yo creo que el primer ejemplo deberia ser mejor, ya que en el segundo ejemplo obligas a ejecutar todas las comparaciones, mientras que en el primero solo se ejecutarían algunas comparaciones si otras se cumplen. Todo esto es muy relativo, ya que como te he dicho antes, no sabes qué tecnicas de optimización, reordenación y ejecución de código planifica tu compilador.
Así que si fuese yo, lo dejaría de la forma que sea más comprensible su escritura y lectura.

Ale.

Zaelsius

 Vuelve a postear un código pero en C++, con el tipo de las variables,etc ..  
p.ej.: (1=1)?? :huh:  

shephiroth

 jajaja. Lo del 1=1 y 2=2 era para decir que ahi iban comparaciones, sin poner variables. Pero quizás con este ejemplo lo veas mejor (o no, quien sabe xDD). No es el que trato de hacer, este solo llega a nivel 3 de if, el q trato ahora es de 5 niveles y un poco más complejo xDD



if (velocidadx<0 && col>=1) //izquierda
{
if ((int)((newx+velocidadx)/tamtiles)!=(int)(newx/tamtiles))
{
if ((int)(newy/tamtiles)!=(float)(newy/tamtiles) //tenemos q comprobar varios tiles
&& MapaObstaculos[fil][col-1]!=' ') //y el primero esta ocupado
return false;    //colision
if (MapaObstaculos[fil-1][col-1]!=' ')  //comprobamos el otro
return false;    //colision
}
}

sés

 Quizás el usar un poco de álgebra de Boole y unas tablitas de verdad te faciliten un poco la vida. Prueba a hacerlas y mira si se simplifica la cosa.
Soy indeciso... ¿o no?

vicho

 cosas como

if(a=1)

siempre se cumplen
la comparacion es ==

shephiroth

 jajajaja, en parte tienes razon, pero solo en parte, te explico

Los compiladores actuales son tan listos que te dejan asignar un valor antes de comprobar el if..... es decir si tienes

if (a=(...una operacion larga...))
{}

primero resolvería la operación, le asignaría el resultado a a, y luego haría la comparación......con qué me preguntaras....pues transformará el número (o texto) a valor bool.....en numeros, 0 es false, cualquier otro numero es true....en texto, si hay algo true, si no hay nada false (OJO que un espacio es algo)

Evidentemente en mi primer post fue un error no poner doble igual. En el ultimo post no hay ningun = suelto, todo son != y algun >=, asi q me imaginaré que lo decías por el primero.

P.D: Hay q ver, estais en todo, que majos :)
P.D2: Alguien que me pueda responder al topic, y me diga cual de los dos métodos es "más rápido en ejecución"???

SALUDOS

fiero

 Quizá sea buena idea postear todas las comparaciones. por lo que veo en esas lineas, están un poco mal estructuradas. A lo mejor no es el código bueno y sólo es un ejemplo, no sé, yo lo comento por si acaso:

if (velocidadx<0 && col>=1) //izquierda
{

aquí entra siempre que velocidadx es <0, correcto

if ((int)((newx+velocidadx)/tamtiles)!=(int)(newx/tamtiles))
{

aquí entra siempre que velocidad sea diferente de 0, pero teniendo en cuenta que NUNCA la velocidadx va a ser 0 en este punto, devido al if anterior, esta comparación sobra

if ((int)(newy/tamtiles)!=(float)(newy/tamtiles) //tenemos q comprobar varios tiles
aquí solo entra si el resultado de la división flotante y entera son distintos, lo que solo se cumple cuando el resto de la división entera es diferente de 0. puedes utilizar la operación if(newy%tamtiles!=0) con el mismo resultado, y te evitas las dos divisiones...

esto es lo que he visto, a groso modo...

un saludo

pd.
CitarP.D2: Alguien que me pueda responder al topic, y me diga cual de los dos métodos es "más rápido en ejecución"???

el más rapido en ejecución es el 1º
www.videopanoramas.com Videopanoramas 3D player

shephiroth

 Buenas. Lo primero gracias por las respuestas q me das. Lo segundo explicarte pq en su momento utilice estas (y sigo usandolas, con mas ifs xDD).

Referente a la duda que tienes en if ((int)((newx+velocidadx)/tamtiles)!=(int)(newx/tamtiles)) te explico

newx es la posicion de x del jugador en el mapa global, tamtiles el tamaño de cada tile y velocidadx es lo que se mueve en ese momento el muñaco (mejor dicho lo que se moverá en el siguiente, pero bueno, sigamos).

Como bien dices la velocidad aqui será negativa (a posteriori hago otros 3 ifs mirando velx>0, vely<0 y vely>0 xDD).

Por lo que necesito esa comparacion es para ver si al añadir el movimiento al muñaco este cambiará de tile (estoy en el codigo de colision de objetos xDD). Todos los datos anteriores son float, por lo que admiten decimales. Al castearlos a int le quito los decimales, por lo que al sumarle esa velocidad, si ha cambiado el valor quiere decir que se va a mover a otro tile.

Por lo que me dices del tercer if, totalmente deacuerdo, ademas que ahora q lo dices puedo utilizar el mismo sistema para el segundo if. En vez de poner ese trozo podría poner algo como....
if ((newx+velocidadx)%tamtiles)>(newx%tamtiles))
Esto es porque savemos que la velocidad es inferior a cero, y si el % de tam tile es mayor quiere decir que cambio de celda.

Muchisimas gracias tio ^_^

fiero

 ah, es verdad, no me habia fijado en que ponias (int)   ;)

en lo referente a los ifs, no te comas la cabeza porque al final da lo mismo. El programa se salta las comparaciones que no son necesarias aunque estén en la misma linea. Ejemplo ilustrativo:

if(numero1==numero2)
{
   if(funcionComparacion(numero3,numero4) )
   {
   }
}

if(numero1==numero2 && funcionComparacion(numero3,numero4) )
{
}


podrias pensar que el primer código es más óptimo, porque no entra en la función si no se cumple numero1==numero2, pero en el segundo código tampoco entra cuando no se cumple. En una cadena de comparaciones separadas por &&, cuando una deja de cumplirse, se interrumpen las que le siguen, por lo que es lo mismo poner ifs uno dentro de otro que ponerlo todo en una línea. Esto para el caso de comparaciones con &&

un saludo
www.videopanoramas.com Videopanoramas 3D player

shephiroth

 Buenas. Eso ya lo sé, el tema esta que es un poco más complicado de lo que piensas. El mis ejemplos no aparece pero hay elses por ahi colgando. El tema esta en que para la segunda forma que yo propongo no es la misma que tu....equiparandolo a tu ejemplo sería:

a=(numero1==numero2);
b=funcionComparacion(numero3,numero4)

if (a && B){...}

La diferencia es clara, en este ya evaluó b, y con los ifs no lo evalua xDD

Esto algunas veces lo he arreglado poniendo algo como
b=(a && funcionComparacion(numero3,numero4))

SALUDOS.






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.