Tontadas y pamplinas + Otras dudas

Started by Futu-block, August 19, 2016, 01:28:24 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

Sí, el clic con la rueda es mouse.center, y para la rueda mouse.wheel_up o mouse.wheel_down, pero en vez de devolver true o false, devuelve cuántas lineas debe desplazarse.
Está documentado en la Wiki, en el mod_mouse. Yo lo sé de memoria.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Futu-block

#76
odio que me mandes a la wiki, y mas despues de jartarme de buscar en la biblia... :(



Tu sabe, no me aclara mucho...

|-----------------------------0-----------------------------|
Nada que no se tantee probando:
        if (mouse.wheelup) weo++; end
        if (mouse.wheeldown) weo--; End


Jo Jo, me encanta esta función

Futu-block

Otra mas, quiero redondear el angulo en cada fame, ¿es necesario poner un if o hay alguna otra funcion que la redondee?

lo que uso es

if (angle > 360000) angle = 0; end
if (angle < 0) angle = 360000; end


me gustaria usar algo como

angle%360;

SplinterGU

Quote from: Futu-block on January 15, 2018, 04:03:11 PM
Otra mas, quiero redondear el angulo en cada fame, ¿es necesario poner un if o hay alguna otra funcion que la redondee?

lo que uso es

if (angle > 360000) angle = 0; end
if (angle < 0) angle = 360000; end


me gustaria usar algo como

angle%360;

eso mismo...

angle %= 360000;
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Futu-block


SplinterGU

mmm, ah, no, perdon, no es lo mismo, tu haces que si es menor lo ponga a 0 y si es mayor a 360000, esto lo que hace es pasarlo al angulo similar pero entre 0 a 360000...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Creo que lo que quiere hacer es lo que tú le has dicho, pero con ángulos siempre positivos, o dentro del rango 0-360º (a Futu hay que interpretarlo con más cuidado que código VB6 :D).

Puedes hacer:
if (angle >= 360000) angle -= 360000 end
if (angle < 0) angle += 360000 end

Eso te debería devolver siempre un ángulo entre 0 y 360º, si no en un frame, en dos o tres (salvo que estés haciendo giros muy bruscos). Ya demostré en su día que el operador "%" es ligeramente más lento que un if+suma, por lo que no hay algoritmo más rápido... que yo sepa.
Pero ojo, que muchas operaciones de Bennu manejan ángulos entre -90º y 270º, así que cuidado.

Y sí, te voy a estar mandando a la wiki por no mandarte a la m...uchacha de los recados, a ver si un día aprendes a interpretar lo que dice y descubrirás cosas que no sabías ni que Bennu pudiera hacer. Y si algo no lo entiendes, te creas un código nuevo, lo pruebas, experimentas y alucinas con los resultados que te va dando :D
Lo que te dice la wiki es que, igual que tienes mouse.x y mouse.y para saber las coordenadas, tienes mouse.graph para cambiarle el gráfico, mouse.z para la coordenada z (el orden de dibujado), mouse.middle para ver si el botón central está pulsado, etc, etc, etc. Como todos los procesos, pero con más cosas.

Anda que cuando te leas la del scroll o la del modo7, te explota la cabeza como poco :D
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

Quote from: Drumpi on January 15, 2018, 11:49:51 PM
Ya demostré en su día que el operador "%" es ligeramente más lento que un if+suma, por lo que no hay algoritmo más rápido... que yo sepa.

drumpi, eso no es correcto:


import "mod_say";
import "mod_timers";
import "mod_time";


private
t0;
t1;
i;
angle;

begin

    angle = 0;

    t0 = get_timer();

    for( i = 0; i < 14400000; i++ )
        angle++;
        angle %= 360000;
    end

    t1 = get_timer();

    say( t1 - t0 );

    angle = 0;

    t0 = get_timer();

    for( i = 0; i < 14400000; i++ )
        angle++;
        if ( angle >= 360000 ) angle -= 360000; end
        if ( angle < 0 ) angle += 360000; end
    end

    t1 = get_timer();

    say( t1 - t0 );


end



resultados (bm se llama el dcb compilado):

Quote$ bgdi bm
1988
2187
$ bgdi bm
1984
2084
$ bgdi bm
1984
2176
$ bgdi bm
1883
2071
$ bgdi bm
1863
2063
$ bgdi bm
1873
2086
$ bgdi bm
1873
2090
$
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

incluso con esta forma


        if ( angle >= 360000 ) angle -= 360000;
        elsif ( angle < 0 ) angle += 360000; end
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Futu-block

vayamos por partes, 1º el foro me dá error y no me aparece la caja de texto:


2º· Me expresé mal con el codigo de la primera vez, razonandolo yo digo que sies mas de 360º se convierte a 0º, osea, si fuera 400º serian 0º


if (angle > 360000) angle = 0; end
if (angle < 0) angle = 360000; end


ambos me aconsejais que use:

if ( angle >= 360000 ) angle -= 360000;
elsif ( angle < 0 ) angle += 360000; end (¿deberia ir un igual detras de <?)

¿entonces pa que os peleais? ja ja ja

No, en serio, ¿si el angulo es mayor o igual a 360º que reste 360º o si es menor de cero que sume 360º? parece razonable, si muy confiable, aunque pensandolo bien lo voy a usar cuando se levante el dedo de la tecla (!key)

SplinterGU

no peleamos, solo digo que usar %= es mas rapido que la secuencia de ifs y sumas y restas
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

Quote from: Futu-block on January 16, 2018, 03:57:09 PM
vayamos por partes, 1º el foro me dá error y no me aparece la caja de texto:


2º· Me expresé mal con el codigo de la primera vez, razonandolo yo digo que sies mas de 360º se convierte a 0º, osea, si fuera 400º serian 0º


if (angle > 360000) angle = 0; end
if (angle < 0) angle = 360000; end


ambos me aconsejais que use:

if ( angle >= 360000 ) angle -= 360000;
elsif ( angle < 0 ) angle += 360000; end (¿deberia ir un igual detras de <?)

¿entonces pa que os peleais? ja ja ja

No, en serio, ¿si el angulo es mayor o igual a 360º que reste 360º o si es menor de cero que sume 360º? parece razonable, si muy confiable, aunque pensandolo bien lo voy a usar cuando se levante el dedo de la tecla (!key)

el box, amplialo! debajo de las caritas esta la barra de tamaño (gris con una marca gris oscura en medio), la tenes colapsada, dale a la barrita gris "oscura" y deslizala para abajo...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Futu-block

no funcionaba cuando hice la foto, por mas que le daba se quedaba pillado, ahora vá bien

Drumpi

#88
No, Splinter, me has entendido mal, y tus números me dan la razón :D
Yo dije que UNA operación módulo (una operación individual) es ligeramente más lenta que un IF y UNA suma (dos operaciones individuales).

En tu código, una suma y un módulo en bucle, han dado un rendimiento apenas un 10% superior a un bucle con una suma y dos IFs en todas sus iteraciones, y una suma extra cada 360000 iteraciones.
Pero vamos a redondear y a obviar que los tics del timer no son del todo precisos, etc, etc... Y vamos a decir que una suma y un módulo son un 10% más rápidos que dos ifs y una suma... Si eliminamos la suma de ambos bucles, nos queda que un módulo es un poco más rápido que dos ifs, o lo que es lo mismo, un if tarda casi la mitad que un módulo.

Si al módulo hay que añadirle una suma para que nos devuelva un valor positivo siempre (recordemos que el módulo de -370%360 = -10) habría que añadir un if y una suma extra a la operación módulo, perdiendo toda la ventaja de velocidad que tenía :D

Creo que en su momento obtuve unos resultados similares a los tuyos, pero terminé por memorizar que no me merecía la pena usar módulo cuando daban un rendimiento tan similar, y al final, siempre iba a intentar buscar valores positivos.

Pero en realidad tiene su lógica: las ALU (el componente en el que se basan las CPU) incorporan por HW operaciones de suma, multiplicación y aritmética booleana, que se pueden ejecutar en un solo ciclo de reloj. Las divisiones y los módulos, hasta donde yo sé, no se han podido implementar igual, o al menos usando un sistema de puertas lógicas con un retardo similar al resto de operaciones.

Lo siento, pero el motor de scroll tileado me ha convertido en un friki de los módulos por culpa de los scrolls cíclicos :D :D :D
Y pensar que hay microcontroladores por 0'50€ con un mnemónico para recorrer espacios de memoria de forma cíclica sin tener que comerse la cabeza con estas operaciones, ni módulos ni nada de nada (sólo un byte que dice "lee, guardas el dato en el registro/memoria tal y salta a la siguiente posición").
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

#89
demasiada larga tu respuesta...

el punto es que no estamos midiendo 1 solo mod (%) vs 1 sola 1 suma... lo equivalente a

angulo %= 360000;

(que es lo que se necesita), es:

if ( angulo >= 360000 ) angulo -= 360000; end
if ( angulo < 0 ) angulo += 360000; end

y en esos 2, lo mas rapido es hacer el modulo, luego si individualmente sea menos performante es otra cuestion... pero el punto que se necesitan ambos if y ambas sumas... e incluso te diria mas... que en el caso de los if, solo hace 1 suma cada 360000 incrementos, ahora si los incrementos son mas frecuentes, los resultados son peores para los if...

por ejemplo, forcemos en cada frame hacer la operacion de ajuste

con este codigo


    angle = 0;

    t0 = get_timer();

    for( i = 0; i < 14400000; i++ )
        angle = -10 ;
        angle %= 360000;
    end

    t1 = get_timer();

    say( t1 - t0 );

    angle = 0;

    t0 = get_timer();

    for( i = 0; i < 14400000; i++ )
        angle = -10 ;
        if ( angle >= 360000 ) angle -= 360000;
        elsif ( angle < 0 ) angle += 360000; end
    end

    t1 = get_timer();

    say( t1 - t0 );


los resultados:

Quote
$
1759
2663

$
1747
2760

hablamos del conjunto de operaciones... no de la operacion individual...

vayamos mas a fondo... ahora si comparamos 1 if vs 1 mod, si es mas rapido un if que un mod, ahora si el if da siempre true y se ejecuta la suma, entonces es mas rapido el mod... y si prescindimos del if y solo hacemos mod vs suma, los numeros son los mismos...

aca estoy casi seguro que el problema no es el modulo o la suma, sino la asignacion, por eso el if es mas rapido, porque no asigna.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2