Bonjour
Je réalise un programme qui créé un nombre N de bufferedImage (Taille 500 x 500, Type INT_ARGB), composée chacune de 5000 triangles générés aléatoirement. Chacun de ces triangles possède une couleur générée aléatoirement (R aléatoire, G aléatoire, B aléatoire, et Alpha aléatoire).
Je précise que ce sont des images que je ne veut pas afficher. Je veut ensuite faire des statistiques sur chaque pixels et notamment sur les couleurs obtenues par superposition d'objet ayant une transparence différente. .
La génération d'une image prend environ 8 secondes, ce qui n'est pas du tout acceptable comme temps de traitement sachant que N peut varier de 100 à 1000.
J'ai l'impression que c'est la transparence qui ralentit et qu'a chaque fois que je fais un nouveau triangle, il recalcule pour chaque pixel, la couleur à afficher en fonction de tous les triangles précédemment tracés.
Pouvez vous me confirmer ?
Voici mon code
Main
Solution
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public static void main(String[] args) { Image[] imgs = new image[100]; for(int i =0;i<100;i++) imgs = (new Solution(5000, 500, 500, 3)).buildImage(); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 public class Solution { private ArrayList<Forme> liste = new ArrayList<Forme>(); private int maxWidth; private int maxHeight; public Solution(int nbForme, int maxWidth, int maxHeight, int maxPoints) { this.maxWidth = maxWidth; this.maxHeight = maxHeight; for(int i=0;i<nbForme;i++) liste.add(new Forme(maxWidth, maxHeight, maxPoints)); } public BufferedImage buildImage() { GraphicsConfiguration configuration = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(); BufferedImage compatibleImage = configuration.createCompatibleImage(this.maxWidth, this.maxHeight, Transparency.TRANSLUCENT); Graphics g = compatibleImage.getGraphics(); for(Forme f : this.liste) f.paint(g); g.dispose(); return compatibleImage; }Je cherche à créer ces images de manière performante.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 public class Forme { public Polygon polygon; public Color color; public Forme(int maxWidth, int maxHeight, int maxPoints) { Random r = new Random(); // Generation de la couleur this.color = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255), r.nextInt(255)); // Generation du polygon int nbPoints = 3 + r.nextInt(maxPoints); this.polygon = new Polygon(); for(int i=0;i<nbPoints;i++) polygon.addPoint(r.nextInt(maxWidth), r.nextInt(maxHeight)); } public void paint(Graphics g) { g.setColor(this.color); g.fillPolygon(this.polygon); } }
J'ai essayer d'utiliser l'accélération OPENGL de JAVA2D en rajoutant l'option qui va bien dans VM Arguments sous eclipse --> Cela ne change rien
Je pensai utiliser OPENGL directement pour générer l'image mais je ne sais pas s'il est possible de générer une image par ce biais et la manipuler ensuite sans l'afficher.
Sinon il y a les volatiles Image mais je ne suis pas sur que ce soit ce qu'il me faut.
Si quelqu'un peut confirmer ou si quelqu'un a d'autre piste je suis preneur.
Partager