Diskuze: Zrýchlenie Graphics vykreslenej v PictureBoxe

C# .NET .NET (C# a Visual Basic) Zrýchlenie Graphics vykreslenej v PictureBoxe American English version English version

Avatar
roks
Člen
Avatar
roks:

Zdravím, nevedel by mi niekto poradiť, ako by som mohol zvýšiť rýchlosť Graphics vykreslenej v PictureBox-e? :)

 
Odpovědět 9.1.2014 19:19
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na roks
Jan Vargovský:

Ukaž nám, jakým způsobem vykresluješ, pak ti můžeme poradit.

 
Nahoru Odpovědět 9.1.2014 19:22
Avatar
roks
Člen
Avatar
Odpovídá na Jan Vargovský
roks:

môj PictureBox má názov panelMapa a vykreslujem to takto:

public void prekresliMapu(Graphics g, bool vykresliObjekty)
{
if (vykresliObjekty == true)
            for (int i = 0; i < Program.Mapa[index].objekty.Count; i++)
            {
                Bitmap obr = (Bitmap)Gamenator.Properties.Resources.bezObrazku;
                var skontrolujObj = Program.Objekty.SingleOrDefault(x => x.id == Program.Mapa[index].objekty[i].idObjektu);
                if (skontrolujObj != null)
                {
                    var skontrolujObr = Program.Obrazky.SingleOrDefault(z => z.id == skontrolujObj.idObrazku);
                    if (skontrolujObr != null)
                    {
                        obr = skontrolujObr.obrazok;
                        obr.MakeTransparent(skontrolujObr.farba);
                    }
                    Program.Mapa[index].objekty[i].obr = obr;
                    g.DrawImage(obr, Program.Mapa[index].objekty[i].poziciaX, Program.Mapa[index].objekty[i].poziciaY, obr.Width, obr.Height);
                    }
            }

            if (mriezka == true)
            {
                for (int j = 0; j <= panelMapa.Width; j++)
                    g.DrawLine(Pens.Black, new Point(0, j * vyskaMriezky), new Point(panelMapa.Width * vyskaMriezky - 1, j * vyskaMriezky));
                for (int j = 0; j <= panelMapa.Height; j++)
                    g.DrawLine(Pens.Black, new Point(j * sirkaMriezky, 0), new Point(j * sirkaMriezky, panelMapa.Height * sirkaMriezky));
            }
}

Presne takto... pravdaže ešte pred prekresliMapu(...) dám panelMapa.Refresh

 
Nahoru Odpovědět 9.1.2014 19:38
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na roks
Jan Vargovský:

Trošku nevím co to má dělat. Já si uchovával bitmapu a překreslil to co se potřebovalo překreslit. Jednoduše jsem měl nějakou frontu a tu jsem vždycky jen překreslil v té bitmapě. Nevím kolik tam toho máš (těch objektů v té mapě) navíc název "objekty" je trošku zmatený.

Btw, už jen z pohledu je ta metoda nějaká divná. Proč jí voláš, když jí stejně dáš false a pak zjistíš hned u první podmínky, že jí vlastně nechceš...

var skontrolujObj = Program.Objekty.SingleOrDefault(x => x.id == Program.Mapa[index].objekty[i].idObjektu);

Při každé iteraci prohledáváš další kolekci ... Odkud vůbec bereš to x a z ?

Ještě nakonec, přečti si něco o C# konvencích, tu nejsi v Jave.

 
Nahoru Odpovědět 9.1.2014 19:48
Avatar
roks
Člen
Avatar
Odpovídá na Jan Vargovský
roks:

Aha, takže ty si to prekreslil do bitmapy a ak správne chápem bitmapu si nastavil ako obrázok, skúsim to tak vďaka :) ... to kvôli tým názvom? Ok, pozriem sa na to

 
Nahoru Odpovědět 9.1.2014 19:57
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na roks
Jan Vargovský:

Jako mi už vadí i ta čeština. Tu snesu, ale nedodržování konvencí a ještě blbé pojmenování...

 
Nahoru Odpovědět 9.1.2014 19:59
Avatar
roks
Člen
Avatar
Odpovídá na Jan Vargovský
roks:

Ja píšem po slovensky a nie po česky a to vadí? :o ... ok, idem si ich pozrieť ;)

 
Nahoru Odpovědět 9.1.2014 20:00
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Jan Vargovský
Petr Nymsa:

x a z jsou zástupci v prediktátu

Nahoru Odpovědět 9.1.2014 20:10
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na roks
Andrej Farkaš:

Napríklad podmienky if (mriezka a vykresliObjekty) môžeš skrátiť a myslím, že by sa to tak aj malo robiť.

if (mriezka)
// Ak mriezka == true
if (!mriezka)
// Ak by si potreboval kontrolovať či boolovská premenná je fakse
Nahoru Odpovědět 9.1.2014 22:53
Live. Love. Learn.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Andrej Farkaš
Jan Vargovský:

On chce optimalizovat a né refaktorovat.

 
Nahoru Odpovědět 9.1.2014 23:07
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jan Vargovský
Kit:

A jak chceš tohle optimalizovat bez refaktorování?

Nahoru Odpovědět 9.1.2014 23:18
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Kit
Jan Vargovský:

Ježiš, ono to ani snad není refaktoring... Je úplně jedno jestli napíšeš if true == true a nebo if true. Ano druhou možnost píšeme všichni, on jistě taky brzo začne, to jeho kód ale vůbec nezrychlí a nepomáhá mu vyřešit problém.

 
Nahoru Odpovědět 9.1.2014 23:30
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jan Vargovský
Kit:

Měl jsem na mysli to přepsat do OOP.

Nahoru Odpovědět  -1 10.1.2014 7:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
roks
Člen
Avatar
roks:

Vďaka všetkým za snahu. Spravil som, čo mi poradil p4koo a nechal som to vykreslovať do bitmapy, ktorá sa následne stane obrázkom PictureBoxu. Ale chcel by som sa ešte spýtať, keď vykreslím veľa objektov, program začne sekať, alebo PictureBox spadne a jeho obrázok je permanentne bieli obdĺžnik s červeným orámovaním červenou uhlopriečkou. Dá sa tomuto nejak predísť?

 
Nahoru Odpovědět 11.1.2014 11:41
Avatar
Odpovídá na roks
Luboš Běhounek (Satik):

Pokud toho kreslíš opravdu hodně, zauvažuj na použitím DirectX nebo OpenGL.

Nahoru Odpovědět 11.1.2014 12:05
:)
Avatar
roks
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
roks:

Tomuto som sa chcel vyhnúť, lebo s DirectX a OpenGL nemám žiadne skúsenosti :(

 
Nahoru Odpovědět 11.1.2014 12:28
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na roks
David Čápka:

Můžeš to přepsat do WPF, tam to jede pod DirectX automaticky, WF je GDI.

Nahoru Odpovědět 11.1.2014 12:38
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
roks
Člen
Avatar
Odpovídá na David Čápka
roks:

Aha, lenže ja mám celý projekt vo WinForms a vo WPF som tiež asi nerobil, tak asi skúsim ten directX, len taká otázka, keďže vôbec s tým nemám skúsenosti, musím ho vložiť do projektu ako novú knižnicu alebo ako? :)

 
Nahoru Odpovědět 11.1.2014 13:20
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 19 zpráv z 19.