Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

Diskuze: C# rychlost vykreslování

C# .NET .NET (C# a Visual Basic) C# rychlost vykreslování American English version English version

Aktivity (1)
Avatar
Michael Škrášek:13.10.2014 21:45

Ahoj, mám problém s rychlostí vykreslování. Dělám menší 2D hru, a mam tam že když už jsem někde byl tak se tam vykresli textur, ale když mam projetej větší kus mapy tak se to hrozně pomalu vykresluje. Zkoušel jsem googlil a narazil jsem na nějaký GDI, ale nepodařilo se mi zjistit jak použít ....

Díky předem za pomoc.

Odpovědět 13.10.2014 21:45
I choose a lazy person to do a hard job. Because a lazy person will find an easy way to do it ... Bill Gates
Avatar
Jenkings
Redaktor
Avatar
Odpovídá na Michael Škrášek
Jenkings:13.10.2014 22:08

Nevím jak dalece to máš optimalizované , ale základní rady jsou :

1/ nevykreslovat zbytečně to co je mimo canvas
2/ je možné vytvořit to pozadí jako statický obrázek, který bude o kousek přesahovat mimo scénu, a při posunu tedy jen posuneš tento obrázek, na který budeš vykreslovat jen nové změny, a ne všechno odznovu

Nahoru Odpovědět 13.10.2014 22:08
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
Odpovídá na Jenkings
Michael Škrášek:13.10.2014 22:12

1/ nic mimo nevykresluju
2/ četl jsem si http://www.itnetwork.cz/…-ve-2d-hrach a všechno co šlo už jsem použil

Nahoru Odpovědět 13.10.2014 22:12
I choose a lazy person to do a hard job. Because a lazy person will find an easy way to do it ... Bill Gates
Avatar
Jenkings
Redaktor
Avatar
Odpovídá na Michael Škrášek
Jenkings:13.10.2014 22:13

A není možnost že někde před vykreslením provádíš nějaké složité výpočty, které ti to brzdí ? jelikož podle screenshotu to nevypadá ,že by to mělo být až tak náročné,aby to zatrhávalo ;)

Nahoru Odpovědět 13.10.2014 22:13
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
Odpovídá na Jenkings
Michael Škrášek:13.10.2014 22:16
 private void control(int x, int y, int plus_x, int plus_y)
 {
     if (!(x < 0) & !(y < 0))
     {
         if (dohled[1, x + plus_x, y + plus_y] & position[x + plus_x, y + plus_y] != "zed")
         {
             dohled[1, x, y] = true;
         }
     }
 }
 private void control2(int x, int y, int plus_x1, int plus_y1, int plus_x2, int plus_y2)
 {
     if (!(x < 0) & !(y < 0))
     {
         if (!dohled[1, x, y])
         {
             if (dohled[1, x + plus_x1, y + plus_y1] & position[x +   plus_x1, y + plus_y1] != "zed" || dohled[1, x + plus_x2, y + plus_y2] &    position[x + plus_x2, y + plus_y2] != "zed")
             {
                 dohled[1, x, y] = true;
             }
         }
     }
 }
     }
 private void kontrola_dohledu()
 {
     dohled[1, player_x, player_y] = true;
     for (int i = 1; i <= 4; i++)
     {
         //nahoru
         control(player_x, player_y - i, 0, 1);
         //dolu
         control(player_x, player_y + i, 0, -1);
         //doprava
         control(player_x + i, player_y, -1, 0);
         //doleva
         control(player_x - i, player_y, 1, 0);
     }
     for (int i = 1; i <= 3; i++)
     {
         //nahore vlevo doleva
         control2(player_x - i, player_y - 1, 1, 0, 0, 1);
         //nahore vlevo nahoru
         control2(player_x - 1, player_y - i, 1, 0, 0, 1);
         //nahore vpravo doprava
         control2(player_x + i, player_y - 1, -1, 0, 0, 1);
         //nahore vpravo nahoru
         control2(player_x + 1, player_y - i, -1, 0, 0, 1);
         //dole vlevlo doleva
         control2(player_x - i, player_y + 1, 1, 0, 0, -1);
         //dole vlevo dolu
         control2(player_x - 1, player_y + i, 1, 0, 0, -1);
         //dole vpravo doprava
         control2(player_x + i, player_y + 1, -1, 0, 0, -1);
         //dole vpravo dolu
         control2(player_x + 1, player_y + i, -1, 0, 0, -1);
     }
     //nahore vlevo
     control2(player_x - 2, player_y - 2, 1, 0, 0, 1);
     //nahore vpravo
     control2(player_x + 2, player_y - 2, -1, 0, 0, 1);
     //dole vlevo
     control2(player_x - 2, player_y + 2, 1, 0, 0, -1);
     //dole vpravo
     control2(player_x + 2, player_y + 2, -1, 0, 0, -1);
 }

private void panel1_Paint(object sender, PaintEventArgs e)
 {
     Graphics gr = e.Graphics;

     for (int y = 0; y < 18; y++)
     {
         for (int x = 0; x < 18; x++)
         {
             if (dohled[1, x, y] || dohled[0, x, y])
             {
                 if (position[x, y] == "nic")
                 {
                     gr.FillRectangle(Brushes.Gray, x * 25, y * 25, 25, 25);
                 }
                 else if (position[x, y] == "zed")
                 {
                     gr.FillRectangle(Brushes.Orange, x * 25, y * 25, 25, 25);
                 }
                 else if (position[x, y] == "player")
                 {
                     gr.FillRectangle(Brushes.Blue, x * 25, y * 25, 25, 25);
                 }

                 if (dohled[0, x, y] & !dohled[1, x, y])                     gr.DrawImage(bit, x * 25, y * 25, 25, 25);
             }
         }
     }
 }

nic slozitejsiho tam nemam

Nahoru Odpovědět 13.10.2014 22:16
I choose a lazy person to do a hard job. Because a lazy person will find an easy way to do it ... Bill Gates
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Michael Škrášek
Jan Vargovský:13.10.2014 22:21

Chápu to dobře, že ta mapa je o velikosti XY, kde vidíš její část a tam kde je hráč tak se vykresluje extra povrch (jakoby viditelnost)? To tvoje mi přijde celkem zbytečně složité :D

 
Nahoru Odpovědět 13.10.2014 22:21
Avatar
Jenkings
Redaktor
Avatar
Odpovídá na Michael Škrášek
Jenkings:13.10.2014 22:22

No, už jsem C# nějakou dobu neviděl,ale podle zběžného pohledu tam nevidím nic, co by mělo nějak extra způsobovat lagy o_O

A když přihlídnu k tomu že skoro stejně jsem měl napsaný i vykreslovací engine pro isometrickou mapu i s texturami a korekcemi úhlů pohledu, tak se mi nezdá že by C# dělal takovéhle problémy...

Nahoru Odpovědět 13.10.2014 22:22
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
Odpovídá na Jenkings
Michael Škrášek:13.10.2014 22:24

ne lagy, ale že se to pomalu vykresluje

Nahoru Odpovědět 13.10.2014 22:24
I choose a lazy person to do a hard job. Because a lazy person will find an easy way to do it ... Bill Gates
Avatar
Michael Škrášek:13.10.2014 22:26

kde jsem byl a uz tam nevidim se vykresli mapa a extra povrch (jakoby viditelnost),kam vidim vykresli jen povrch a kam nevidim nevykresli se nic

Editováno 13.10.2014 22:28
Nahoru Odpovědět 13.10.2014 22:26
I choose a lazy person to do a hard job. Because a lazy person will find an easy way to do it ... Bill Gates
Avatar
Odpovídá na Jan Vargovský
Michael Škrášek:13.10.2014 22:29

zapomněl jsem odpověď

Nahoru Odpovědět 13.10.2014 22:29
I choose a lazy person to do a hard job. Because a lazy person will find an easy way to do it ... Bill Gates
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Michael Škrášek
Jan Vargovský:13.10.2014 22:32

Asi jsem to špatně zformuloval, ale hýbe se s hráčem i mapa? Nebo je to jen platforma? Jestli je mapa statická tak já řešil vykreslování tak, že jsem měl uloženou scénu a vykresloval na ní jen nové změny (prošel jsem celou scénu a jestli potřeboval daný prvek vykreslit, tak jsem ho vykreslil). Ale to bys tam trošku musel zapojit třídy a měl bys to i celkem hezky napsané.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 13.10.2014 22:32
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Michael Škrášek
Jan Vargovský:13.10.2014 22:32

double post

Editováno 13.10.2014 22:32
 
Nahoru Odpovědět 13.10.2014 22:32
Avatar
Odpovídá na Jan Vargovský
Michael Škrášek:13.10.2014 22:40

asi zkusim to vykreslování jen nové změny - to by mohlo fungovat

Nahoru Odpovědět 13.10.2014 22:40
I choose a lazy person to do a hard job. Because a lazy person will find an easy way to do it ... Bill Gates
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Michael Škrášek
Jan Vargovský:13.10.2014 22:47

Můžeš si klidně udělat frontu (Queue) a házet mu tam jednotlivé políčka, které se mají vykreslit. Ty je vždycky vezmeš, vykreslíš a vyhodíš. A házet je tam budeš tak, že když pohneš tou figurkou, tak prohlídneš okolí a naházíš tam ty nové (na které vidíš po novém kroku) a ty staré (na které už nevidíš). Pak zavoláš znovu vykreslení mapy a opakuješ to od mé druhé věty.

Možností máš dost, ale to vše záleží na kontextu hry.

Editováno 13.10.2014 22:48
 
Nahoru Odpovědět 13.10.2014 22:47
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 14 zpráv z 14.