Applet: Odswiezanie grafiki

0

Witajcie,

Czy da się coś zrobić z apletem Javy, żeby po przesłonięciu grafiki na nim wyświetlanej nie odświeżała się ona? Zauważyłem, że każdy aplet tak ma i deczko to zamula jeśli chodzi o zrobienie jakiejś gry. (Nie mam możliwości sprawdzić jak jest na innych systemach operacyjnych, używam Ubuntu)

0

Nie zamula :D. A może przyśpiesz odstępy między klatkami lub zrób podwójne buforowanie.
podp:

1

Może źle rysujesz. Po zasłonięciu i ponownym odsłonięciu obszaru apletu wykonana zostanie metoda paint apletu. Zatem nie powinno w niej być niczego co jest czasochłonne.

0

W metodzie paint mam tylko g2d.drawImage(bufferedImage, ... , this);
Jeszcze nie znalazłem appletu, który by nie miał tej wady. Np: http://math.bu.edu/DYSYS/applets/linear-web.html . Po zasłonięciu go (najlepiej widać jak przeciąga się powoli inne okno nad nim) baaaardzo powoli (5s) wraca narysowany obraz.

0

Ja mam ubuntu i nie mam z tym problemow :P..
Moze komputer za slaby ?

0

No tak, 100% użycia procesora przy przejeżdżaniu okienkiem nad apletem, a z tego co wiem Java przy takim użyciu procka trochę świruje.

0

Ja też mam Ubuntu i nie ma żadnych problemów z tym apletem.

Jaką masz wersję Javy? Zainstaluj sobie JDK7: http://www.ubuntu-pomoc.org/instalacja-oracle-java-jdk-7/

0

Jeśli wczytasz obrazek z pliku, to może on być w innym formacie niż preferowany przez środowisko graficzne... (np RGBA kontra BGR) Lepiej przekonwertować obrazek na taki, który jest kompatybilny... Pierwsze lepsze z googla:
http://www.java2s.com/Tutorial/Java/0261__2D-Graphics/Createbufferedimagesthatarecompatiblewiththescreen.htm

Wejdź tutaj: http://dev.keraj.net/cap/ i powiedz co wypisał aplet (możesz zaznaczyć całe i tu wkleić) (spróbuj też klikając na OpenGL i XRender, tam na dole)
Inna sprawa, że możesz mieć stare/niekompatybilne sterowniki, powinieneś je zaktualizować.

edit: sprawdź też jeszcze ten mini-pseudo-benchmark: http://dev.keraj.net/java2d/ (gdy aplet się wczyta, sprawdź czy kliknięcie compatible pod nim coś poprawia)

0

Faktycznie, to przez to, że mam przestarzałą zintegrowaną kartę w laptopie.

Jeszcze jedno pytanie odnośnie odświeżania grafiki:

private void rysowanieDoBuforu() {
		g2.setRenderingHints(rh); //Antialiasing
		g2.setPaint(new Color(255,255,255));
		g2.fillRect(0,0,34*16,34*16); //Maże wszystko pod spodem na kolor bialy
		g2.setPaint(new Color(0,0,0));
		g2.drawRect(0, 0, 32*16+1, 32*16+1); //Rysuje ramke
		int x;
		for(int i=0; i<32; i++){
			for(int j=0; j<32; j++){
					x = kratka(mapa[i][j]);
					g2.drawImage(obrazek,1+i*s,1+j*s,1+i*s+s,1+j*s+s,x*s,0,x*s+s,s,this);  //Rysuje 32x32 kafelków wycietych z malego obrazka
			}
		}
		g2.drawImage(obrazek,1,1,1+s,1+s,18*s,0,18*s+s,s,this); //rysowanie mety i startu
		g2.drawImage(obrazek,1+31*s,1+31*s,1+31*s+s,1+31*s+s,18*s,0,18*s+s,s,this); 
		g2.drawImage(obrazek,1,1,1+s,1+s,16*s,0,16*s+s,s,this);
		g2.drawImage(obrazek,1+wx*s,1+wy*s,1+wx*s+s,1+wy*s+s,17*s,0,17*s+s,s,this); //rysowanie ludzika
	}

To jest kod, który rysuje na BufferedImage, i jest wykonywany 33 razy na sekundę(razem z repaint();). Co w nim jest źle? Zabiera 30% procesora i czasami miga (chyba za dużo jak na taką pierdółkę) To jest ten Applet:
http://szym.c0.pl/lab.html

EDIT: Podwójne buforowanie pomogło jeśli chodzi o miganie :)
EDIT2: zamieniłem rysowanie 32*32 kafelek do g2, na rysowanie gotowego już sporządzonego na początku obrazu labiryntu. Dalej program zużywa 30% procesora

0

Powinieneś podać kod całego appletu, a nie tylko kawałka - bo ten kawałek nic nie mówi.
I powiedz jakie wyniki dają applety, które podalem.

Zdekompilowałem Twój applet i jak na mój gust przyczyna jest w tym, że "this.obrazek" to obrazek o nieznanym typie... powinieneś go przekonwertować na kompatybilny

        BufferedImage img = applet.getGraphicsConfiguration().createCompatibleImage(zaladowany.getWidth(null), zaladowany.getHeight(null), Transparency.TRANSLUCENT);
        Graphics g = img.createGraphics();
        g.drawImage(obrazek, 0, 0, null);
        g.dispose();
        
        obrazek = img;

Bufforowi też dajesz typ "na chama", a powinieneś tworzyć kompatybilny.

Inna sprawa że ten cały labirynt mógłbyś narysować raz do jednego bufora na początku, a potem za każdą klatką rysować tylko ten jeden bufor, a dopiero nad nim rysować pozycje gracza, etc.

0

Wyniki to:
300FPS na 16 balls
9FPS na 1024 balls

 
Graphics Enviroment: X11GraphicsConfig[dev=X11GraphicsConfig[dev=X11]GraphicsDevice[screen=0],vis=0x21]
Graphics Device: X11GraphicsDevice[screen=0]

Multibuffer available: false
DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0

Translucent Buffered Image:
Pixel Layout: INT_ARGB
Accelerated: false

Opaque Buffered Image:
Pixel Layout: INT_RGB
Accelerated: false

Translucent Volatile Image:
Accelerated: false
True Volatile: false

Opaque Volatile Image:
Accelerated: true
True Volatile: false

To jest kod całego apletu (jeszcze niedopracowane niektóre rzeczy):
http://pastebin.com/DbTDZguC

Jeszcze nie zdążyłem popatrzeć na kompatybilność tych typów. Generalnie została mi kwestia tego czemu obrazek 640*640 30FPS zabiera tyle procesora (intel celeron 1.7Ghz).

Z góry dziękuję za pomoc.

0

A czy jeśli klikniesz na OpenGL to coś się zmienia? (w obydwu) Ja na laptopie z intelową grafiką mam przy softwarowym renderingu 16: 400-500fps, 1024: 20fps - ale ja to mam procesor dużo lepszy niż Ty. (poza tym ten bench męczy procesor przez kolizje) Więc Twój wynik nie jest taki zły - działa dobrze. To raczej z Towim appletem (oraz tym z przykładu) coś jest nietak.

Co do Twojego appletu:
applet pewnie sam w sobie ma double buffering, a Ty dodajesz do tego własny bufor, na którym znowu rysujesz sam labirynt - przez co 3 razy rysujesz obrazek o szerokości 640 w ciągu jednego calla przerysuj.

Jest fakt, że wciąż rysujesz obrazek ze zmiennej "obrazek" - który został wczytany przez toolkit i nie wiadomo czy jest kompatybilny - możesz go przekonwertować tak jak podałem wyżej.

Zupełnie inna sprawa, że aktywne renderowanie robi się w zupełnie inny sposób niż Ty to robisz. (tutaj jest to opisane)
Nie czytałeś kursów od Oracla/Suna? Powinieneś http://docs.oracle.com/javase/tutorial/

1 użytkowników online, w tym zalogowanych: 0, gości: 1