Laden...

Erhebliches Perfomance Problem mit selbstgezeichneter Graphic

Erstellt von Fabian710 vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.606 Views
Thema geschlossen
F
Fabian710 Themenstarter:in
42 Beiträge seit 2013
vor 10 Jahren
Erhebliches Perfomance Problem mit selbstgezeichneter Graphic

Hallo zusammen,
ich habe meine Matrix komplett selbst gezeichnet. So war es relativ einfach möglich, dass anzupassen. (Siehe Anhang)
Allerdings ergibt sich das Problem, sobald eine Hohe Anzahl an Mitarbeiter (Spaltenanzahl) und daraus resultierend hohe Anzahl an Zeilen (Qualifikationen der Stellen) vorliegt.
Ein Scrollen ist fast unmöglich. Wenn man bedenkt, dass hinter jeder Stelle ca 50-60 Qualis hinterliegen und die pro Mitarbeiter dann auf der Form abgebildet werden.
Die Datenbankanfragen sind alle durchgeführt und es findet lediglich ein abgleich in Listen statt. Habt ihr Vorschläge wie ich die Laufzeit verbessern kann. Weil so ist es leider für Abteilungen wo mehr als 15 MA hinterlegt sich noch nicht ganz akzeptabel 😦

Ich hab schon gegoogelt, hier im Forum nach Lösungen gefunden aber nix, was mir wirklich weiterhilft. Am liebsten würde ich es so dynamisch gestalten, das er je nach Scrollposition die nötigen Zeilen neu zeichnet, oder aber, alles zu Beginn zeichnet, man munter scrollen kann ohne das es neu gezeichnet wird!

Danke für eure Tipps!! 😃

2.079 Beiträge seit 2012
vor 10 Jahren

Ich würde sagen, dass Windows Forms dafür einfach nicht geeignet ist, es wird ja auch nicht mehr weiter entwickelt.

Guck dir mal das DataGridView (oder DataGridView) an

Ich glaube, wenn du versuchst, etwas selber zu zeichnen, fällst du mit Forms auf die Nase, das ist zu langsam. WPF ist da besser geeignet, weil es nicht erst Umwege gehen muss, sondern direkt auf DirectX aufsetzt.

Ansonsten, was genau macht denn das Programm?
Manche einfache Dinge mit Listen sind auch in Excel gut möglich. Ich hab mir letztens ein WorkSheet in Excel gebaut, das mit Bestellungen automatisch kalkuliert und aufbereitet, ich muss nur den aktuellen Stand eintragen.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

F
Fabian710 Themenstarter:in
42 Beiträge seit 2013
vor 10 Jahren

Kann man denn mit WPF ebenfalls auf die Graphic Komponente zugreifen? Ich fand das so recht einfach zu handhaben. DataGridView habe ich auch probiert aber Probleme bei der Zuordnung der Spalten und Zeilen Beziehungen gesehen.
Programm läuft so ab, dass aus SAP Tabellen (CSV-Format) exportiert werden und in SQL-Tabellen importiert (Direktzugriff auf SAP macht die Perfomance ganz hinüber.
Dann werden Datenbankabfragen gemacht und die Informationen (Mitarbeiter, Stellen+Qualifikation) in Objekte und dann in Listen gepackt.
Und mit der Paint Methode werden diese dann abgearbeitet und dem User auf dem Bildschirm angezeigt.

Hinzu kommt, das bei mir unter Windows 7 keine WPF Anwendung vernünftig dargestellt wird! 😮

4.221 Beiträge seit 2005
vor 10 Jahren

Ich würde sagen, dass Windows Forms dafür einfach nicht geeignet ist, es wird ja auch nicht mehr weiter entwickelt.

So ein Käse... wir setzen auch ein selber gezeichnetes Grid ein... Wenn man es richtig macht (und nur das zeichnet was auch sichtbar ist)... dann ist das mehr als nur genügend schnell.

Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

F
Fabian710 Themenstarter:in
42 Beiträge seit 2013
vor 10 Jahren

Wenn man es richtig macht (und nur das zeichnet was auch sichtbar ist)... dann ist das mehr als nur genügend schnell.

Das ist genau das, was ich hören wollte. Ich habe dazu leider überhaupt kein passenden Ansatz!

4.221 Beiträge seit 2005
vor 10 Jahren

Du brauchst Variablen für:

  • ScrolledLines
  • ScrolledColumns
  • MaxVisibleLines
    usw.

MaxVisibleLines berechnest Du aus ClientSize.Heigt und Zeilenhöhe

Im OnPaint zeichnest Du dann nur das was auch sichtbar ist

(mit einem For... von ScrolledLines für eine Anzahl von MaxVisibleLines)

Das selbe für die Columns

Das kriegst Du schon hin 😃

Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

2.079 Beiträge seit 2012
vor 10 Jahren

Ok, dann hab ich mich geirrt. Ich hatte bei Forms bisher gerne mal Probleme mit der Performance der Oberfläche.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

F
Fabian710 Themenstarter:in
42 Beiträge seit 2013
vor 10 Jahren

Für die MaxVisibleLines habe ich mir nun eine Methode geschrieben. Das funktioniert soweit auch. Wie komme ich denn an die Scrolled Lines ran? Arbeite ich dort im Scroll Event oder bleibe ich im PaintEvent?

F
10.010 Beiträge seit 2004
vor 10 Jahren

Und warum hast du das selber gemacht?

Es gibt doch vernünftige Grids die mit zigtausend Zeilen/Spalten zurechtkommen.

4.221 Beiträge seit 2005
vor 10 Jahren

Unser Grid muss TouchScren-fähig sein... zudem Headers mehrsprachig und generell alles vom KUNDEN Customizebar (der Kunde kann SELBER definieren was erlaubt ist / Spaltenbreiten persistent speicherbar usw...)

Aber ev. meintest Du ja Fabian710 😃

Gruss
Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

4.221 Beiträge seit 2005
vor 10 Jahren

@Fabian710

Ich zeichne sogar die Scrollbars selber (da z.B: die Breite der Scrollbars bei uns auch vom Kunden customizebar ist ) (Fette-Finger-Scrollbars)..

Daher weiss ich natürlich immer wie weit der User gescrollt hat.

Alles muss Touchscreen-fähig sein 😃

Gruss
programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

5.658 Beiträge seit 2006
vor 10 Jahren

Hi Fabian710,

in deinem Screenshot sehe ich kanpp 70 gezeichnete Zeichenketten und ein paar Linien. Wenn man es richtig macht, kann man das alles mehrmals pro Sekunde zeichnen, selbst auf schwachen Systemen. Von deinem Code zeigst du aber nichts, so daß man hier nur raten kann, was du anders machen solltest.

Am liebsten würde ich es so dynamisch gestalten, das er je nach Scrollposition die nötigen Zeilen neu zeichnet

Das wäre auf jeden Fall das erste, was man probieren sollte. Ist ja auch nicht schwer, nur die Bereiche zu zeichnen, die gerade sichtbar sind.

oder aber, alles zu Beginn zeichnet, man munter scrollen kann ohne das es neu gezeichnet wird!

Das wäre auch eine Möglichkeit, bei der du deinen Code nicht einmal groß umschreiben müßtest. Einfach alles in einem Bitmap zeichnen, so wie du jetzt auf die Form zeichnest, und dann nur noch das Bitmap an der richtigen Position darstellen. Allerdings verlierst du dann die Möglichkeiten zur Benutzer-Interaktion mit den Events der Steuerelemente. Falls bestimmte Bereiche klickbar oder "hover"-bar sind, mußt du das dann eben simulieren.

Christian

Weeks of programming can save you hours of planning

F
10.010 Beiträge seit 2004
vor 10 Jahren

@Programmierhans:
Nicht nur ev.
Aber da es sowas schon für vergleichbar kleines Geld gibt ( was hat euch die Entwicklung gekostet?), würde ich mir das nicht selber antun.
z.b. http://www.telerik.com/products/winforms.aspx
Die bringen auch gleich MSAA mit ( ist bei einigen wichtig für UI Tests ).

Das was Fabian710 hier vor hat, kann ( zumindest bei dem bisschen was er hier zeigt ) jedes Grid, selbst das DGV.
Warum er da Probleme sieht, liegt wahrscheinlich eher an der unpassenden BusinessLogik.

Hinweis von herbivore vor 10 Jahren

In Suche Control für Matrixdarstellung mit hierarchischer Struktur hat Fabian710 bereits ein passendes Control gesucht und auch sinnvolle Vorschläge bekommen.

Insofern ist dieser Thread hier möglicherweise sogar vollkommen überflüssig. Auf jeden Fall ist er nicht zielführend, so vage wie die von Fabian710 Informationen waren, die hier bisher gegeben wurden.

Gerade bei einer tabellarischen Darstellung ist es mehr als einfach zu ermitteln, welche Zellen gerade sichtbar sind.

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.1 und 5.

Thema geschlossen