[Java] double buffering maakt applet erg sloom

Pagina: 1
Acties:

  • JSchut
  • Registratie: Februari 2002
  • Laatst online: 13-09 14:07
Ik ben bezig met een spel nu had ik een probleem dat het beeld erg knipperde dat heb ik nu dus verholpen met double buffering en dit werkt perfect

Het probleem is het beeld gaat nu erg schokkend.

wie heeft hier een oplossing voor?

PSN jschut_82 | Xbox: JSchut82


Verwijderd

Ik weet niet op welke manier je het hebt gedaan, maar dubbele buffering heeft normaal gesproken geen last van schokken e.d.

  • JSchut
  • Registratie: Februari 2002
  • Laatst online: 13-09 14:07
ik doe het op deze manier

[script]
public void update(Graphics screen) {
Dimension applet_size = getSize();
offImage = createImage(applet_size.width, applet_size.height);
offGraphics = offImage.getGraphics();

// Erase the previous image
offGraphics.setColor(bg_game);
offGraphics.fillRect(5,5,490,293);
offGraphics.setColor(Color.black);
offGraphics.fillRect(0,0,500,5);
offGraphics.fillRect(0,0,500,5);
offGraphics.fillRect(0,0,5,300);
offGraphics.fillRect(495,0,5,300);
offGraphics.fillRect(0,298,500,2);

// Paint the frame into the image
paintFrame(offGraphics);

// Paint the image onto the screen
screen.drawImage(offImage, 0, 0, null);

}

public void paintFrame(Graphics screen) {
if (mainscreen) {
screen.setColor(Color.black);
screen.drawImage(main_background,0,0,this);
screen.drawImage(startbutton,205,229,this);
} else if (game_over) {
screen.setColor(Color.black);
screen.drawString("Game over Score " + score,230,150);
screen.drawString("Klik in het spel om opnieuw te beginnen",170,170);
} else {
if (!startlevel) {
screen.setColor(Color.black);
screen.drawString("LEVEL " + level,230,150);
screen.drawString("Klik in het spel om te beginnen",170,170);
} else {
if (!ballshot) {
screen.drawImage(ball,xCursor,281,this);
} else {
screen.drawImage(ball,xBall,yBall,this);
}

// blokken neerzetten voor level 1
if (level == 1) {
for (int j=0; j<level1.length; j++) {
if (level1[j][0] == 1) {
use_color = oranje;
}
if (level1[j][3] != 0) {
screen.drawImage(use_color,level1[j][1],level1[j][2],this);
}
}
}

screen.setColor(Color.black);
screen.drawString("Score: " + score,420,16);
screen.drawString("Balls: " + ballen,10,16);
screen.drawImage(balk,(xCursor-30),290,this);
}
}
}
[\script]

PSN jschut_82 | Xbox: JSchut82


  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 19:19
Het is trouwens [ code ] en [ /code ].
Op vrijdag 01 maart 2002 10:17 schreef JavaRules het volgende:
Ik weet niet op welke manier je het hebt gedaan, maar dubbele buffering heeft normaal gesproken geen last van schokken e.d.
Normaal gesproken.. Remember Robbie?

JSchut, geef je toevallig ergens een repaint() naar die class van jou? Wat je kan (en zal helpen) is een repaint(x,y,w,h) doen. Dit zorgt ervoor dat er maar een klein deel wordt gerepaint en niet het hele scherm.

Verwijderd

ik weet niet of het effect zal hebben, maar ik doe het altijd anders.

even uit de losse pols:

[script]
public void update(Graphics screen) {
Dimension applet_size = getSize();
offImage = createImage(applet_size.width, applet_size.height);
offGraphics = offImage.getGraphics();
// Paint the frame into the image
paint(offGraphics);
}

public void paint(Graphics screen) {
// Erase the previous image
screen.setColor(bg_game);
screen.fillRect(5,5,490,293);
screen.setColor(Color.black);
screen.fillRect(0,0,500,5);
screen.fillRect(0,0,500,5);
screen.fillRect(0,0,5,300);
screen.fillRect(495,0,5,300);
screen.fillRect(0,298,500,2);
if (mainscreen) {
screen.setColor(Color.black);
screen.drawImage(main_background,0,0,this);
screen.drawImage(startbutton,205,229,this);
} else if (game_over) {
screen.setColor(Color.black);
screen.drawString("Game over Score " + score,230,150);
screen.drawString("Klik in het spel om opnieuw te beginnen",170,170);
} else {
if (!startlevel) {
screen.setColor(Color.black);
screen.drawString("LEVEL " + level,230,150);
screen.drawString("Klik in het spel om te beginnen",170,170);
} else {
if (!ballshot) {
screen.drawImage(ball,xCursor,281,this);
} else {
screen.drawImage(ball,xBall,yBall,this);
}

// blokken neerzetten voor level 1
if (level == 1) {
for (int j=0; j<level1.length; j++) {
if (level1[j][0] == 1) {
use_color = oranje;
}
if (level1[j][3] != 0) {
screen.drawImage(use_color,level1[j][1],level1[j][2],this);
}
}
}

screen.setColor(Color.black);
screen.drawString("Score: " + score,420,16);
screen.drawString("Balls: " + ballen,10,16);
screen.drawImage(balk,(xCursor-30),290,this);
}
}
// Paint the image onto the screen
screen.drawImage(offImage, 0, 0, null);
}
[\script]

Verwijderd

Hmmm dubbele buffering gaat ervan uit (bij mij ;) ) dat je pic al getekend en al is op het moment dat je het plaatje laat zien het ook af is. Als het dan nog schokt is je code ofwel te traag(het schokt tussen de frames) of je dubbele buffering is niet echt dubbel (1 stap) OF je hebt de V-sync UIT staan.
Ik ben nog in je code aan t snuffelen maar die paintimages zijn bitblit routines. Ik heb zelf dubbel en zelfs triple buffering op de MSX geprogrammeerd , maar de uiteindelijke weergave van de pagina deed ik niet met bitblitten maar met een page swap. Verder kun je de IRQ's wel ff laten wachten op je beeldopbouw. :)

jaja op de MSX al. Sources op te vragen.

Edit: TYPO

  • JSchut
  • Registratie: Februari 2002
  • Laatst online: 13-09 14:07
het probleem is dat ik telkens me me hele scherm of zowat me hele scherm moet repainten omdat er een balletje door het scherm spring en bepaalde blokjes dan weer wel en dan weer niet zichtbaar zijn

PSN jschut_82 | Xbox: JSchut82


Verwijderd

je had trouwens ook paintFrame gebruikt terwijl paint aangeroepen wordt bij een repaint. de update wordt alleen aangeroepen zodra er iets in 't scherm veranderd is...

  • JSchut
  • Registratie: Februari 2002
  • Laatst online: 13-09 14:07
Ja dat komt omdat ik het volgende doe

bij repaint word paint aangeroepen en omdat ie normaal je scherm leeg donderd override ik hem en dan roep ik daarin paintFrame aan

en in paint staat alleen
code:
1
2
3
4
5
if (mainscreen) {
    screen.setColor(Color.black);
    screen.drawImage(main_background,0,0,this);
    screen.drawImage(startbutton,205,229,this);
}

dus als dat voor bij is doet paint niks meer dus dan gebruik ik alleen nog update en paintFrame

PSN jschut_82 | Xbox: JSchut82


  • JSchut
  • Registratie: Februari 2002
  • Laatst online: 13-09 14:07
oeps foutje paint moet update zijn die override ik niet paint

sorry......

PSN jschut_82 | Xbox: JSchut82


  • JSchut
  • Registratie: Februari 2002
  • Laatst online: 13-09 14:07
Ik gebruik Thread.sleep(5);
kan dit het probleem zijn????

PSN jschut_82 | Xbox: JSchut82


Verwijderd

Lijkt me niet...

  • JSchut
  • Registratie: Februari 2002
  • Laatst online: 13-09 14:07
ik het het probleem al gevonden

beetje een domme fout

ik had staan

offImage = createImage(applet_size.width, applet_size.height);

ff veranderen in

[code]
if (offImage == null) {
offImage = createImage(applet_size.width, applet_size.height);
}
[\code]

en het probleem was weg

in iedergeval voor de reacties

PSN jschut_82 | Xbox: JSchut82


  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 19:19
het is dus [/code]
Pagina: 1