Extra Performance

Tags:    java

Hej Udviklere,

Jeg forsøger i et af mine projekter, at tegne 4 millioner prikker, samt streger imellem hver af prikkerne. Dette tager, alt for lang tid, og det ligner at programmet hakker, indtil alle prikkerne er blevet tegnet (hvilket godt kan tage lidt tid for 4millioner prikker).

Det framework, jeg benytter mig af på nuværende stund er swing i java 1.6

Er, der nogle af jer der har en idé til, hvordan man kan få lidt ekstra performance ud af denne del af koden ?... Jeg overvejde lidt, om det kunne svare sig at skifte til opengl, men ved dog ikke om det kan svare sig, når det kun er i 2d vi tegner ?

Indtil videre, er det følgende kode, der bliver benyttet til at tegne:
Fold kodeboks ind/udJava kode 




6 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 15 karma
Sorter efter stemmer Sorter efter dato
For det første er 4 millioner prikker rigtig meget der skal tegnes. Så vidt jeg ved er Swing til GUI og ikke til grafik. De kan selvfølgelig godt tegne et par hundrede streger og sådan men mener ikke at det var en designprioritet at de skulle kunne tegne så meget, så hurtigt.

Der er flere ting du kan prøve for at forbedre performance.

1. Jeg er ikke sikker på hvor meget Java optimerer din kode. Så du kan eventuelt prøve at flytte beregninger ud af løkkerne som ikke afhænger af noget der ændres inde i løkken eller tælleren. F.eks. din første for-løkke, der kan cirkelWidth/2 flyttes uden for løkken så det kun beregnes en gang. Samme igen længere nede for -marginX/4

2. Du kan prøve at bede om hardware-understøttet drawing. Prøv at søge efter hardware-accelerated drawing i swing. Det har vidst noget med BufferStrategy at gøre.

3. Bliver alt vidst på skærmen samtidigt? Hvis det er noget som strækker sig over hundrede skærmbilleder, kan du blot nøjes med at tegne de vidste prikker og streger.



Indlæg senest redigeret d. 16.05.2012 21:48 af Bruger #14645
1. Jeg kan nu stadig ikke forstå du ikke kan flytte nogle af beregningerne ud:
Fold kodeboks ind/udJava kode 

Om til:
Fold kodeboks ind/udJava kode 


2. Der er vidst flere ting man kan med BufferStrategy, som double buffering, og page flipping. Mente også det var det man kunne slå hardware-accelereret drawing til. Men kan godt være jeg husker forkert.

Tror bestemt du vil kunne få en stor performance forbedring ved at tegne videre på det samme billede. I stedet for at du tegner en masse billeder fra bunden af, tilføjer du blot det seneste "step". Du kan tegne på en off-screen buffer som ikke bliver vidst. Når GUI'en så gerne vil tegne sig selv igen så kopierer du bare billedet over i skærmbufferen.



Hej Søren,

Tak for svaret, jeg kan dog ikke ændre mine for-løkker da, de ændres hver gang at der kommer et skærm billede op, lige fra den første step bliver tegnet, der kun indeholder en prik, til det sidste step. Der indeholder alle 4millioner prikker er blevet tegnet, bliver min "tegne kode" som du kan se, kaldt én gang pr. step. (jeps, det hjælper bestemt ikke på performance, at denne metode bliver kaldt så mange gange, er også derfor jeg forsøger at optimere den :) )

2)
Har dog forsøgt lidt med BufferStrategy; men indtil videre gav denne ingen ændring i udførslen af programmet.

3)
Problemet er, at det er ét billede, der viser alt der har været indtil nu, lige fra start til slut, så alle prikker bør være med.

4)
Overvejer, lidt om man bør tegne det på et billede, og så tegne videre på det samme billede under, hvert step af programmet, kunne dette måske være en mulighed for at give bedre performance ?



Tak, havde helt, glemt at man godt kan flytte bare en lille del af koden ud af for-loopet ;)

2) Kan også være, at jeg ikke fik implementeret det helt korrekt, men fulgte en tutorial, der gerne skulle give mig double buffering med den BufferStrategi jeg valgte (jeg fik dog kun nåede at rode med den i en lille times tid)

3) Jah, tror også at der er størst sandsynlighed for, at det bliver noget af den vej jeg kommer til at gå. Da det ligner, at dette vil give det største performance boost.



Uden at have luret din kodestump igennem, spørger jeg: Er alle prikker i "synsfeltet" eller er nogle uden for skærmbilledet?



alle prikker er i synsfeltet, selvom der dog nok er nogle af dem der overlapper, så er de stadigvæk i synsfeltet.



t