Avatar billede Droa Seniormester
15. december 2011 - 13:57 Der er 4 kommentarer og
1 løsning

Java er meget langsom i mit Graphics2D object

Hej eksperter
Jeg har leget lidt med Java for at se om jeg kunne lave lidt grafik i det, da min tanke er en dag at kunne lave lidt 2D spil, som tetris og Ping Pong.. men ligenu har jeg en masse udfordringer, bare at få java til at køre i den hastighed jeg gerne ville have det til.

Jeg har søgt lidt på nettet, og kan ikke rigtigt finde ud af hvorfor min computer er så langsom når den køre mit testprogram i fuld skærm (1920x1080), når jeg køre det i 800x600 køre den med 60fps, men i fuld skærm er det 29-31fps.

min testkode ser sådan her ud.


import java.awt.Color;
import javax.swing.*;

import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Graphics;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;

public class XGameFrame extends JFrame{
   
    private static final long serialVersionUID = 1L;
    private Image img;
    private BufferedImage bi;
    private double lx;
    private double ly;
    private double dx;
    private double dy;
    GraphicsDevice gd;
    fps fps;
   
    public XGameFrame(){
        fps = new fps();
        this.gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        this.setUndecorated(true);
        gd.setFullScreenWindow(this);
        this.loadImages();
        bi = new BufferedImage(this.getWidth(),this.getHeight(),BufferedImage.TYPE_4BYTE_ABGR);
        this.lx = 0;
        this.ly = 0;
        this.dx = 1;
        this.dy = 2;
    }
   
    public Graphics2D getGraphics2D(){
        return (Graphics2D)this.getGraphics();
    }
   
    public void loadImages(){
        this.img = Toolkit.getDefaultToolkit().createImage(getClass().getResource("logo.gif"));
    }
   
    @Override
    public void paint(Graphics g){
        this.fps.tick();
        Graphics2D g2 = this.getGraphics2D();
        Graphics2D big = (Graphics2D)this.bi.getGraphics();
        big.setColor(Color.black);
        big.fillRect(0, 0, this.getWidth(), this.getHeight());
       
        if(this.dy + this.ly < 0){
            this.dy = Math.abs(this.dy);
        }
        else if(this.dy + this.ly + (this.img.getHeight(getOwner())*0.4) > this.getHeight()){
            this.dy = -(this.dy);
        }
       
        if(this.dx + this.lx < 0){
            this.dx = Math.abs(this.dx);
        }
        else if(this.dx + this.lx + (this.img.getWidth(getOwner())*0.4)-50 > this.getWidth()){
            this.dx = -(this.dx);
        }
       
        this.ly = this.ly + this.dy;
        this.lx = this.lx + this.dx;
       
        big.drawImage(this.img, (int)lx, (int)ly, (int)(this.img.getWidth(getOwner())*0.4), (int)(this.img.getHeight(getOwner())*0.4), null);
        big.setFont(new Font(Font.MONOSPACED,Font.PLAIN,12));
        big.setColor(Color.red);
        big.drawString("FPS: "+(int)fps.getFPS(),20,20);
        g2.drawImage(this.bi, null, 0, 0);
    }
}


på forhånd tak for hjælpen
Avatar billede Droa Seniormester
15. december 2011 - 14:04 #1
fandt ud af det selv, det var åbenbart mit BufferedImage, der brugte en meget tung Type.. så skiftede den til

BufferedImage.TYPE_INT_RGB

og køre nu over 120 fps
Avatar billede arne_v Ekspert
16. december 2011 - 02:24 #2
Nu er det jo ikke et komplet program man kan koere og maale med.

Men et par blandede ideer:

1) angiver du -server som option til JVM?

2) har du givet JVM rigeligt med memory f.eks. -Xmx1g ?
Avatar billede Droa Seniormester
19. december 2011 - 09:09 #3
hej arne_v
Jeg tror det var hukommelsen der gjorde det, jeg er ikke 100% sikker, da jeg testede det igennem Eclipse kørte det utroligt langsomt, men da jeg startede det uden for eclipse, kørte det normalt.. men jeg opgav at finde ud af hvorfor, og ændrede bae BufferImage til RGP istedet for ABGR, siden det alligevel er Baggrundlaget, gør det nok ikke den helt store forskel alligevel.
Avatar billede Droa Seniormester
12. december 2012 - 00:14 #4
arne_v ligger du ikke et svar, er lige igang med at følge op på åbne poster
Avatar billede Droa Seniormester
17. december 2014 - 23:19 #5
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester