Slevový týden - Srpen
30 % bodů zdarma na online výuku díky naší Slevové akci!
Pouze tento týden sleva až 80 % na e-learning týkající se Javy.

Diskusia: Graphics.Draw OutOfMemoryException

Aktivity (4)
Avatar
Ondra Toman
Člen
Avatar
Ondra Toman:31. júla 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í.

Skúsil som:

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();
        }
    }

Chcem docieliť: 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?

 
Odpovedať
31. júla 19:38
Avatar
JerryM
Člen
Avatar
JerryM:31. júla 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/?…

 
Hore Odpovedať
31. júla 19:52
Avatar
Ondra Toman
Člen
Avatar
Odpovedá na JerryM
Ondra Toman:31. júla 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++.

 
Hore Odpovedať
31. júla 20:53
Avatar
Ondra Toman
Člen
Avatar
Odpovedá na Ondra Toman
Ondra Toman:31. júla 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.

 
Hore Odpovedať
31. júla 21:03
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!
Avatar
JerryM
Člen
Avatar
JerryM:1. augusta 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é riešenie
+20 Skúseností
+1 bodov
Riešenie problému
 
Hore Odpovedať
1. augusta 10:49
Avatar
JerryM
Člen
Avatar
JerryM:1. augusta 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);

 
Hore Odpovedať
1. augusta 15:53
Avatar
Ondra Toman
Člen
Avatar
Odpovedá na JerryM
Ondra Toman:1. augusta 19:25

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

 
Hore Odpovedať
1. augusta 19:25
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 7 správy z 7.