Blikani grafiky v C# – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Blikani grafiky v C# – .NET – Fórum – Programujte.comBlikani grafiky v C# – .NET – Fórum – Programujte.com

 

alois
~ Anonymní uživatel
12 příspěvků
19. 5. 2008   #1
-
0
-

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

Nahlásit jako SPAM
IP: 62.168.43.–
19. 5. 2008   #2
-
0
-

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.

Nahlásit jako SPAM
IP: 84.21.124.–
Dušan Janošík | web: djanosik.cz, @djanosik
mephi0
Expert
19. 5. 2008   #3
-
0
-

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ť ;)

Nahlásit jako SPAM
IP: 85.248.56.–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
19. 5. 2008   #4
-
0
-

To mephi :
Bohuzel mi ten doublebuffering taky moc nepomohl, respektive neprinesl zadne viditelne zlepseni. Docela by me zajimalo jak si to vyresil..? :)

Nahlásit jako SPAM
IP: 217.11.255.–
alois
~ Anonymní uživatel
12 příspěvků
19. 5. 2008   #5
-
0
-

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...?

Nahlásit jako SPAM
IP: 217.11.255.–
Dan
~ Anonymní uživatel
38 příspěvků
20. 5. 2008   #6
-
0
-

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..

Nahlásit jako SPAM
IP: 90.176.189.–
paashi0
Super člen
23. 5. 2008   #7
-
0
-

To Dan : To se lehce stane, když umístím tento kód do metody Control.Paint()
(mě se to už stalo...)

Nahlásit jako SPAM
IP: 91.127.152.–
Ajem tíčr, andrgraund tíčr!
mephi0
Expert
24. 5. 2008   #8
-
0
-

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

Nahlásit jako SPAM
IP: 85.248.56.–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
karel
~ Anonymní uživatel
167 příspěvků
8. 6. 2008   #9
-
0
-

2 mephi:
a nemohl by si prosimte ukazat nejakej kratkej priklad..?
ja uz sem vazne v koncich...

Nahlásit jako SPAM
IP: 217.11.255.–
mephi0
Expert
9. 6. 2008   #10
-
0
-

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

Nahlásit jako SPAM
IP: 85.248.56.–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
Sajmi0
Newbie
9. 6. 2008   #11
-
0
-

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í

Nahlásit jako SPAM
IP: 88.101.171.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 5 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý