ca 20.000 Dreiecke malen
-
Hallo.
Mein programm malt ca 20.000 dreiecke in eine pickturebox.
leider dauert das malen ca 10 sek.
ich male die dreiecke so:public void DrawFace(Graphics g, Face f, Color c, float zoom, Point p) { System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath(); for (int x = 1; x < f.getSize(); x++) { Vertice p1 = f.getVertice(x - 1); Vertice p2 = f.getVertice(x); path.AddLine((float)(p1.x + p1.z / 2) / zoom + p.X, (float)(p1.y + p1.z / 2) / zoom + p.Y, (float)(p2.x + p2.z / 2) / zoom + p.X, (float)(p2.y + p2.z / 2) / zoom + p.Y); } path.CloseFigure(); //c = Color.FromArgb(255, c.R, c.G, c.B); g.FillPath(new SolidBrush(c), path); g.DrawPath(new Pen(Color.Black), path); }
Jetzt meine frage wie kann ich des malen schneller machen?
Gruß KY
-
Ganz einfach, erstelle eine Globale Bitmap und bevor du in die Zeichen funktion reinspringst malst du deine Dreiecke einfach auf die Bitmap und bei deiner Draw funktion muss einfach nur noch:
public void DrawFace(Graphics g, Face f, Color c, float zoom, Point p) { g.DrawImage(globalBitmap, new Point(0,0)); }
http://www.mycsharp.de/wbb2/thread.php?threadid=21782
guck dir da das Beispiel mit der Picturebox an
-
ok aber wie kann ich einen pfad in ein bitmap malen?
-
Pseudo-Code:
Bitmap neueBitmap=new Bitmap(...) Graphics gfx=Graphics.FromBitmap(neueBitmap); // Hier ganz normal gfx benutzen, wird dann alles in die Bitmap gezeichnet. gfx.Dispose();
-
achso des hab ich schon gemacht
ist trotzdem noch bei 10 sek pro 20.000 dreiecken
hast noch ne idee?
-
Hmm, Kantenglättung ausschalten?
Oder auf Managed DirectX setzen?
-
Kantenglättung hab ich schon abgeschaltet.
ich versuch es jetzt mal mit Irrlicht vll geht des beste.
Vielen Dank Gruß KY
-
mmmhhhhh irrlicht ist net ganz des was ich brauch.
weiß jm was anderse mit dem ich leicht dreiecke zeichen kann?
Gruß KY
-
Hi,
Dreiecke zeichnen … das schreit doch förmlich nach einer 3D-Engine! Die sorgt nämlich dafür, dass die ganze leidige Koordinatenberechnung von der GPU übernommen wird. Mit GDI+ wirst Du hier nicht viel reißen können.
-
Richtig, entweder Du nimmst DirectX oder ähnliches oder Du stellst mal von Debug auf Release um - wenn Du's noch nicht getan hast.
-
mit release hab ichs auch schon getestet des dauert dann immer noch 2sek.
directx hab ich schon einiges angeschaut aber leider bekomms ich net hin.
weiß jm ein gutes tut wo mehrere dreiecke gezeichnet werden, und die kamera position geändert wird?
(ich hab nur welche gefunden die ein dreieck zeichen und die welt bewegen)Gruß KY
-
Das hier hat mir gut gefallen und ist recht umfangreich:
http://www.riemers.net/eng/Tutorials/dxcsharp.php
-
wieso sollte das lange dauern?
Also hier zeichne ich auch beim start 20000 vierecke und das dauert nicht mal 1 sec.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication1 { public partial class Form1 : Form { private Bitmap bitmap; //Bitmap wo alles drauf gemalt wird public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { bitmap = new Bitmap(this.Size.Width, this.Size.Height); // bitmap ist so groß wie das Fenster Graphics graph = Graphics.FromImage(bitmap); //das Graphic object von der Bitmap bekommen Brush brush = new SolidBrush(Color.DarkBlue); Random rand = new Random(); //Random für Zufalls koordinaten for (int a = 0; a <= 20000; a++) { int x = rand.Next(1, this.Size.Width); //Zufalls koordinaten int y = rand.Next(1, this.Size.Height); //Zufalls koordinaten Rectangle rectangle = new Rectangle(new Point(x, y), new Size(2,2)); graph.DrawRectangle(new Pen(brush), rectangle);// male 20000 x ein Dreieck auf die Bitmap } pictureBox1.Refresh(); //Ruf Paint auf } private void pictureBox1_Paint(object sender, PaintEventArgs e) { e.Graphics.DrawImage(bitmap, new Point(0,0)); //male die große bitmap auf die picture box } } }