Diskuze: C# rychlost vykreslování

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

Avatar
Michael Škrášek:

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
Proč to dělat složitě, když to jde jednoduše.
Avatar
Jenkings
Redaktor
Avatar
Odpovídá na Michael Škrášek
Jenkings:

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:

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
Proč to dělat složitě, když to jde jednoduše.
Avatar
Jenkings
Redaktor
Avatar
Odpovídá na Michael Škrášek
Jenkings:

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:
 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
Proč to dělat složitě, když to jde jednoduše.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Michael Škrášek
Jan Vargovský:

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:

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:

ne lagy, ale že se to pomalu vykresluje

Nahoru Odpovědět 13.10.2014 22:24
Proč to dělat složitě, když to jde jednoduše.
Avatar
Michael Škrášek:

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
Proč to dělat složitě, když to jde jednoduše.
Avatar
Nahoru Odpovědět 13.10.2014 22:29
Proč to dělat složitě, když to jde jednoduše.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Michael Škrášek
Jan Vargovský:

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ý:

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:

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

Nahoru Odpovědět 13.10.2014 22:40
Proč to dělat složitě, když to jde jednoduše.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Michael Škrášek
Jan Vargovský:

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.