Diskuze: Win Form - Vykreslení tiles

C# .NET .NET (C# a Visual Basic) Win Form - Vykreslení tiles American English version English version

Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Zdravím, přes rok více méně dělám programy, které nepotřebovali moc grafiku a je to tak trochu chyba. Nemám zkušenosti ohledně práce s grafikou apod. K problému. Mám jednoduchý, zatím celkem hloupý, generátor bludiště. A samozřejmě chci bludiště nějak zobrazit. Mám připravené obrázky 30x30, které znázorňují cestu / zeď. Bludiště mi vygeneruje pole int a podle hodnoty v poli vykreslím patřičný typ obrázku (cesta, zed). Do formu jsem si hodil panel a přes metodu Paint vykreslím na něj obrázky.

Problémy mám dva. První a zásadnější, je to pomalé. Druhý, když si přidám scrollování, pomalu se to překresluje, což je vlastně problém 1.

Je vhodné vykreslovat větší počet obrázků přes Panel a třídu Graphics ? Jakým způsobem to optimalizovat ? Nebo mám do panelu naházet PictureBoxy ?

Na kódu není nic zvláštního, projedu pole a vykreslím obrázky

Graphics g = panel.CreateGraphics();
            if (arr != null)
            {
                for (int x = 0; x < arr.GetLength(0); x++)
                {
                    for (int y = 0; y < arr.GetLength(1); y++)
                    {
                        if (arr[x, y] == 0)
                        {
                            g.DrawImage(Properties.Resources.tilePath, new Point(x * 32, y * 32));
                        }
                        else
                        {
                            g.DrawImage(Properties.Resources.tileWall, new Point(x * 32, y * 32));
                        }
                    }
                }
            }

Jak tedy postupovat ? Děkuju moc za všechny rady :) V grafice mám veliký mezery a chci tyto mezery zčásti opravit.

Odpovědět 19.4.2013 22:21
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Petr Nymsa
Michal Žůrek (misaz):

GDI je pomelá za každých okolností, 30*30 je na generátor map moc, dej to 10*10 nebo ještě míň 5*5. To to však sice neovlivní, ale vyhneš se scrolování. Místo toho použij XNU, ta je několikrát násobně rychlejší.

Nahoru Odpovědět 19.4.2013 22:26
Nesnáším {}, proto se jim vyhýbám.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Petr Nymsa:

XNU ? Myslel jsi XNA ? Dobře, zmenším to, ale stejně, viděl jsem editory map i s většími tiles a ungovalo jim to perfektně. Nebo tam měli použitý právě to XNA ?

Nahoru Odpovědět 19.4.2013 22:27
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Petr Nymsa
Michal Žůrek (misaz):

Na velikosti nezáleží, jen jsem ti to poradil aby ses vyhnul scrolování.

  1. pád: XNA
  2. pád (vidím): XNU

"GDI je pomalé za každých okolností"

Nahoru Odpovědět 19.4.2013 22:29
Nesnáším {}, proto se jim vyhýbám.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Petr Nymsa:

Jo s tou velikostí souhlasím. Díky :). Podle mě se tyto názvy nikdy neskloňují nebo jo ? Přijde mi to dost divné :D.

Nahoru Odpovědět 19.4.2013 22:31
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Petr Nymsa
Michal Žůrek (misaz):

To je asi jedno jestli se skloňují nebo ne. Já skloňuji.

To je název (nikoli zkratka: http://cs.wikipedia.org/…icrosoft_XNA ), takže si myslím, že by se to skloňovat mělo.

Nahoru Odpovědět 19.4.2013 22:33
Nesnáším {}, proto se jim vyhýbám.
Avatar
paanoik
Člen
Avatar
Odpovídá na Petr Nymsa
paanoik:

XNA je na grafiku rozhodně lepší, nicméně doporučuju zkusit si pohrát i v tom čistém C#, pomůže to přemýšlet o věcech jinak .. optimalizovat. Není to vždycky jen o tom vybrat nejjednodušší cestu, která zvládne bruteforcem práci rychleji (protože jednou stejně na ty hranice narazí), ale o tom popřemýšlet, co je na konceptu špatně a jak by se to dalo vylepšit.
Vzpomínám, že jsem viděl (tuším v pictureboxu) poskládaný tileset z celkem 5000x5000px, který podporoval zoomování i skrolování a bez nějakého pozorovatelného trhání (a to v době, kdy XNA neexistovalo). Sám jsem si tam kdysi dávno zobrazoval ručně generovaný ohňostroj, který pro každý snímek překresloval klidně několik set až tisíc particles. Hlavní problém je neresetovat scénu, ale vykreslovat pouze změny - tj. pokud mi např. particle padá k zemi, přemažu původní pozici barvou pozadí, a umístím na novou. Ve výsledku to nemusí být ani rychlé, ale jelikož se vlastně všechno vykresluje "pořád", není to poznat.

 
Nahoru Odpovědět 19.4.2013 23:11
Avatar
Odpovídá na Michal Žůrek (misaz)
Luboš Běhounek (Satik):

Skloňovat XNA mi přijde jako zrůdnost :D

Každopádně GDI není zase tak tragicky pomalé, v 1920x1080 by se dalo vytáhnout tak 50 fps z hodně primitivní scény na nějakém běžném PC.

Nahoru Odpovědět  +2 19.4.2013 23:44
:)
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 8 zpráv z 8.