BF Summer sales
Pouze tento týden sleva až 80 % na HTML & CSS a JavaScript
80 % bodů zdarma na online výuku díky naší Letní akci!

Diskuze: Graphics.Draw OutOfMemoryException

Aktivity (4)
Avatar
Ondra Toman
Člen
Avatar
Ondra Toman:31. července 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. července 19:38
Avatar
JerryM
Člen
Avatar
JerryM:31. července 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. července 19:52
Avatar
Ondra Toman
Člen
Avatar
Odpovídá na JerryM
Ondra Toman:31. července 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. července 20:53
Avatar
Ondra Toman
Člen
Avatar
Odpovídá na Ondra Toman
Ondra Toman:31. července 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. července 21:03
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
JerryM
Člen
Avatar
JerryM:1. srpna 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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět
1. srpna 10:49
Avatar
JerryM
Člen
Avatar
JerryM:1. srpna 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. srpna 15:53
Avatar
Ondra Toman
Člen
Avatar
Odpovídá na JerryM
Ondra Toman:1. srpna 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. srpna 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.