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

Člen

Zobrazeno 26 zpráv z 26.
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Použij lepší programovací jazyk, třeba C++ nebo cokoli, co má s .NETem
co nejméně společného. Už i Microsoft dává od XNA ruce pryč.
Jak rika Whateverwdasd neco jineho nez .NET...
Pokud nechces nejaky nizkourovnovy jazyk, tak Java a LWJGL. Body si lehce
nahrajes pomoci nabindovaneho openGL pres VBO (vertex buffer object) nebo VAO
(vertex array object) do graficke pameti a budes mit co nejrychlejsi mozny
vysledek vykreslovani.
To ale neznamená, že si nemůžeš napsat třeba DLLko v C++ na tu
kritickou část nebo ano?
A umis pracovat s efekty? Hlsl? Ulehcis tim tak praci cpu. Pocitat to pote bude graficka karta. Tim si rapdine zvysis vykon. Pokud to tedy spravne pouzijes.
no to možná ne, ale spíš jde o to, že to mám rozdělené do více tříd, které tam využívám a potřebuju je optimalizovat všechny na co možná největší rychlost. Momentálně nejdůležitější je pro mě, abych nevykresloval to co nevidím a bohužel nevím jak na to nebo spíš jestli to jde nějak elegantně a hlavně lehce udělat.
Přejít z .NET na Javu? To by si opravdu hodně pomohl...
Kolik je těch bodů? Kreslíš je v 2D nebo 3D? Jak je kreslíš? JSi si jistý, že zdržuje vykreslování?
Satik: momentálně asi 200k (ale bude jich mnohem víc) a je to ve 3D. vykresluju to tak, že kolem toho bodu si z trojúhelníků poskládám krychli. Body si uložím normálně do VertexBufferu a vykresluju ty primitiva. Teoreticky potřebuju zrychlit celý ten kód, kde to prostě bude nějak možné, od načítání bodů, až po vykreslování
To bychom ale pote museli ten kod videt. Pochybuji, ze tu nekdo bude studovat cely kod, ale muzes sem poslat nektere dulezite tridy atd.
Tady nejde o jazyk, ale o to OpenGL, klidne muze pouzit OpenGL pro C#-> OpenTK. XNA moc rozmazluje programatory a v nekterych pripadech vykonava zbytecne nejake operace navic.
Jestli uz umi v xna a ma v tom rozdelany tento projekt, tak bych se uplne nehrnul do jeho prepsani. Ucit se uplne neco noveho, jeste kdyz je to diplomka. Radsi mu pomoz s tim co ma. Ale jinak s tvym nazorem souhlasim
tak hlavní myšlenka toho zobrazovani je asi tahle:
GraphicsDevice device;
VertexBuffer wallBuffer1;
ScannedData data;
private void BuildWallBuffer()
{
data =
ScannedData.LoadFromFile("D:\\Visual_Studio_2010\\Data\\Stena\\Scan-20120329-111841-162.scan");
//nactu zmerene body ze skeneru
wallBuffer1 = CreateBuffer(data, 0, 87381);
}
public VertexBuffer CreateBuffer(ScannedData data, int startPoint, int
stopPoint)
{
VertexBuffer wallBuffer;
List<VertexPositionColor> vertexListWall = new List<VertexPositionColor>();
foreach (VertexPositionColor vertex in WallTile(data, Color.Green,
startPoint, stopPoint)) //funkce vraci body krychle kolem každého bodu
{
vertexListWall.Add(vertex);
}
wallBuffer = new VertexBuffer(device,
VertexPositionColor.VertexDeclaration, vertexListWall.Count,
BufferUsage.WriteOnly);
wallBuffer.SetData<VertexPositionColor>(vertexListWall.ToArray())
return wallBuffer;
}
public void Draw(Camera camera, BasicEffect effect)
{
effect.VertexColorEnabled = true;
effect.World = Matrix.Identity;
effect.View = camera.View;
effect.Projection = camera.Projection;
foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
pass.Apply();
device.SetVertexBuffer(wallBuffer1);
device.DrawPrimitives(
PrimitiveType.TriangleList,
0,
wallBuffer1.VertexCount / 3);
}
}
Chtělo by to ten kód, takhle toho moc nevydedukujeme.
Momentálně je to teda asi 200k*12 trojuhelniku, coz je cca 2,4M trojuhelniku, coz neni az tak zavratne cislo.
příště používej na kód tlačítko na vkládání kódu !
(2. z prava - 2 listy)
Kolik mas effect passu? Jakou mas grafickou kartu? Kolik to jede fps? Vypada to, ze to procesor nebrzdi :/
Jinak pro optimalizace se zkus kouknout na OCTREE nebo BSP tree, tyhle techniky se vetsinou pouzivaji k optimalizaci vykreslovani.
Ano, chapes to dobre - kdyz nejakou cast nevydis, tak ji nevykreslis.
Implementace octree je jednodussi, bsp by zase asi mohlo byt lepsi, ale neni nic trivialniho ho dobre napsat, aby bylo co nejefektivnejsi.
co sem se díval, tak ještě je quadtree, což je rozdělování prostoru
jen na 4 díly a mělo by být jednodušší ještě než Octree ne? Jinak
probrouzdal jsem net a stále netuším, jak tam ty stromy implementovat nemáš nějaký dobrý a
srozumitelný turitoriál nebo něco, abych to pochopil i já, když jsem s tím
nikdy nedělal? Nevím jak to mám napasovat do toho svého kódu.
Quadtree je vhodne spis pro 2D prostor, octree je v podstate jen quadtree s jednim rozmerem navic.
Zakladni myslenka je ta, ze si scenu rozdelis treba binarnim pulenim na male
(jak male, to zalezi na tobe) casti a potom je kreslis jednu po druhy a resis
jestli je videt.
Jestli je videt si predpocitas dopredu, jaky algoritmus zvolis uz je celkem fuk,
ale vetsinou je to nejaky jednoduchy raytracing.
Zkusil jsem nakreslit priklad pro quadtree (octree je pak obdobny, jen pridas
jeste jeden rozmer):
cerny cary rozdelujou prostor
zluta je kamera
modra je neco, co chces vykreslit
cerna je nejakej jinej objekt, kterej ti brani ve vyhledu
zeleny cary jsou ktery castio prostoru vidis
cerveny ktery nevidis
Taky nezapomen resit, jestli je prostor ve vyhledu kamery (jestli neni za ni) a ma smysl ji vubec kreslit.
Zobrazeno 26 zpráv z 26.