Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 17. srpen 2009, 16:49:56 Předmět: C# Vykreslování na obrazovku |
|
|
Zdravím komunitu.... mam zas dotázeček. Zajímalo mě to už dřív a reálně to potřebuju použít až nyní a nevím si rady. Potřeboval bych vykreslovat jednotlivé pixely na obrazovku (na form, na cokoliv) v C#. Potřeboval bych se při rozlišení 1920x1200 dostat aspoň na 30fps. Nyní to řeším tak, že lockuju texturu a tu pak renderuju na obdélníček - to je docela dobrý, ale kdybych chtěl v budoucnu vypustit z projektu DX tak sem nahranej. Přes bitmapu + GDI se mi to zdá pomalý. Poradí někdo? |
|
Návrat nahoru |
|
 |
SUK
Založen: 14. 11. 2007 Příspěvky: 93 Bydliště: /dev/null
|
Zaslal: 17. srpen 2009, 16:52:43 Předmět: |
|
|
Jen dodam, ze asi takhle nejak vypada nejrychlejsi kod, kterej jsem ja schopen vyplodit, na moji pseudomasine (Tur2.2GHz, 1GBRAM, Xpress200M) to dava na 1024^2 asi 8-16FPS (podle toho, po kolika bajtech prirazuju do pole): http://pastebin.com/d20e81e12 |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 17. srpen 2009, 17:46:37 Předmět: |
|
|
Způsob před D3D nebo GL je asi nejrychlejší. Pokud máš hotové kreslení přes DX, máš vyhráno, protože líp už to moc nejde. Jakékoliv jiné metody mohou být několikanásobně pomalejší. S tvými požadavky se potřebuješ dostat na propustnost 250MB/s. Na mém stroji s ATI, OpenGL a PCIe 16x se dokážu dostat na rychlost nahrávání textur 471 MB/s, což není mnoho, vezmeme-li v potaz, že rychlost PCIe 16x je 4 GB/s (tzn. bychom se měli dostat aspoň na 2GB/s).
Ztráty v přenosu budou asi kvůli speciálnímu zarovnání textury v paměti grafické karty (můj odhad). _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 17. srpen 2009, 18:44:27 Předmět: |
|
|
myslim ze jediny dalsi sposob je cez video overlay. to by mohlo byt trochu raychlejsie. ale pouzitiu DX/OGL overlay sa nevyhnes. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 18. srpen 2009, 08:18:20 Předmět: |
|
|
Stejně sem se s jedním jádrem dostal při 100% vytížení (a zapisoval sem jenom 0) při rozlišení 1920x1200 na nějakejch 12fps tam snad musim mít něco blbě. Nejdřív texturu Locknu, pak do ní cyklem zapíšu data, Unlock a render...
kód: |
ActiveSurfaceData = (uint*)ActiveSurface.LockRectangle(0, LockFlags.None).InternalData.ToPointer();
while(...)
{
*ActiveSurfaceData = (uint)color;
ActiveSurfaceData++;
}
ActiveSurface.UnlockRectangle(0);
Render...
|
|
|
Návrat nahoru |
|
 |
am!go

Založen: 19. 08. 2007 Příspěvky: 61 Bydliště: Praha
|
|
Návrat nahoru |
|
 |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 18. srpen 2009, 10:05:34 Předmět: |
|
|
CPU je hodně pomalé při vyplňování takového množství paměti. To je taky důvod, proč máme GPU. Smiř se s tím. memset/memcpy může být rychlejší. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 18. srpen 2009, 10:11:58 Předmět: |
|
|
Eosie napsal: |
CPU je hodně pomalé při vyplňování takového množství paměti. To je taky důvod, proč máme GPU. Smiř se s tím. memset/memcpy může být rychlejší. |
melo by byt, protoze muzes kopirovat po radcich - nikoliv pixelech |
|
Návrat nahoru |
|
 |
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 18. srpen 2009, 12:13:24 Předmět: |
|
|
hmm memcpy v C# ? Nicméně díky za tipy. |
|
Návrat nahoru |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 18. srpen 2009, 12:14:09 Předmět: |
|
|
Taky je to důvod proč se raytracing provádí po paketách, či scanlines (celý řádek, nebo i řádky najednou).
Pokud je to možné (a neplánuješ to rasterizovat), zkus také využít více threadů - a rozdělit si tím obrazovku.
Mě se každopádně nejvíce osvědčilo mimo paket/scanline - když jsem potřeboval pixel by pixel zápis - použít na zápis assembler (ale je třeba ho napsat čistě), při kterém lze dosáhnout i real time performance. _________________ Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration. |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 18. srpen 2009, 12:16:22 Předmět: |
|
|
Eosie napsal: |
CPU je hodně pomalé při vyplňování takového množství paměti. To je taky důvod, proč máme GPU. Smiř se s tím. memset/memcpy může být rychlejší. |
tak co som skusal tak for() vs memset() bol u mna 700MB/s vs 5.5GB/s co bolo takmer priepustnost pameti. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 18. srpen 2009, 12:19:12 Předmět: |
|
|
Matasx napsal: |
hmm memcpy v C# ? Nicméně díky za tipy. |
co treba CopyMemory volani? |
|
Návrat nahoru |
|
 |
|