MoinMoin, eine weitere Frage im Zusammenhang mit meinem GameOfLife Gebastel. Das Display flackert. Und zwar in unterschiedlichen Mustern, je nach dem wie lange es dauert, ein neues Bild zu zeichnen. Ich hab vor Ewigkeiten mal eine HandsOn-Session von ST mitgemacht, da hieß es sinngemäß:"Die Displays haben 2Layer. Zeige den einen Layer und bearbeite den anderen, damit es nicht flackert". Genau das klappt aber nicht, da jedesmal beim Layerwechsel ein Flackerer erzeugt wird. Wenn ich aber nur einen Layer benutze und man quasi direkt jedes gemalte Pixel auftauchen sieht, ist das Flackern deutlich geringer, es ergibt sich aber ein anderes Problem. Es sieht aus, als hätte man eine PWM auf dem Bild die von links nach rechts und von oben nach unten immer weniger wird. Ist ja auch irgendwie logisch, wenn man sich vor Augen hält: BildMalen() Bildschirm leeren ---> erstes Pixel an 0,0 malen ---> letztes Pixel erster Reihe malen x,0 ---> ..... ---> erstes Pixel letze Reihe malen 0,y ---> letztes Pixel letzte Reieh malen x,y ---> wieder von vorn. Das erste Pixel wird natürlich viel länger gezeigt als das letzte. Das ist also auch kein Zustand. Kennt jemand von euch eine Möglichkeit, das Flackerfrei hinzubekommen? Ich habe Videos von dem Discoboard gesehen, wo das Display schön flüssig lief. Prinzipiell muss das also gehen. MfG Chaos
Das Display nicht leeren. einfach neue Pixel über alte schreiben. damit ändern sich visuell nur die Pixel die geändert werden müssen ohne flackern. Der DMA hilft den framebuffer schnell genug auf das Display zu schubsen um es für den Nutzer in "einem Guss" aussehen zu lassen.
Max D. schrieb: > Das Display nicht leeren. > einfach neue Pixel über alte schreiben. > damit ändern sich visuell nur die Pixel die geändert werden müssen ohne > flackern. > Der DMA hilft den framebuffer schnell genug auf das Display zu schubsen > um es für den Nutzer in "einem Guss" aussehen zu lassen. Aber das Display leeren passiert doch auf dem unsichtbaren/nicht angezeigtem Layer? Das dürfte doch eigentlich keinen Einfluss haben? Bisher leere ich den Layer vor dem neuschreiben, damit ich nur lebende Zellen zeichnen muss, was schneller ist, als jede Zelle zu zeichnen. Wenn dass dann fertig gemalt ist, wechsle ich den Layer. Und das ist beim durchsteppen auch sehr deutlich zu sehen. Es gibt einen Flackerer beim Layerwechsel. Selbst wenn ich beide Layer leer habe, also gar nichts mit ihnen gemacht habe, und dann den Layer wechsel, gibt es diesen Flackerer. Von daher glaube ich nicht, dass es einen Unterschied macht, ob ich den Layer vorher leere oder nicht?!
Dein displaytreiber macht dann wohl den Fehler das display zu löschen bevor er den neuen layer schiebt.
J. T. schrieb: > Aber das Display leeren passiert doch auf dem unsichtbaren/nicht > angezeigtem Layer? Das dürfte doch eigentlich keinen Einfluss haben? > Bisher leere ich den Layer vor dem neuschreiben, damit ich nur lebende > Zellen zeichnen muss, was schneller ist, als jede Zelle zu zeichnen. > > Wenn dass dann fertig gemalt ist, wechsle ich den Layer. Wirklich den Layer? Nicht das übliche Doublebuffering synchron zum VSync/VBlank? Siehe bspw. AN4861 Abschnitt 4.4.2 LTDC and DMA2D/CPU synchronization
Arc N. schrieb: > Siehe bspw. AN4861 Abschnitt 4.4.2 LTDC and DMA2D/CPU synchronization Werd ich mir mal zu Gemüte führen. Wo du dass erwähnst, dass könnte in die richtige Richtung gehen. Ich erinner mich dunkel, als ich angefangen habe, war in include files nur ein Layer definiert. Also hab ich die Layer folgendermaßen erstellt init(layer0) //Die Adresse gabs in den includes init( (layer0 + (4*480*272) ). 4mal wegen ARGB 480mal wegen X Pixeln und 272 mal wegen den Y Pixeln. Das sollte doch soweit passen? Und der DMA wurde zwar initialsiert von CubeMX, aber benutzt wird er irgendwie nirgendwo ;D. Naja mal schauen was mir die AN so darüber erzählen kann. MfG Chaos
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.