[OT] jak na rychle vykreslovani bitmap, Win, C#

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Pondělí Leden 19 20:59:13 CET 2015


OK, diky, takze zkusim prozkoumat OpenGL.
To vykreslovani radku po skupinach je jasne, tohle bylo jen pro test 
rychlosti.
Ja to mel udelane v C++ kdysi davno pro jednu aplikaci, pomaleji ale 
docela to stihalo pres bitmapy a winapi jeste v WinNT4. V to C# mi 
docela chybi nejaka funkce typu Move misto Copy primo nad bufferem...


Dne 19. 1. 2015 v 20:27 Galloth napsal(a):
> OpenGL je otevřená alternativa k DirectX. Obojí umí jak 2D tak 3D. 
> Snazit se udelat 1000radku/s je spatne, protoze monitor Vám stejně 
> bude vykreslovat par desitek obrazků za sekundu. Grafické knihovny 
> (jak OpenGL  tak DirectX) Vám umožní přístup do framebufferu, takže 
> tam můžete řádky přidávat podle libosti a pak je naráz vykreslit. 
> Doporučoval bych například vykreslovat po vložení každého 20 řádku 
> (což bude dělat 50framů za sekundu) a tím se vyhnout posouvání bitmapy 
> pro každý řádek (prostě vždy poskočí o 20 řádků).
>
> Honza
>
> Dne 19. ledna 2015 19:55 Jaroslav Buchta <jaroslav.buchta na hascomp.cz 
> <mailto:jaroslav.buchta na hascomp.cz>> napsal(a):
>
>     No a to bych prave potreboval nakopnout, ktere knihony by se k
>     tomu daly pouzit - zas to neni uplne stezejni a nerad bych se ucil
>     neco na urovni programatora her.
>     Neco jsem nasel o DirectX, ale to je asi docela slozity moloch,
>     nevim jestli OpenGL, ale to je spis 3D? Radsi se nejdriv zeptam
>     nez budu vyslapavat slepe cesticky ;-)
>
>     Dne 19. 1. 2015 v 19:51 Pavel Hudeček napsal(a):
>>     Je potřeba použít hw akceleraci. Místo kopírování celé bitmapy o
>>     řádek dál prostě jen říct nějaké knihovní funkci, aby řekla
>>     grafice, že má celý obsah okna posunout o řádek a pak tam
>>     nakopírovat jen ten nový řádek.
>>
>>     PH
>>
>>     Od: Jaroslav Buchta <jaroslav.buchta na hascomp.cz>
>>     <mailto:jaroslav.buchta na hascomp.cz>
>>
>>         Jakym smerem se vydat? Potrebuju v podstate rychle posouvat
>>         radky v okne
>>         a pridavat nove radky, je to pro vizualizaci dat z radkove
>>         kamery.
>>         Tak 1000 radku/s po 512 px by bylo ideal. Uvedeny kod zvladne
>>         tak 40
>>         (512x500 pixelu) takze to chce vice nez radove zlepseni vykonu.
>>
>>         Zatim jsem udelal tento hruby pokus a tudy cesta asi nevede
>>         (da se to
>>         urcite jeste optimalizovat ale je to v principu same
>>         kopirovani velkeho
>>         pole)
>>
>>         Existuje nejaka lepsi metoda, jak rychle periodicky
>>         zobrazovat v okne
>>         aktualni obraz ktery je jako pole pixelu? Ale zas
>>         univerzalni, aby to
>>         nebylo vazane na nejakou konkretni graf. kartu, cpu atp.
>>
>>         private unsafe void backgroundWorker1_DoWork(object sender,
>>         DoWorkEventArgs e)
>>         {
>>
>>         while (!bwFin)
>>         {
>>
>>         BitmapData bmd = bmp.LockBits(new Rectangle(0, 0,
>>         bmp.Width, bmp.Height), ImageLockMode.WriteOnly,
>>         bmp.PixelFormat);
>>
>>         IntPtr ptr = bmd.Scan0;
>>
>>         int lnBytes = Math.Abs(bmd.Stride);
>>         int bytes = lnBytes * bmp.Height;
>>         if (rgbValues == null)
>>         {
>>         rgbValues = new byte[bytes];
>>
>>         }
>>         else
>>         {
>>         byte[] ba = rgbValues.Skip(lnBytes).ToArray();
>>         rgbValues = new byte[bytes];
>>         ba.CopyTo(rgbValues, 0);
>>         }
>>
>>         for (int y = bmp.Height-1; y < bmp.Height; y++)
>>         {
>>         byte[] ln = new byte[bmp.Width * 4];
>>         for (int x = 0; x < bmp.Width; x++)
>>         {
>>         byte l = byte((x + y + bmOfs) % 256);
>>         ln[x * 4 + 0] = l;
>>         ln[x * 4 + 1] = l;
>>         ln[x * 4 + 2] = l;
>>         ln[x * 4 + 3] = 255;
>>         }
>>         ln.CopyTo(rgbValues, lnBytes * (bmp.Height - 1));
>>         }
>>
>>         System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr,
>>         bmp.Height * lnBytes);
>>
>>         bmp.UnlockBits(bmd);
>>
>>         bmOfs++;
>>         if (bmOfs > bmp.Height) bmOfs = 0;
>>
>>         pictureBox1.Image = bmp.Clone() as Image;
>>         }
>>         pictureBox1.Image = null;
>>         }
>>
>>
>>
>>     _______________________________________________
>>     HW-list mailing list  -  sponsored bywww.HW.cz  <http://www.HW.cz>
>>     Hw-list na list.hw.cz  <mailto:Hw-list na list.hw.cz>
>>     http://list.hw.cz/mailman/listinfo/hw-list
>
>
>
>     ------------------------------------------------------------------------
>     <http://www.avast.com/> 	
>
>     This email has been checked for viruses by Avast antivirus software.
>     www.avast.com <http://www.avast.com/>
>
>
>
>     _______________________________________________
>     HW-list mailing list  -  sponsored by www.HW.cz <http://www.HW.cz>
>     Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>     http://list.hw.cz/mailman/listinfo/hw-list
>
>
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list



---
This email has been checked for viruses by Avast antivirus software.
http://www.avast.com
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20150119/89301fef/attachment.html>


Další informace o konferenci Hw-list