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

Galloth lordgalloth na gmail.com
Pondělí Leden 19 20:27:44 CET 2015


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>
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>
> <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 by www.HW.czHw-list na list.hw.czhttp://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
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20150119/0880d729/attachment.html>


Další informace o konferenci Hw-list