Diskuze: C# rychlost vykreslování
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 14 zpráv z 14.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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
1/ nic mimo nevykresluju
2/ četl jsem si http://www.itnetwork.cz/…-ve-2d-hrach a všechno co šlo
už jsem použil
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
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
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é
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
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...
ne lagy, ale že se to pomalu vykresluje
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
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é.
asi zkusim to vykreslování jen nové změny - to by mohlo fungovat
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.
Zobrazeno 14 zpráv z 14.