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

Aktivity (1)
Avatar
roks
Člen
Avatar
roks:9.1.2014 19:19

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ý:9.1.2014 19:22

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:9.1.2014 19:38

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ý:9.1.2014 19:48

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:9.1.2014 19:57

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ý:9.1.2014 19:59

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:9.1.2014 20:00

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:9.1.2014 20:10

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
Jan Vargovský
Redaktor
Avatar
 
Nahoru Odpovědět 9.1.2014 20:47
Avatar
Odpovídá na roks
Andrej Farkaš:9.1.2014 22:53

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ý:9.1.2014 23:07

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:9.1.2014 23:18

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ý:9.1.2014 23:30

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:10.1.2014 7:12

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:11.1.2014 11:41

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):11.1.2014 12:05

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:11.1.2014 12:28

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:11.1.2014 12:38

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:11.1.2014 13:20

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.