Laden...

Geschwindigkeitsunterschiede Vista <-> XP

Erstellt von C_Athlet vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.967 Views
C
C_Athlet Themenstarter:in
31 Beiträge seit 2007
vor 17 Jahren
Geschwindigkeitsunterschiede Vista <-> XP

Hallo Zusammen,

ich habe eine kleine Anwendung unter Vista geschrieben, die dort auch sehr schnell läuft, aber unter XP dauert es 2-3 Sekunden bis alle Elemente erscheinen.

Hier mal ein einfacher Beispielcode zur Verdeutlichung:



        private void _addButtons()
        {
            int pos_x = 0;
            int pos_y = 0;
            
            for (int i = 0; i < 9; i++)
            {
                for (int j =0 ; j < 9; j++)
                {
                    Button btn = new Button();
                    btn.Text = "*";
                    btn.Width  = 40;
                    btn.Height = 40;

                        pos_x = j * 40;
                        pos_y = i * 40;

                    btn.Left = pos_x;
                    btn.Top  = pos_y;

                    pnl_Buttons.Controls.Add(btn);
                }
            }
        }

 

Also eigentlich werden hier ja nur 81 Button erstellt.
Mein Prog braucht zwar nicht so viele Buttons, aber als Beispiel scheint es gut geeignet.

Hat jemand eine Idee warum hier so deutliche Unterschiede in der Erstellungsgeschwindigkeit vorliegen. Das System, also der PC ist der gleiche.

Kann man das irgendwie beschleunigen?

Danke u. Gruß

Sebastian

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo C_Athlet,

das wurde bei Vista alles komplett neu gemacht, inkl. besserer Ausnutzung der Fähigkeiten der Grafikkarte. Bei XP wird es keine Beschleunigungsmöglichkeiten geben.

herbivore

1.274 Beiträge seit 2005
vor 17 Jahren

Hallo C_Athlet,

machst du ein Sudoku? 9x9 Felder sieht ganz dannach aus.

Es gibt eine Thread darüber wie man das anstellen kann, must mal suchen.

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

R
344 Beiträge seit 2006
vor 17 Jahren

Hi Alle,

Da mich Geschwindigkeit immer interessiert habe ich mal ein wenig damit gespielt.

Die Zeit wird verbraucht beim Zeichnen der Buttons.

Jeder Button ruft die OnPaint-Methode der Form auf.

So habe ich mir einen Button gemacht, der zunächst das Bild von sich malt und dann sich selbst. So merkt man das wenigstens nicht.

Das funktioniert aber nur mit diesen Buttons. Vielleicht fällt ja jemandem dazu etwas ein.

namespace btnTest
{
    public partial class Form1 : Form
    {
        MyButton btn ;
        public Form1()
        {
            InitializeComponent();
            _addButtons();
        }
        private void _addButtons()
        {
            int pos_x = 0;
            int pos_y = 0;

            for (int i = 0; i < 9; i++)
            {
                for (int j = 0; j < 9; j++)
                {
                    btn = new MyButton();
                    btn.Text = "*";
                    btn.Width = 40;
                    btn.Height = 40;

                    pos_x = j * 40;
                    pos_y = i * 40;

                    btn.Left = pos_x;
                    btn.Top = pos_y;
                    Controls.Add(btn);
                }
            }
            
        }
    }
    class MyButton : Button
    {
        public bool bildZeichnen = true;
        Image btnBild = Image.FromFile(@"Button.png");
        protected override void OnPaint(PaintEventArgs e)
        {
            if (bildZeichnen)
                e.Graphics.DrawImage(btnBild, new Point(0, 0));
            else
                base.OnPaint(e);
            bildZeichnen = false;

        }
    }
}
49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Robertico,

ControlPaint.DrawButton

herbivore

R
344 Beiträge seit 2006
vor 17 Jahren

Hallo herbivore,

wenn ich dich richtig verstehe, den Button immer selbst zeichnen?

In meinem Beispiel ist es so, dass wenn

base.OnPaint(e);

ins Spiel kommt, dann dauert es, da (vermute ich) immer die OnPaint der Form aufgerufen wird.

Beim Zeichnen des Bildes nicht.

Gruß Robert

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Robertico,

du zeichnest den Button als Bild (png). Verwende stattdessen ControlPaint.DrawButton. Das sollte eher noch schneller gehen.

herbivore

R
344 Beiträge seit 2006
vor 17 Jahren

Hallo herbivore,

Habe das probiert (kannte ich noch nicht).

Es geht sehr fix, aber ist nicht der selbe Style.

ControlPaint.DrawButton(e.Graphics,new Rectangle(this.Location,this.Size),ButtonState.Normal);

Geht das auch mit dem Style wie der Button oben?

Gruß Robert

€dit: Habe etwas gefunden:

                 ButtonRenderer.DrawButton(e.Graphics,ClientRectangle,System.Windows.Forms.VisualStyles.PushButtonState.Normal);

Dann wird der Button im XP-Style gezeichnet: Jetzt nur noch den Text dazu, und die Illusion ist perfekt. 🙂

R
344 Beiträge seit 2006
vor 17 Jahren
Das ises

Wer jetzt noch sagt, dass wäre langsam, kriegt Haue. 😉

    class MyButton : Button
    {
        public bool bildZeichnen = true;
        protected override void OnPaint(PaintEventArgs e)
        {
            e.Graphics.Clear(BackColor);
            if (bildZeichnen)
            {
                ButtonRenderer.DrawButton(e.Graphics, ClientRectangle, System.Windows.Forms.VisualStyles.PushButtonState.Normal);
                SizeF sizeF = e.Graphics.MeasureString(Text, Font);
                e.Graphics.DrawString(Text, this.Font, new SolidBrush(ForeColor), new PointF(((float)Width - sizeF.Width) / 2, ((float)Height - sizeF.Height) / 2));
            }
            else
                base.OnPaint(e);
            bildZeichnen = false;
        }
    }

Gruß Robert

PS: Im Debug-Modus kann man noch etwas sehen, wenn man schnell schaut.

Habe meinen Bildschirm vollgepflastert mit 800 Buttons:

            for (int i = 0; i < 25; i++)
            {
                for (int j = 0; j < 32; j++)
                {
                    btn = new MyButton();
                    btn.Text = "*";
                    btn.Width = 40;
                    btn.Height = 40;

                    pos_x = j * 40;
                    pos_y = i * 40;

                    btn.Left = pos_x;
                    btn.Top = pos_y;
                    Controls.Add(btn);
                }
            }

Dann kann man auch in der Release kurz etwas sehen.

C
C_Athlet Themenstarter:in
31 Beiträge seit 2007
vor 17 Jahren

Hallo Zusammen,

vielen Dank für die schnellen und guten Antworten.
Und vorallem vielen Dank an Robertico! ⚠

Sehr nett von dir das du dir die Zeit genommen hast das genauer zu untersuchen.

Ich habe in der Zwischenzeit das ganze mal in verschiedenen anderen Sprachen / Umgebungen getestet, aber DotNet ist mit Abstand am langsamsten.

In der von DotNet benötigten Zeit erstellt Java oder C++ viel viel mehr Elemente.
Ich habs nicht gemessen, würde aber behaupten, das hier der Faktor 50-100 zwischenliegt. Gibt es dafür eine Erklärung? ?(

Das C++ viel schneller ist war ja auch zu erwarten, aber das der Unterschied zwischen DotNet und Java so gravierend ist überrascht mich doch.

Euch allen ein schönes Wochenende!

Gruß

Sebastian