.[ ČeskéHry.cz ].
C# Vykreslování na obrazovku

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 17. srpen 2009, 16:49:56    Předmět: C# Vykreslování na obrazovku Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
SUK



Založen: 14. 11. 2007
Příspěvky: 93
Bydliště: /dev/null

PříspěvekZaslal: 17. srpen 2009, 16:52:43    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky Yahoo Messenger MSN Messenger
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 17. srpen 2009, 17:46:37    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 17. srpen 2009, 18:44:27    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 18. srpen 2009, 08:18:20    Předmět: Odpovědět s citátem

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 Sad 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
Zobrazit informace o autorovi Odeslat soukromou zprávu
am!go



Založen: 19. 08. 2007
Příspěvky: 61
Bydliště: Praha

PříspěvekZaslal: 18. srpen 2009, 08:45:42    Předmět: Odpovědět s citátem

Já teda znám jenom C++ verzi DX SDK, ale jestli nepotřebuješ data z tý textury číst, tak rozhodně nastav do těch flags D3DLOCK_DISCARD.

Zadruhý se podívej, jestli tu texturu vytváříš jako dynamickou. Případně:
http://msdn.microsoft.com/en-us/library/bb147263%28VS.85%29.aspx#Using_Dynamic_Textures
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
frca



Založen: 28. 07. 2007
Příspěvky: 1561

PříspěvekZaslal: 18. srpen 2009, 09:03:44    Předmět: Odpovědět s citátem

Připomnělo mi to jiný thread: http://www.pouet.net/topic.php?which=2625
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 18. srpen 2009, 10:05:34    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 18. srpen 2009, 10:11:58    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 18. srpen 2009, 12:13:24    Předmět: Odpovědět s citátem

hmm memcpy v C# ? Surprised Nicméně díky za tipy.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 18. srpen 2009, 12:14:09    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 18. srpen 2009, 12:16:22    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 18. srpen 2009, 12:19:12    Předmět: Odpovědět s citátem

Matasx napsal:
hmm memcpy v C# ? Surprised Nicméně díky za tipy.


co treba CopyMemory volani?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna