Torna indietro   Hardware Upgrade Forum > Software > Programmazione

OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum
Abbiamo partecipato all'OVHcloud Summit 2025, conferenza annuale in cui l'azienda francese presenta le sue ultime novità. Abbiamo parlato di cloud pubblico e privato, d'intelligenza artificiale, di computer quantistici e di sovranità. Che forse, però, dovremmo chiamare solo "sicurezza"
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a
Abbiamo potuto mettere le mani in anteprima sul nuovo monitor MSI dedicato ai giocatori: un mostro che adotta un pannello QD-OLED da 26,5 pollici con risoluzione 2560 x 1440 pixel, frequenza di aggiornamento fino a 500 Hz e tempo di risposta di 0,03 ms GtG
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro
DJI aggiorna la sua linea di droni ultraleggeri con Neo 2, un quadricottero da 160 grammi che mantiene la compattezza del predecessore ma introduce una stabilizzazione meccanica a due assi, sensori omnidirezionali e un sistema LiDAR
Tutti gli articoli Tutte le news

Vai al Forum
Discussione Chiusa
 
Strumenti
Old 28-04-2006, 23:33   #1
BlueDragon
Senior Member
 
L'Avatar di BlueDragon
 
Iscritto dal: Dec 2002
Messaggi: 418
[BUG #1] Freeze della tastiera

Ok, che ne dite di questo codice in GridController? E' incriminabile?

Codice:
    public void reactToInput(TimerInterface timer)
    {
        if(gemsPair.oneGemIsNotFalling())
        {
            inputReactor.emptyQueue();
            return;
        }

        if(!currentState.isCurrentState("StoneFall") && !currentState.isCurrentState("GemFall"))
        {
            inputReactor.reactToInput(timer);
        }
    }
Se una della gemme non sta cadendo, la coda di eventi della tastiera viene svuotata(!!). Quindi se poggi una delle gemme su una colonna e rilasci il tasto mentre la rimanente sta cadendo, il tuo rilascio del tasto viene "svuotato" dalla coda...quindi è come se rimanesse premuto
BlueDragon è offline  
Old 28-04-2006, 23:54   #2
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
WOW...sembra lui...test per scoprire se hau trovato l'insetto puzzone
__________________
Software engineer
Bonfo's Blog
Bonfo è offline  
Old 28-04-2006, 23:59   #3
BlueDragon
Senior Member
 
L'Avatar di BlueDragon
 
Iscritto dal: Dec 2002
Messaggi: 418
Quote:
Originariamente inviato da Bonfo
WOW...sembra lui...test per scoprire se hau trovato l'insetto puzzone
Il test manuale mi ha già risposto...commentando inputReactor.emptyQueue(); non riesco più a farlo capitare
BlueDragon è offline  
Old 29-04-2006, 00:15   #4
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Modificare emptyQueue per risparmiare gli eventi "Tasto rilasciato" dovrebbe risolvere giusto?

edit:
Peroché invece non gestiamo i tasti nella coda invece di cancellare la lista.
Codice:
    public void emptyQueue()
    {
        while(!input.isEmpty())
        {
            handleKeyEvent(input.extractKey());
        }
    }
In questo modo non riesco piu a riprodure il bug.

ciao

Ultima modifica di VICIUS : 29-04-2006 alle 00:27.
VICIUS è offline  
Old 29-04-2006, 02:55   #5
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Ottimo! Se adesso uccidiamo anche la gemma solitaria, siamo ancora sul filo di lana per rilasciare l'update della FP.
fek è offline  
Old 29-04-2006, 20:59   #6
BlueDragon
Senior Member
 
L'Avatar di BlueDragon
 
Iscritto dal: Dec 2002
Messaggi: 418
Visto che non mi era chiaro il motivo di:
Codice:
 if(gemsPair.oneGemIsNotFalling())
        {
            inputReactor.emptyQueue();
            return;
        }
Ho provato ad eliminarlo, e fallisce questo test:
Codice:
    public void testSlaveGemFallsFaster()
    {
        final double strongestGravity = environment.getConfig().getInteger("StrongestGravityMultiplier") * 0.5;

        controller.getGemsPair().rotateClockwise();
        controller.getGemsPair().getPivotGem().drop();
        controller.update(environment.getTimer());   
        
        assertEquals(strongestGravity, grid.getActualGravity(), 0.01);
                
        input.notifyKeyEvent(KeyEvent.DOWN, KeyEvent.PRESSED);
        
        controller.reactToInput(environment.getTimer());

        assertEquals(strongestGravity, grid.getActualGravity(), 0.01);

        input.notifyKeyEvent(KeyEvent.DOWN, KeyEvent.RELEASED);
        
        controller.reactToInput(environment.getTimer());

        assertEquals(strongestGravity, grid.getActualGravity(), 0.01);
    }
Questo test (che forse potrebbe essere reso più chiaro?) dice che se la gemma slave sta cadendo da sola dopo che la compagna pivot si è arenata(drop), non deve essere possibile alterarne la velocità di caduta con il tasto KeyDown.
Eliminando l'if(gemsPair.oneGemIsNotFalling()) il tasto keydown viene processato e la gemma cade ad una velocità diversa, facendo fallire il test.

Il test mi sembra sensato, ma eliminare tutti gli eventi dalla coda non va bene perché brucia i key released, con il rischio di freezare i tasti.
Anche la soluzione di Vicius purtroppo non va bene, se gestiamo i tasti, ci ritroviamo con il problema che il tasto keydown viene processato e ci altera la velocità di caduta della gemma.

Ma perché il tasto keydown ci altera la velocità quando invece destra e sinistra non ci spostano la gemma che cade?
Andiamo a vedere il codice delll'handler destro...
Codice:
    public void executeWhenPressed(InputReactor inputReactor)
    {
        KeyEventHandler leftHandler = inputReactor.getKeyHandler(KeyEvent.LEFT);

        if(leftHandler.isRepeated(inputReactor.getLastInputTimeStamp())
            || !gemsPair.canReactToInput() )
        {
            return;
        }

        gemsPair.move(GO_RIGHT);
        inputReactor.logEvent(this);
    }


    public void executeWhenReleased(InputReactor inputReactor)
    {
        ;
    }
E quello del tasto giù...
Codice:
    public void executeWhenPressed(InputReactor inputReactor)
    {
        grid.setStrongerGravity();
        inputReactor.logEvent(this);
    }


    public void executeWhenReleased(InputReactor inputReactor)
    {
        grid.setNormalGravity();
        inputReactor.logEvent(this);
    }
Anche le rotazioni hanno un if (GemsPair.canReactToInput()), il drop è l'unico a non averlo.
Bene, allora direi che anziché svuotare la coda, basta aggiungere un if (GemsPair.canReactToInput()), affinché la pressione del tasto giù non alteri la caduta della gemma.

DropCommandHandler non ha un riferimento alla pair, ma solo a grid....effettivamente il comando drop è più un comando eseguito sulla griglia (aumenta o diminuisce la sua gravità) piuttosto che sulla gemma.
Aggiungo comunque la gemsPair al costruttore, così come hanno gli altri handler. Modifico GridController in modo che gli passi assieme alla grid anche la pair quando lo istanzia.

Metto l'if:
Codice:
    public void executeWhenPressed(InputReactor inputReactor)
    {
        if(gemsPair.canReactToInput())
        {
            grid.setStrongerGravity();
            inputReactor.logEvent(this);
        }
    }
Tento di lanciare la build...ma ci sono errori in Diamonds..si è rotto TestLog.
Codice:
    public void testLogStringOnTwoEvents()
    {
        input.notifyKeyEvent(KeyEvent.DOWN, KeyEvent.PRESSED);
        playField.getGridController().reactToInput(environment.getTimer());

        input.notifyKeyEvent(KeyEvent.LEFT, KeyEvent.PRESSED);
        input.notifyKeyEvent(KeyEvent.DOWN, KeyEvent.RELEASED);
        playField.getGridController().reactToInput(environment.getTimer());

        String eventList;

        eventList = new MoveLeftCommandHandler(
            playField.getGridController().getGemsPair()).getClass().getName()
            + " 1\n";
        eventList += new DropCommandHandler(
            playField.getGridController().getGrid()).getClass().getName()
            + " 0\n";

        assertEquals("Logged string must contain left and down events",
            eventList, playField.getGridController().getEventLogString());
    }
Come mai viene istanziato un DropCommandHandler solo per chiedergli il nome della sua classe? Non bastava DropCommandHandler.class.getName() a questo scopo? Gli passo anche la gemspair e lancio i test.

Sorpresa, fallisce un test di TestGridReactionToInput:
Codice:
    public void testGravityWhileDownKeyIsPressed()
    {
        float multiplied = grid.getActualGravity()
            * environment.getConfig().getInteger("GravityMultiplier");

        generateKeyPressed(KeyEvent.DOWN);
        inputReactor.reactToInput(environment.getTimer());

        assertEquals(multiplied, grid.getActualGravity());

        generateKeyReleased(KeyEvent.DOWN);
        inputReactor.reactToInput(environment.getTimer());
    }
Ovviamente questo test si aspetta che a prescindere dalle gemme, la gravità cambi nella griglia premendo il tasto giù.

E qui mi fermo e vado a cena
Se qualcuno vuole continuare...prego!
BlueDragon è offline  
Old 29-04-2006, 23:45   #7
BlueDragon
Senior Member
 
L'Avatar di BlueDragon
 
Iscritto dal: Dec 2002
Messaggi: 418
Sebbene mi venga qualche dubbio, proviamo a proseguire su questa strada.
Seguiamo la logica per cui le gemme devono venire accelerate solo se stai controllando la tua gempair (canReactToInput = true).
Aggiungiamo quindi la connessione necessaria al test, ossia che ci sia una gemspair in gioco, e trasformiamolo così:
Codice:
    public void testGravityWhileDownKeyIsPressed()
    {
        grid.insertGem(0,4,gem);
        gemsPair.setPivotGem(gem);
        
        float multiplied = grid.getActualGravity()
            * environment.getConfig().getInteger("GravityMultiplier");

        generateKeyPressed(KeyEvent.DOWN);
        inputReactor.reactToInput(environment.getTimer());

        assertEquals(multiplied, grid.getActualGravity());

        generateKeyReleased(KeyEvent.DOWN);
        inputReactor.reactToInput(environment.getTimer());
    }
Come vedete ho approfittato del fatto che come già notato nella discussione sul bug della Gemma Solitaria, è possibile nei test comandare una gemspair "singola" con la sola gemma Pivot. Non è che mi piaccia molto devo dire...forse sarebbe meglio mettere anche la Slave, ma visto che non è assolutamente necessaria..non ce la metto.

Lanciamo i test, ora questo test passa, ma fallisce ancora testSlaveGemFallsFaster(), questa volta nel suo ultimo assert.
Codice:
        input.notifyKeyEvent(KeyEvent.DOWN, KeyEvent.RELEASED);
        
        controller.reactToInput(environment.getTimer());

        assertEquals(strongestGravity, grid.getActualGravity(), 0.01);
    }
Infatti quando il tasto keyDown viene rilasciato, il DropCommandHandler cosa fa?
Codice:
    public void executeWhenReleased(InputReactor inputReactor)
    {
        grid.setNormalGravity();
        inputReactor.logEvent(this);
    }
Il che significa che sei noi rilasciamo il tasto mentre una delle nostre gemme si è staccata e sta cadendo a velocità massima, il rilascio del tasto riporterà la gravità della griglia a normale. Questo non va bene perché la gemma deve continuare a cadere dritta a velocità massima indipendentemente da quello che facciamo con i tasti.

Quindi anche questa azione che il DropCommandHandler effettua, va condizionata al fatto di avere una gemsPair con cui agire...gemsPair.canReactToInput(), come per il pressed event.
Modifichiamo il metodo:
Codice:
    public void executeWhenReleased(InputReactor inputReactor)
    {
        if(gemsPair.canReactToInput())
        {
            grid.setNormalGravity();
        }
        inputReactor.logEvent(this);
    }
Ho lasciato il log fuori dall'If perché credo che sia comunque interessante loggare il rilascio del tasto. Vi è però un effetto collaterale per cui il fatto che sia stato loggato un rilascio del DropCommand non vuole più dire necessariamente che in quell'istante sia stata portata la gravità della griglia a normale.

Lancio la build....funziona tutto
Lancio il gioco....non si riproduce più il bug
BlueDragon è offline  
Old 30-04-2006, 00:27   #8
BlueDragon
Senior Member
 
L'Avatar di BlueDragon
 
Iscritto dal: Dec 2002
Messaggi: 418
Committato e buildato con successo
Ho dovuto committare due volte perché alla prima mi ero scordato un file..comunque sono stato abbastanza rapido da far avvenire un solo build.
Al secondo commit ho messo "Mancava un file all'ultimo commit " ed ora nella build 920 si vede come Last Log Entry: "Mancava un file all'ultimo commit ".... Non è molto descrittivo come nome per la build... ma basta che funzioni

Se qualcuno si è letto questo thread e vuole commentare...fatevi avanti
BlueDragon è offline  
Old 30-04-2006, 00:31   #9
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Ottimo lavoro BlueDragon. Direi che ora non abbiamo più bug e lunedì possiamo rilasciare l'aggiornamento della First Playable.

ciao
VICIUS è offline  
Old 30-04-2006, 03:22   #10
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
Complimenti....

...ottima non solo la soluzione , ma anche come hai esposto il problema e la soluziona a tutti. Grazie perchè potevi risparmiartelo...ma così ho capito che è stato e come è ora il codice.

Sono felice che un test che ho proposto e che testava una cosa che già funzionava ha portato a tutta questa bella messa a posto del codice.
Io purtroppo non ho avuto la pazienza di scavare così a fondo per capire dove era la magagna
__________________
Software engineer
Bonfo's Blog
Bonfo è offline  
Old 30-04-2006, 10:32   #11
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
gg
thebol è offline  
Old 30-04-2006, 11:17   #12
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
BD, hai un chiarezza logica impressionante. Complimenti
fek è offline  
Old 30-04-2006, 11:32   #13
Vifani
Senior Member
 
Iscritto dal: Apr 2001
Città: Bari
Messaggi: 2776
Complimenti anche da parte mia. Una esposizione veramente notevole.
__________________
Raffaele Fanizzi
My Personal Web Site
Membro Jedi del HWU Star Wars Clan
Vifani è offline  
Old 30-04-2006, 18:25   #14
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
Iscritto dal: Nov 2005
Messaggi: 1545
Finito di leggere, davvero bella
Ufo13 è offline  
Old 30-04-2006, 20:27   #15
Jocchan
Senior Member
 
L'Avatar di Jocchan
 
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
Meraviglioso. Semplicemente meraviglioso.
__________________
DIAMOND CRUSH - Aut viam inveniam, aut faciam.
Jocchan è offline  
Old 01-05-2006, 01:43   #16
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Bug Closed.
VICIUS è offline  
 Discussione Chiusa


OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum OVHcloud Summit 2025: le novità del cloud...
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI C...
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro DJI Neo 2 in prova: il drone da 160 grammi guada...
L'IA "seria" di Appian è diversa: inserita nei processi e rispetta dati e persone L'IA "seria" di Appian è divers...
Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Apple cambia tutto sull'intelligenza art...
AWS Transform si evolve: agenti IA per m...
I social network hanno stancato gli ital...
Star Citizen supera i 900 milioni di dol...
Netflix ha eliminato la funzione Cast pe...
L'IA è una bolla e scoppier&agrav...
Un rapporto collega i data center di Ama...
Troppa concorrenza per Cherry (quella de...
Entro il 2035 la Cina vuole costruire de...
Tineco in super sconto: ultimo giorno di...
La Cina creerà una costellazione ...
I veicoli elettrici emettono radiazioni ...
Stai per acquistare una PS5? Attento al ...
iPhone 17 Pro Max finalmente disponibile...
Apple, Sony, Bose, Beats, Sennheiser, CM...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 07:11.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v