Avatar
Cube
Člen
Avatar
Cube:

Zdravím. Prosel jsem si tady fórum a nenašel jsem nic co by mi pomohlo (možná sem jen slepý). Každopádně potřeboval bych poradit, mám v XNA zobrazování bodů, pořízené z 3D laserového skeneru. Je zde vytvořená free look kamera pro pohyb mezi body. Potřeboval bych nějaké rady, jak vytvořený program co nejvíce zrychlit (k měření používám klasicky stopwatch). První důležitý krok je nejspíš nevykreslovat to co nevidím, což nevím, jak udělat. Někde sem taky zjistil, že používání foreach místo for je lepší. Nějaké další nápady?

 
Odpovědět 9.4.2013 20:14
Avatar
Whateverwdasd:

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č. :P

Editováno 9.4.2013 21:53
 
Nahoru Odpovědět 9.4.2013 21:52
Avatar
Homo
Člen
Avatar
Odpovídá na Cube
Homo:

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. :-)

Nahoru Odpovědět 9.4.2013 21:57
1010011 1000101 1011000
Avatar
Odpovídá na Cube
Michael Olšavský:

Používáš VertexBuffer namísto normálních polí?

 
Nahoru Odpovědět 9.4.2013 22:00
Avatar
Cube
Člen
Avatar
Cube:

to mi moc nepomůže, protože to dělám jako diplomovou práci a použití C# mám v zadání... o_O
brisingr002: jj používám VertexBuffery

 
Nahoru Odpovědět 9.4.2013 22:02
Avatar
Odpovídá na Cube
Lukáš Hruda (Luckin):

To ale neznamená, že si nemůžeš napsat třeba DLLko v C++ na tu kritickou část nebo ano? :)

 
Nahoru Odpovědět 9.4.2013 22:08
Avatar
Odpovídá na Cube
Michael Olšavský:

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.

 
Nahoru Odpovědět 9.4.2013 22:15
Avatar
Cube
Člen
Avatar
Cube:

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.

 
Nahoru Odpovědět 9.4.2013 22:16
Avatar
Cube
Člen
Avatar
Cube:

brisingr002: bohužel neumím..

 
Nahoru Odpovědět 9.4.2013 22:17
Avatar
Odpovídá na Homo
Luboš Běhounek (Satik):

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í?

Nahoru Odpovědět 9.4.2013 22:22
:)
Avatar
Cube
Člen
Avatar
Cube:

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í

 
Nahoru Odpovědět 9.4.2013 22:26
Avatar
Odpovídá na Cube
Michael Olšavský:

To bychom ale pote museli ten kod videt. Pochybuji, ze tu nekdo bude studovat cely kod, ale muzes sem poslat nektere dulezite tridy atd.

Editováno 9.4.2013 22:28
 
Nahoru Odpovědět 9.4.2013 22:27
Avatar
Homo
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
Homo:

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.

Nahoru Odpovědět 9.4.2013 22:29
1010011 1000101 1011000
Avatar
Odpovídá na Homo
Michael Olšavský:

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

Editováno 9.4.2013 22:36
 
Nahoru Odpovědět 9.4.2013 22:35
Avatar
Cube
Člen
Avatar
Cube:

tak hlavní myšlenka toho zobrazovani je asi tahle:

GraphicsDevice device;
VertexBuffer wallBuffer1;
ScannedData data;

private void BuildWallBuffer()
{
data = ScannedData.Lo­adFromFile("D:\\Vi­sual_Studio_2010\\Da­ta\\Stena\\Scan-20120329-111841-162.scan"); //nactu zmerene body ze skeneru

wallBuffer1 = CreateBuffer(data, 0, 87381);
}
public VertexBuffer CreateBuffer(Scan­nedData data, int startPoint, int stopPoint)
{
VertexBuffer wallBuffer;

List<VertexPo­sitionColor> vertexListWall = new List<VertexPo­sitionColor>();

foreach (VertexPositi­onColor vertex in WallTile(data, Color.Green, startPoint, stopPoint)) //funkce vraci body krychle kolem každého bodu
{
vertexListWall­.Add(vertex);
}

wallBuffer = new VertexBuffer(de­vice, VertexPosition­Color.VertexDe­claration, vertexListWall­.Count, BufferUsage.Wri­teOnly);
wallBuffer.Set­Data<VertexPo­sitionColor>(ver­texListWall.To­Array())

return wallBuffer;
}

public void Draw(Camera camera, BasicEffect effect)
{
effect.Vertex­ColorEnabled = true;
effect.World = Matrix.Identity;
effect.View = camera.View;
effect.Projection = camera.Projection;

foreach (EffectPass pass in effect.Curren­tTechnique.Pas­ses)
{
pass.Apply();
device.SetVer­texBuffer(wallBuf­fer1);
device.DrawPri­mitives(
PrimitiveType­.TriangleList,
0,
wallBuffer1.Ver­texCount / 3);
}
}

 
Nahoru Odpovědět 9.4.2013 22:42
Avatar
Odpovídá na Cube
Luboš Běhounek (Satik):

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.

Nahoru Odpovědět 9.4.2013 22:43
:)
Avatar
Cube
Člen
Avatar
Cube:

do struktury ScannedDataPoin si nahraju data ze skeneru, kolem kazdeho bodu udelam body pro krychli a tu pak vykreslim

 
Nahoru Odpovědět 9.4.2013 22:44
Avatar
Honza Bittner
Redaktor
Avatar
Odpovídá na Cube
Honza Bittner:

příště používej na kód tlačítko na vkládání kódu ! ;)

(2. z prava - 2 listy)

Nahoru Odpovědět 9.4.2013 22:53
Ptejte se mě na cokoli na https://github.com/HoBi/ama a followujte mě na Twitteru https://twitter.com/tenhobi. :-)
Avatar
Cube
Člen
Avatar
Cube:

ups sorry... to sem nevěděl... :`

 
Nahoru Odpovědět  +1 9.4.2013 22:54
Avatar
Odpovídá na Cube
Luboš Běhounek (Satik):

Kolik mas effect passu? Jakou mas grafickou kartu? Kolik to jede fps? Vypada to, ze to procesor nebrzdi :/

Nahoru Odpovědět 9.4.2013 22:55
:)
Avatar
Cube
Člen
Avatar
Cube:

Satik: asi jsme se nepochopily... já jsem schopný vykreslit těch bodů i víc, ne že by to nešlo, jen musím prostě ten kód (jestli to vůbec jde) jakkoliv optimalizovat na co možná nejrychlejší běh..

 
Nahoru Odpovědět 9.4.2013 22:59
Avatar
Luboš Běhounek (Satik):

Jinak pro optimalizace se zkus kouknout na OCTREE nebo BSP tree, tyhle techniky se vetsinou pouzivaji k optimalizaci vykreslovani.

Nahoru Odpovědět 9.4.2013 23:00
:)
Avatar
Cube
Člen
Avatar
Cube:

Jestli to dobře chápu je to určeno právě k tomu, že když něco nevidím, nevykresluji to ne? Teď spíš vyvstává otázka jestli je lepší Octree nebo BSP tree? A hlavně které je složitější na implementaci?

 
Nahoru Odpovědět 9.4.2013 23:10
Avatar
Odpovídá na Cube
Luboš Běhounek (Satik):

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.

Nahoru Odpovědět 9.4.2013 23:17
:)
Avatar
Cube
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
Cube:

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.

 
Nahoru Odpovědět 10.4.2013 13:29
Avatar
Odpovídá na Cube
Luboš Běhounek (Satik):

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.

Nahoru Odpovědět 10.4.2013 14:22
:)
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 26 zpráv z 26.