Oppure

Loading
04/04/09 12:53
Anonymous
boooooh

io l'unica cosa che noto è che lo sfondo è nero invece che bianco... poi sennò lo sfarfallio rimane tanto quanto ce ne era prima.... :S è normale???

public class AppletPallina extends Applet {
    final int n=20;
    Movimento vettore[]=new Movimento[n];
    BufferedImage buffer;
    Graphics gbuf;
    public void init() {
        buffer= new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
        gbuf= buffer.getGraphics();
        
        for (int i=0;i<n;i++){
            vettore[i]=new Movimento (this, 10, 10, 50, Color.YELLOW);
            vettore[i].start();
        }
    } 

    public void paint(Graphics g){

        gbuf.clearRect(0,0,getWidth(),getHeight());


        for (int i=0;i<n;i++){
            gbuf.setColor(vettore[i].p.colore);
            gbuf.fillOval(vettore[i].p.x, vettore[i].p.y, (int)(vettore[i].p.diametro), (int)(vettore[i].p.diametro));
        }
        g.drawImage(buffer, 0, 0, this); 
    }
aaa
04/04/09 13:34
netarrow
non so cosa altro possa essere, la tecnica del doppio buffering per togliere lo sfarfallio è questa.
inizialmente io ho fatto il test su eclipse con appletview, quindi pensando possa aver falsato la prova ho rifatto il test creando la pagina html col tag applet e funziona alla grande.

La configurazione è:
JDK/JRE: 1.5
Browser: ho provato su Firefox e Safari
OS: Mac OS X Leopard


aaa
04/04/09 14:12
Anonymous
ok.. vedrò cosa possa essere...

cmq grazie per la pazienza... XD

ah.. in allegato ho messo il file .class con la relativa pagina html in cui viene eseguito l'applet....

prova a scaricarlo cosi mi dici se a te si vede o no lo sfarfallio...

se non ti sfarfalla significa che è qualcosa nel mio pc che nn va.. altrimenti mi sa che c'è qualcosa da rivedere nel codice

grazie ancora e ciao
aaa
05/04/09 19:46
netarrow
si a me funziona
aaa
06/04/09 4:34
pierotofy
Ho provato ad eseguire l'allegato e vedo lo sfarfallio con le striscie bianche.

Provato su Firefox 3 e Windows XP.
Il mio blog: piero.dev
06/04/09 4:37
pierotofy
Io non metterei la procedura di disegno sul metodo paint (sospetto che potrebbe essere questa la causa del sfarfallio). Piuttosto fai un thread a parte che si occupa di fare le operazioni di disegno con un certo intervallo di tempo (il che ti servirà per avere la stessa velocità di movimento delle palline su computer con potenza diversa).
Ultima modifica effettuata da pierotofy 06/04/09 4:40
Il mio blog: piero.dev
06/04/09 6:32
netarrow
provato anche io su Xp con Firefox e anche a me sfarfalla li.

A questo punto le possibilità sono:

1) Su mac funziona perchè supporta a livello di sistema il Core Animation e quindi dovrebbe sfarfallare anche su mac ma questa feature migliora le prestazioni video (a questo punto sarebbe da provare su Vista)
2) Su mac sono aggiornato a Java 1.5, su Xp ho la 1.6. Che non sia un'incompatibilità dell'interprete.
aaa
06/04/09 7:44
netarrow
non penso sia una questione di potenza di calcolo, in quel caso scatta o va impastato o lento un pò, ma se sfarvalla vuol dire che c'è un momenti in cui non è sincronizzato l'aggiornamento dei dati e il disegno effettivo.

Quello che non mi convince è creare la classe Movimento che gestisce una Pallina, in questo modo si creano thread tante quante palline e inoltre ci sono repaint per ogni pallina.
Questo vuol dire che ogni tic di tempo che è richiesto ad un oggetto Movimento di terminare l'esecuzione di una ciclata di run fa un repaint, ma se le palline sono 20 non è detto che il repaint sia sincronizzato, quindi vengono richiamati 20 repaint a tempi non esattamente stabiliti (l'unica certezza è che passano almeno 10 millisecondi).

Ho provato a rimuovere completamente i Thread, cioè far diventare Movimento una classe non thread, mettere il corpo di paint in un ciclo infinito, e richiamare nel ciclo vettore[ i ].run() per aggiornare i dati, e così funziona su windows (su leopard fa più fatica, penso sia proprio per una questione di basso livello sulla gestione del video).

La soluzione per me è creare un unico thread Movimento adibito ad aggiornare la posizione di TUTTE le palline.
Così c'è un solo repaint in un solo thread ad intervalli prestabiliti e il margine di ritardo non crea problemi come lo creerebbero 20 repaint di 20 thread diversi sfasati di qualche millisecondi.
Ultima modifica effettuata da netarrow 06/04/09 7:46
aaa