Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Ondra Toman
Člen
Avatar
Ondra Toman:31.7.2020 19:38

Experimentuji s vykreslováním 2D grafiky do konzole a narazil jsem na zvláštní chování funkcí DrawXX() a FillXX(). Když použiji Draw, tak se neustále zvyšuje využití ram, až dokud program nespadne. Pokud použiji Fill tak je využití ram konstantní.

Zkusil jsem:

class Program
    {
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr GetDC(IntPtr hWnd);

        const int width = 1280;
        const int height = 720;

        static void Main(string[] args)
        {
            Process process = Process.GetCurrentProcess();
            IntPtr hdc = GetDC(process.MainWindowHandle);
            Graphics graphics = Graphics.FromHdc(hdc);
            BufferedGraphicsContext context = BufferedGraphicsManager.Current;
            context.MaximumBuffer = new Size(width, height);
            BufferedGraphics Plaine = context.Allocate(graphics, new Rectangle(0, 0, width, height));

            Stopwatch frameTimer = new Stopwatch();
            Console.CursorVisible = false;
            Console.SetBufferSize(width / 8, height / 16);
            Console.SetWindowSize(width / 8, height / 16);

            Thread.Sleep(100);

            while(true)
            {
                Plaine.Graphics.Clear(Color.White);
                //Plaine.Graphics.DrawLine(new Pen(Color.Black), 0, 0, 100, 200);  //OutOfMemoryException
                Plaine.Graphics.FillRectangle(Brushes.Black, 10, 10, 50, 50);     //v pořádku
                Plaine.Render();

                //Thread.Sleep(1);
            }

            Console.ReadKey();
        }
    }

Chci docílit: Pokud použiji DrawImage(), tak využití ram stoupá pochopitelně mnohem rychleji. Je zvláštní, že po zavolání funkce Clear se přebytečná data nesmažou. Zajímá mě, proč se to děje a jak tomu zabránit?

 
Odpovědět
31.7.2020 19:38
Avatar
JerryM
Člen
Avatar
JerryM:31.7.2020 19:52

Kreslit v .NET pomocí GDI+ přímo je docela hloupý nápad. A navíc kde máš ReleaseDC a ostatní příkazy BeginDrawing EndDrawing ?

https://docs.microsoft.com/…tdc-function

Chce to něco dostudovat ...

Znáš SharpDX ? nebo Unity ??? starý DirectX2D ???

https://nugetmusthaves.com/Tag/Direct2D
https://github.com/…hev/d2dsharp
https://archive.codeplex.com/?…

 
Nahoru Odpovědět
31.7.2020 19:52
Avatar
Ondra Toman
Člen
Avatar
Odpovídá na JerryM
Ondra Toman:31.7.2020 20:53

Já vim že by bylo mnohem lepší použít WPF nebo nějaký přímo grafický engine, ale tohle je jen takový experiment, proto tam taky chybí ReleaseDC. A příkazy BeginDrawing a EndDrawing nevím jak mám zavolat. Co jsem googlil mě odkázalo jen na c++.

 
Nahoru Odpovědět
31.7.2020 20:53
Avatar
Ondra Toman
Člen
Avatar
Odpovídá na Ondra Toman
Ondra Toman:31.7.2020 21:03

Zatím jsem přišel na způsob který funguje. Jednou za čas prostě zavolat garbageCollector. Ale popravně o GC toho moc nevím, takže nevím jestli je to dobrý nápad.

 
Nahoru Odpovědět
31.7.2020 21:03
Avatar
JerryM
Člen
Avatar
JerryM:1.8.2020 10:49

přiznám se že se mi to nechce přepisovat ale tady máš knížku jak se to dělá:

https://ptgmedia.pearsoncmg.com/…olorfigs.pdf

a pak tady

https://docs.microsoft.com/…ns-lines-and-
rectangles-in-gdi

https://docs.microsoft.com/…managed-code

https://www.c-sharpcorner.com/…r-beginners/

https://www.codeproject.com/…ics-with-GDI

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
1.8.2020 10:49
Avatar
JerryM
Člen
Avatar
JerryM:1.8.2020 15:53

tady máš příklad
https://docs.microsoft.com/…eredgraphics?…
řek bych že ti tam chybí příkaz
context.Maximum­Buffer = new Size(this.Width+1, this.Height+1);

 
Nahoru Odpovědět
1.8.2020 15:53
Avatar
Ondra Toman
Člen
Avatar
Odpovídá na JerryM
Ondra Toman:1.8.2020 19:25

Maximum buffer tam je každopádně si projdu to co jsi mi poslal. Díky za pomoc.

 
Nahoru Odpovědět
1.8.2020 19:25
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 7 zpráv z 7.