GDI Flimmern Backbuffering



  • Rufst du irgendwo anders in deinem Code InvalidateRect auf? Wenn ja, ist der letzte Parameter auf FALSE gesetzt?



  • Wenn ich das richtig gesehen habe ist auch der DeleteObject-Aufruf für hbmOld fehl am Platz -> löschen: 🙂



  • Ja, ich rufe InvalidateRectangle auf und der letzte Parameter ist auf true gesetzt. 😉 Ist das schlimm?



  • Ja, denn dann wird vorher unnötiger Weise dein Fenster mit dem in der Fensterklasse angegebenen Brush ausgefüllt - was unnötig ist, wenn du eh nachher alles überblittest. Außerdem führt dies eben dazu, dass zwischendurch das Fenster kurz in der Brushfarbe "aufblitzt" 😉 - Also einfach den letzten Parameter auf FALSE ändern 🙂



  • Jo, jetzt funzt es super. Grosses Danke, im nachhinein isses auch logisch. Das ganze hin und her hat jetzt eh den Vorteil, dass ich mich noch nen bisl intensiver mit den GDI sachen auseinander gesetzt habe.



  • Mh, jetzt hab ich plötzlich nen neues fieses Problem. Auf XP funzt das Prog super, unter Win9x frisst das programm immer mehr ressourcen und friert am ende komplett ein. Habe ich da vergessen irgendwelche Handles korrekt zu schliessen?



  • Mir ist jetzt spontan nichts aufgefallen - du könntest wenn dann noch die Erzeugung des Backbuffers nach WM_CREATE oder evtl. besser WM_SIZE (dort dann nicht vergessen den ggf. schon angelegten Backbuffer vor dem Neu-Anlegen freizugeben) verschieben (Zerstören dann bei WM_PAINT). Und wenn sich der Inhalt des Backbuffers nur bei Größenänderungen verändert (oder wann auch immer), dann könntest du auch die Befüllung des Backbuffers dorthin verschieben 🙂



  • flenders schrieb:

    du könntest wenn dann noch die Erzeugung des Backbuffers nach WM_CREATE oder evtl. besser WM_SIZE (dort dann nicht vergessen den ggf. schon angelegten Backbuffer vor dem Neu-Anlegen freizugeben) verschieben (Zerstören dann bei WM_PAINT).

    Dann musst du aber noch beachten, dass der Backbuffer gelegentlich neu angelegt werden muss (etwa bei WM_SIZE oder WM_DISPLAYCHANGE).



  • Also es ist bei meinem Programm so, dass ein Thread die Schrift nach oben bewegt und dabei mit einer Taktung von 10 Herz WM_PAINT aufruft. Und unter Windoof 98/ME wird das ganze zunehmend langsamer, bis gar nix mehr geht. Deshalb schätze ich dass das Problem irgendwo in WM_PAINT liegt.Ich werd denn jetzt mal probieren die erzeugung des Backbuffers nach WM_CREATE auszulagern. Vielleicht hilfts. Ich find eh merkwürdig das XP anscheinend alle handles korekt zu schliessen scheint und 9x aus irgendwelchen Gründen mit meinem Code nicht klar kommt.



  • Achso und ehe ichs vergesse, das Fenster ist so erzeugt dass die Grösse nicht verändert werden kann. Also brauche ich dann jawohl WM_SIZE nicht zu beachten.


Anmelden zum Antworten