none
Vykreslování zpomaluje moji aplikaci

    Dotaz

  • Zdravím,

    na mojí škole jsme dostali maturitní projekt (projekt trvající od září do března) a ten můj spočívá ve vytvoření open-source hry, která má sloužit jako ukázkový příklad, a skript, která budou popisovat pokročilé funkce C#. Jen předem upozorňuji, že se nejedná o hru v XNA nebo MonoGame a nepoužívám žádný cizí engine.

    Hra je žánru open world bojová adventura. Problém spočívá v tom, že terén světa je nepravidelný a musím proto pokaždé vykreslovat jiný typ terénu a vytvářet instance pro každé políčko (pro každý typ terénu mám třídu, která dědí z abstraktní třídy Terrain). Bohužel těchto instancí je opravdu velké množství a je třeba je všechny nechat vykreslit pomocí metody Paint ve Windows Form Application. Velký počet instancí v listu nijak aplikaci nevadí, ale když je začnu vykreslovat, tak se celá aplikace rapidně zpomalí (DoubleBuffering mám povolený). Na internetu jsem se dočetl, že je to způsobeno mizernými GDI+ v C#.

    Zde je abstraktní třída Terrain, ze které dědí všechny druhy terénu:

        abstract class Terrain
        {
            protected static readonly string GRAPHICS_FOLDER_NAME = "Graphics";
    
            protected abstract Image texture { get; }
            protected abstract Rectangle sourceRect { get; }
            public Rectangle TargetRect;
            public Point OriginWorldPosition;
    
            public abstract int SpeedHandicap { get; }
    
            public Terrain(Point originWorldPosition) 
            {
                this.TargetRect.Width = sourceRect.Width;
                this.TargetRect.Height = sourceRect.Height;
    
                this.OriginWorldPosition = originWorldPosition;
            }
    
            public bool IsPassableFor(Character character) 
            {
                if (character.Speed > SpeedHandicap)
                    return true;
                else
                    return false;
            }
    
            public void Draw(Graphics gr) 
            {
                gr.DrawImage(texture, TargetRect, sourceRect, GraphicsUnit.Pixel);
            }
        }

    Chyba je zcela určitě ve vykreslování prováděné v tolika instancích. Dokonce i když není formulář plně zaplnění (jen z poloviny), tak k problému dochází. Pokud není metoda Draw nikdy zavolána, tak ke zpomalení nedochází. Jakékoli jiné změny v instancích totiž provádím pomocí paralelního programování.

    Chci se tedy zeptat, zda někdo zná řešení nebo například funkci nebo engine na vykreslovaní. Hra je open world, takže by se hodilo i ignorování vykreslování políček mimo formulář. Moc by mi to pomohlo.

    Děkuji za jakoukoli odpověď;

    12. října 2013 9:05

Odpovědi

  • Bohužel, WinForms jsou pro hry zcela nevhodnou platformou a těžko se dá očekávat, že i přes ladění se dostaneš k zázrakům. :-(

    Robert Haken, Microsoft MVP ASP.NET/IIS, HAVIT, s.r.o., www.havit.cz, http://knowledge-base.havit.cz

    30. července 2014 15:34