Zitat von
Jazzman_Marburg:
Das würde doch bedeuten, dass bei jedem Pixel um das sich der Ball bewegt, wird
1. Das gesamte "Spielfeld" gelöscht.
2. Das Gitternetz neu gezeichnet
3. Der Ball auf dem Gitternetz gezeichnet
4. Schlussendlich der OffScreen auf das sichtabre Canvas gezeichnet.
Genau das ist der Fall.
Zitat von
Jazzman_Marburg:
Ich frage mich ob der Schritt 1 und 2 nicht unnötig sind? Natürlich nur wenn das Gitternetz und der Ball auf verschiedene Canvas' gezeichnet würden: Am Gitternetz ändert sich doch nichts -- wozu es Neuzeichnen? Wenn der Ball ein eingenständiges Objekt ist, und ein eigenes Image zur Verfügung hat, dann müßte es doch viel effektiver (schneller) sein, nur den Ball zu zeichnen, ihn zu löschen (unsichtbar machen), und dann an der neuen Position zu zeichnen. Man würde somit nur 5% des sichtbaren Images (Gitternez plus Ball) neuzeichnen, statt das gesamte Gitternetz löschen, neuzeichnen, Ball löschen, neuzeichnen.
Vielleicht wirst du lachen. Aber bei deinem Ansatz (Ball und Gitternetz bekommen je eine eigene Image-Komponente) passiert folgendes:
1. Das Image vom Gitternetz wird von Delphi gezeichnet.
2. Das Image vom Ball wird gezeichnet, und überdeckt dann das Gitternetz.
3. Im OnTimer verschiebst du den Ball. Daraufhin zeichnet sich das Image des Gitternetzes neu (weil es Teile gibt, die vorher nicht sichtbar waren, es jetzt aber sein sollen) und verdeckt den Ball. Daraufhin wird wieder der Ball gezeichnet, der nun wiederrum das Gitternetz überdeckt.
Das erklärt auch das Flackern: Erst zeichnet sich das Gitternetz (Ball ist unsichtbar) und danach zeichnet sich der Ball wieder drüber. Es gibt also immer Momente in denen der Ball nicht zu sehen ist.
Das neuzeichnen des Gitternetzes ist nötig, das sich der Ball bewegt hat. dadurch gibt es Pixel, auf deinen der Ball war, wo jetzt aber Gitternetz sein soll.
Die siehst also: Das wovor du dich sträubst passiert in Wirklichkeiut bereits. Nur mit dem Unterschied dass die Komposition (Zusammenzeichnen von Ball und Gitternetz in einem Bild) im Moment von Delphi sichtbar gemacht wird, und es dadurch flackert. Abhilfe ist halt, dass du das gleiche machst, nur eben ijm Hintergund und das Bild erst anzeigst, wenn es fertig ist.
Wenn du das ganze implementierst wirst du übrigens sehen, dass das "unnötige" Neuzeichnen unveränderter Bereiche nicht viel Zeit kostet