Dobry den, mam takovy mensi problem.
Udelal sem hru v grafice ktera je v panelu, vse je ok, ale problem je v tom, ze se panel hrozne rychle refreshuje a hrozne blika.
Kamarad mi rikal, ze mel ten sami problem v deplhi a tam to pry vyresil jakysi "double buffering" daneho panelu. Nevedel by jste nekdo jak to udelat v C#?
Za odpovedi predem dekuji
Fórum › .NET
Blikani grafiky v C#
Zdravím,
to je dost často kladená otázka. DoubleBuffering se dá zapnout poměrně jednoduše (pro celý control / formulář). Více třeba zde: http://www.bobpowell.net/doublebuffer.htm.
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer,true);
GDI+ je obecně horzně pomalej a ne vždy to pomůže.
To alois : mne doublebuffering, ktorý ide zapnuť tak SUPER jednoducho nepomohol. vadilo mi nechcene vykresľovanie pozadia. Neviem kde je tvoj problem, ale ak to nebudeš môcť vyriešiť daj vedieť, zaoberal som sa blikanim viac než dosť ;)
To mephi :
Bohuzel mi ten doublebuffering taky moc nepomohl, respektive neprinesl zadne viditelne zlepseni. Docela by me zajimalo jak si to vyresil..? :)
Pridam jeste kus zdrojaku pro vetsi nazornost:
Toto je v jakemsi timeru:
Graphics gfx = panel1.CreateGraphics();
panel1.Refresh();
gfx.DrawIcon(icon, x[i], y[i]);
Blikani je zrejme zpusobene tim panel1.Refresh(), da se to vyresit i jinak...?
To alois : No minimalne bych nezapominal uvolnovat..
using (Graphics gfx = panel1.CreateGraphics()){
panel1.Refresh();
gfx.DrawIcon(icon, x[i], y[i]);
}
taky bych si dal pozor aby nedochazelo k tomu ze jeste nez vykreslim(zobrazim) jeden snimek uz se snazim vykreslovat dalsi..
ja pri ručnom vykresľoavni najradšej použivam dedeny objekt od Panel. Potom v konstruktore nastavim štýl na opaque popripade ine (tam je aj ten doublebufering, ktorý nepoužívam). Doublebuffering si robim sam, buď kreslenim na bitmapu a až bude cela vykreslena vykreslim ju celu na monitor, alebo použivam triedu BufferedGraphics
public class paintPanel : Panel
{
//...
private BufferedGraphicsContext context;
public paintPanel()
{
this.currentSettings = currentSettings;
context = BufferedGraphicsManager.Current;
context.MaximumBuffer = this.ClientSize;
}
public void redraw()
{
bg = context.Allocate(this.CreateGraphics(), this.ClientRectangle);
using (Graphics g_tool = bg.Graphics)
{
// kreslenie pomocou g_tool
bg.Render();// vykreslenie na raz
}
}
}
viac na live.com
Mam takovy problem pri jednoduchem vykreslování, problikává mi tam takový šedý pruh, nevíte někdo co s tím?
Zdroják:
public partial class Form1 : Form
{
public Pen p;
public Form1()
{
InitializeComponent();
p = new Pen(Color.Red, 10f);
this.MouseClick += new MouseEventHandler(OnMouseClick);
this.MouseMove += new MouseEventHandler(OnMouseMove);
this.Paint += new PaintEventHandler(OnPaint);
}
void OnPaint(object sender, PaintEventArgs e)
{
if (!kresliSe)
{
kresliSe = true;
using (Graphics g = e.Graphics)
{
g.Clear(Color.White);
g.DrawLine(p, lastMouseClick, mousePosition);
}
kresliSe = false;
}
}
void OnMouseMove(object sender, MouseEventArgs e)
{
mousePosition = e.Location;
this.Invalidate();
}
void OnMouseClick(object sender, MouseEventArgs e)
{
lastMouseClick = e.Location;
}
public Point mousePosition = Point.Empty;
public Point lastMouseClick = Point.Empty;
public bool kresliSe = false;
}
Edit: Už sem to vyřešil bufferem a zakázáním vykreslování pozadí
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Překreslování formuláře - blikání — založil Pebble
Těžké začátky s ATMega8 a blikání LED — založil DragonSoul
Blikání ikony běžící aplikace na hlavním panelu v D XE2 — založil Borisek
Hledáme 3D grafiky — založil UnicornGames
Moderátoři diskuze