Toon posts:

[Java] Animatie en Thread Synchronisatie

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben een spelletje aan het schrijven waarin ik uiteraard geen irritant geflikker en geschok wil. In dit artikel op Gamasutra wordt uitgelegd hoe je dit kunt doen dmv. thread synchronisatie. (Je moet je wel registreren om het te kunnen lezen)

Het is de bedoeling dat de 'event dispatcher' (AWT achtergrond thread) en mijn eigen 'GameLoop' thread gesynchroniseerd worden zodat de GameLoop niet repaint() aan roept terwijl de event dispatcher nog bezig is de vorige repaint() te verwerken.

run() method van de gameloop thread:
Java:
1
2
3
4
5
6
7
8
9
synchronized public void run()
{
    //main game loop
    while(true)
    {
        repaint();
        wait();
    }
}

paint() method:
Java:
1
2
3
4
5
6
synchronized public void paint(Graphics g)
{
    //doe hier wat tekenwerk
    g.fillOval(x, y, 5, 5);
    notifyAll();
}


Helaas werkt het niet. Mijn programma wordt hierdoor juist extra langzaam :(
Mijn vraag is: Wie weet iets van synchronisatie en weet hoe je dit op moet lossen?

Verwijderd

Geflikker en geschok kun je oplossen door double buffering...
Zoek maar eens op google daar vind je heel veel voorbeelden.

Verwijderd

Topicstarter
Verwijderd schreef op 07 september 2002 @ 00:06:
Geflikker en geschok kun je oplossen door double buffering...
Zoek maar eens op google daar vind je heel veel voorbeelden.
Ik maak al gebruik van double buffering. Waar het mij echt om gaat is een hoge frame rate. In ieder geval zo hoog mogelijk. Heel veel voorbeelden maken dan gebruik van sleep() om een thread even te laten wachten zodat paint() uitgevoerd kan worden. Dit is natuurlijk een erg slordige methode die niet erg goed werkt als je een hoge frame rate wilt. Daarom is die synchronisatie zo interessant.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:09
Die aparte thread is ontzettend irriant; in deze situatie kun je 'm 't beste gewoon buiten werking stellen en in je hoofdlus zelf het scherm tekenen wanneer dat nodig is.

Daartoe moet je de update-method (die door die dispatcher thread aangeroepen wordt) overriden en leeg maken (zodat 'ie niets meer doet) en waar je voorheen repaint() aanriep, roep je nu gewoon direct paint() aan met het Graphics object dat je direct bij je Frame (oid?) opvraagt.

Het meest efficient is natuurlijk om dat Graphics object voor de lus op te vragen en gedurende de hele executie te gebruiken. Denk er wel aan dat je op deze manier zelf het scherm moet wissen wanneer dat nodig is.

  • VinnieM
  • Registratie: September 1999
  • Laatst online: 29-11-2024
* edit: ik moet leren lezen :( *

Je kunt beter gebruik maken van paintComponent(Graphics g) indien je swing gebruikt, deze flikkert/schokt niet en je hoeft niet je scherm steeds zelf te clearen.