Page flipping
Jag har en loop som målar upp innehållet i ett fönster men jag har problem med att det flimmrar (page flipping kallas det väl?). Kan man komma undan det på något sätt? Jag vet inte om det finns flera sätt att måla något på, men jag använder ett Graphics-objekt.
Svara
Sv: Page flipping
Nej, det är inte problemet som heter 'page flipping', utan lösningen.
Page flipping är att rita ut grafiken i ett objekt som inte visas på skärmen. När man ritat färdigt i objektet så ritar man ut objektet på skärmen.
När man använder page flipping "på riktigt" så uppdaterar man hela skärmen och använder två uppsättningar av skärmen i minnet, en sida som man visar och en sida som man ritar på. När man ritat färdigt en skärmbild så ändrar man bara pekaren så att det är den sidan som visas på skärmen istället, och börjar rita på den andra sidan.
Svara
Sv:Page flipping
Ok, där ser man. Finns det nåt speciellt smidigt sätt att göra detta på eller ska jag bara sätta mig ner och försöka? Som det är nu så skriver jag först till ett objekt i minnet såhär:
<code>
canvas=new Bitmap(5*worldSize,5*worldSize,System.Drawing.Imaging.PixelFormat.Format24bppRgb);
</code>
när det är klart så uppdaterar jag formen med formen.Invalidate() och där står
<code>
Graphics tempArtist=e.Graphics;
tempArtist.DrawImage(simulation.canvas,1,1,simulation.worldSize*5,simulation.worldSize*5);
</code>
Är det då inte redan en form av page flipping?
Svara
Sv: Page flipping
Ja, det är en form av page flipping.
Är det en stor bild som du ritar ut?
En tänkbar förklaring till att det flimrar är om det är något annat objekt som ritar ut något innan din kod ritar ut bilden, till exempel bakgrunden för formuläret.
Gör du invalidate på hela formuläret? Räcker det inte med att göra det på det objekt som ska ritas om?
Svara
Sv:Page flipping
Ja, det är en stor bild. Jag ritar direkt på formen. Vore det bättre om jag ritade på något annat objekt?
Svara
Sv: Page flipping
Testa att lägga ett objekt i formläret, som du kör invalidate på och som du ritar bilden på. Då kommer ju inte hela formuläret att ritas om.
Svara
Sv:Page flipping
Det funkade faktiskt utmärkt! Jag tycker det verkar lite konstigt eftersom formen är lika stor som det objektet jag ritar på nu, men det är väl bara att tacka och ta emot.
Svara
Sv: Page flipping
Lägg till följande efter InitializeComponent så får du doublebuffring och slipper flimmret.
1 2 3 4 | this .SetStyle(ControlStyles.UserPaint, true ); this .SetStyle(ControlStyles.DoubleBuffer, true ); this .SetStyle(ControlStyles.AllPaintingInWmPaint, true ); this .UpdateStyles(); |
Svara