» »

[c#] enostavna Igrca -> poraba procesorja 95%

[c#] enostavna Igrca -> poraba procesorja 95%

Tutankhamun ::

No neki se igram, pa sm si naredu eno res lahko igrco.

Ena krogec mi leti po formi, ki mu spreminjam smer, za sabo pa pušča sledi (jih ne radira). Tko da zgleda kot da rišem neskončno krivuljo.

Imam narejen na Timer ki mi na usake priblizn 20 ms sproz da narisem novo sled na ekran. Mam pa še en timerček isto na 20 ms ga pa rabm za zavijanje :D.

Ok zdej na mojmu 2600+ šiba skor k raketa, na fotrovmu 1800 celeron pomoje, se pa vleče k traktor. Na obeh kompih pa zabije procesor na 95% 8-O.

Te krogce js rišem na bitmap, in ko pride, PaintEvent samo naflikam ta bitmap na zaslon.

Torej kaj mi je storiti? Pa res ne bi rd s kšnim OpenGL al pa DX delu, tako cheap grafiko.
AMD Phenom QUAD 9950 Black Edition, 8GB

Tutankhamun ::

. Tkole zgleda ta socialna igrca :D

Pa še to. Na mojmu šiba, če je oknčk mejhn, če dam čez ceeu zaslon, se pa lahk kr kuj zjokam, od hitrosti. :'(
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

  • zavaroval slike: Senitel ()

Senitel ::

Povej kaj več o tem kako dejansko renderiraš...

Vesoljc ::

pogugli za "fixed time step" in pa "time based movement".
Abnormal behavior of abnormal brain makes me normal...

Tutankhamun ::

V Paintu mam sam to:
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
                crta1.Draw(e.Graphics, ref bmp);
                crta2.Draw(e.Graphics, ref bmp);

                e.Graphics.DrawImage(bmp, 0, 0);
        }


Se pravi bmp je bitmap velikosti mojga ekrana. Funkcija crta1.Draw pa narise en krogec na bmp. Pol ko narise krogec se crta2 pa ta bitmap prlepm na ekran.

Funkcija Draw pa zgleda takole:
        public void Draw(Graphics g, ref Bitmap bmp)
        {
            SolidBrush brushBlue = new SolidBrush(CrtaColor);

            Graphics gb = Graphics.FromImage(bmp);
            int RADIUS = 6;
            gb.FillEllipse(brushBlue, X - RADIUS / 2, Y - RADIUS / 2, RADIUS, RADIUS);
        }


Pa se koda od timerckov
        // ta event od timercka premakne krogec naprej za eno doloceno dolzino
        private void ForwardTimer_Tick(object sender, EventArgs e)
        {
            crta1.Forward();
            crta2.Forward();

            Invalidate();
        }
        
        // ta event od timercka premakne krogec levo ali desno za dolocen fi
        private void Rotate_Tick(object sender, EventArgs e)
        {
            crta1.Rotate();
            crta2.Rotate();
        }


Timerček ForwardTimer sele klice da se use zrise na zaslon, takrat ko se krogec premakne.

Nism limu sm gor kode kako zavijam pa to, sej je sam 2 vrstice, pa kako preverjam pritisnjene tipke itd...


To je to, nic posebnega ;).

Vesolc, to bom pa se pogledu. Hvala zaenkrat.
AMD Phenom QUAD 9950 Black Edition, 8GB

Vesoljc ::

jah, za zacetek ne na vsakem "draw" klicu kreirat novega brusha. naredi dva nazacetku in potem njiju uporabljal.
Abnormal behavior of abnormal brain makes me normal...

Rapsey ::

Kreiranje brushov ni noben problem in je zelo majhen delček tega kar dela CPU v tej aplikaciji.
20ms pomeni 50fps, kar je preveč pomoje. To da je pa procesor zabit je pa čisto normalno. Saj petdesetkrat na sekundo ti kopiraš celoten bitmap na okno.
Zakomentiraj to:
e.Graphics.DrawImage(bmp, 0, 0);
Pa bi moral bit potem CPU veliko manj obremenjen. GDI+ za takšne špile ni preveč primeren v bistvu. OK je samo za takšne kjer točno veš kateri deli so se spremenili in samo tiste na novo narišeš.

jernejl ::

najbolje je, da si vzameš nekaj časa in si pogledaš kak OpenGL tutorial pa potem delaš igre na tak način. Tam tudi 3D ni noben problem, vse transformacije (rotacija, translacija,...) so že narejene.

Z risanjem bitmapov po zaslonu in pogostim osveževanjem celotne forme pri igrah ne boš prišel daleč.
Sploh pa tudi tisti timer po mojih izkušnjah ni preveč natančen (beri: v različnih okoljih deluje različno hitro)


Pa da se vrnemo iz OpenGL nazaj na tvoj problem:

ko kličeš Invalidate, osveži samo tisti del zaslona, ki se je vmes spremenil!

npr. Invalidate(reg1)

kjer je reg1 tipa Region

(torej napraviš npr. štiri točke (Point) - pravokotnik, znotraj katerega želiš osvežiti sliko, te točke lahko daš v konstruktor GraphicsPath: System.Drawing.Drawing2D.GraphicsPath, objekt tega tipa pa v konstruktor razreda Region).

Zgodovina sprememb…

  • spremenil: jernejl ()

Rapsey ::

Če dela v c# je boljše naredit v managed Direct3d. Saj je čisto preprosto.

Tutankhamun ::

Rapsey, ko si lih omenju managed 3D. Mau gledam po straneh, pa tm pise da je za windows visto to, pa da je za c++ pa managed code.

Kako zdej, kaj morem narest? Js mam XPje, pa Visual studio 2007.


Pa probu sm tist sam region, brez bitmap. Sam fora je v tem da js rišem krogce, pol mi pa zradira mau prejšnga...

Pa hvala za pomoč. :D
AMD Phenom QUAD 9950 Black Edition, 8GB

Rapsey ::

Downloadaj si directx sdk. Managed Direct3D je wrapper okoli običajnega c++ Direct3D-ja in ti omogoča da iz c# uporabljaš DirectX čisto brez težav.
http://www.flazx.com/ebook5896.php

Tutankhamun ::

Rapsey
Js sm zdej use naložu pa mam kuj probleme :D. Grem po uni knigci od začetka. Formo mi je ratal pobarvat v plavo. Ko pa morem narisat trikotnik pa neki ni uredu.

V knjigi piše tako
CustomVertex.TransformedColored[] verts = new CustomVertex.TransformedColored[3];
verts[0].SetPosition(new Vector4(this.Width / 2.0f, 50.0f, 0.5f, 1.0f));

Kot v prvo verts sploh ne poznajo SetPosition. Poznajo pa Property Position in ne funkcije.

Tko da sm js napisu
verts[0].Position = new Vector4(this.Width / 2.0f, 50.0f, 0.5f, 1.0f);

Ok sm reku sej mogoče bo pa delal, pa ne! Sej okn odpre ampak trikotnika pa ni nikjer :'(.

Kaj zdej?
AMD Phenom QUAD 9950 Black Edition, 8GB

Senitel ::

Si dal tri vertexe notri? So CCW (usmerjeni v nasprotno smer urinega kazalca)?

Tutankhamun ::

Tole mam
        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            device.Clear(ClearFlags.Target, System.Drawing.Color.CornflowerBlue, 1.0f, 0);
            device.Present();

            CustomVertex.TransformedColored[] verts = new CustomVertex.TransformedColored[3];
            verts[0].Position = new Vector4(this.Width / 2.0f, 50.0f, 0.5f, 1.0f);
            verts[0].Color = System.Drawing.Color.Aqua.ToArgb();
            verts[1].Position = new Vector4(this.Width - (this.Width / 5.0f), this.Height - (this.Height / 5.0f), 0.5f, 1.0f);
            verts[1].Color = System.Drawing.Color.Black.ToArgb();
            verts[2].Position = new Vector4(this.Width / 5.0f, this.Height - (this.Height / 5.0f), 0.5f, 1.0f);
            verts[2].Color = System.Drawing.Color.Purple.ToArgb();

            device.BeginScene();
            device.VertexFormat = CustomVertex.TransformedColored.Format;
            device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, verts);
            device.EndScene();
        }
AMD Phenom QUAD 9950 Black Edition, 8GB

Senitel ::

Tile vertexi so razporejeni CW, obrni vrstni red. Torej zamenjaj vertex 0 in 2.

Tutankhamun ::

Torej še vedno ne dela :'(, res dobr začetek. Še eno stran sm najdu pa je spet za narisat trikotnik z drugimi podatki pa tut ne dela.

Še mn pa vem, kaj sploh so une koordinate X, Y, Z. Kako jih doloct?

verts[2].Position = new Vector4(this.Width / 2.0f, 50.0f, 0.5f, 1.0f);

kaj pomen sploh tist 50? to je Y koordinata? Tm piše da paše trikotnik v okno, tuki je pa ena koordinata kr tko določena?

Drgač pa js še zmeri ne vidm trikotnička. Jao, še enga trikotnička mi ne rata narisat, kdaj bom js svojo kačico naredu :(.

Pa še tko eno uprašanje, kako se pa sploh krogc nariše?
AMD Phenom QUAD 9950 Black Edition, 8GB

Tutankhamun ::

Ok nevem če pomaga ampak bom useen prlepu še mojo kodo, mogoče pa men neki manka.

        static void Main()
        {
            using (Form1 frm = new Form1())
            {
                // Show our form and initialize our graphics engine
                frm.Show();
                frm.InitializeGraphics();
                Application.Run(frm);

            }
         }

-------------------------------------------------------------------------------------
        public void InitializeGraphics()
        {
            // Set our presentation parameters
            PresentParameters presentParams = new PresentParameters();

            presentParams.Windowed = true;
            presentParams.SwapEffect = SwapEffect.Discard;

            // Create our device
            device = new Device(0, DeviceType.Hardware, this,
               CreateFlags.SoftwareVertexProcessing, presentParams);
        }

        public Form1()
        {
            InitializeComponent();
        }

        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            device.Clear(ClearFlags.Target, System.Drawing.Color.CornflowerBlue, 1.0f, 0);
            device.Present();

            CustomVertex.TransformedColored[] verts = new CustomVertex.TransformedColored[3];
            verts[2].Position = new Vector4(this.Width / 2.0f, 50.0f, 0.5f, 1.0f);
            verts[2].Color = System.Drawing.Color.Aqua.ToArgb();
            verts[1].Position = new Vector4(this.Width - (this.Width / 5.0f), this.Height - (this.Height / 5.0f), 0.5f, 1.0f);
            verts[1].Color = System.Drawing.Color.Black.ToArgb();
            verts[0].Position = new Vector4(this.Width / 5.0f, this.Height - (this.Height / 5.0f), 0.5f, 1.0f);
            verts[0].Color = System.Drawing.Color.Purple.ToArgb();

            device.BeginScene();
            device.VertexFormat = CustomVertex.TransformedColored.Format;
            device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, verts);
            device.EndScene();

            this.Invalidate();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);

        }
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

Senitel ::

Aja... Doh... :D
Prestavi device.present() v metodi OnPaint za device.EndScene().

Tutankhamun ::

Sej sm vedu, da je bol če kr kodo prlepm. Ok zdej se bom pa lahk mau igrov naprej :D, pa ugotavlu kaj kej pomen:)

Senitel, hvala
AMD Phenom QUAD 9950 Black Edition, 8GB

elKaktus ::

zivjo sm bol nov v c# pa bi te prosu ce bi mi lahko poslal celoten source programa da si bom lazje predstavljal kako vsa zadeva poteka

hvala
l.p.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[c#] ukaz radirka

Oddelek: Programiranje
91035 (828) japol
»

Android zamenjava pogledov

Oddelek: Programiranje
6981 (802) c00L3r
»

[c#] picturebox, slika na sliko

Oddelek: Programiranje
151007 (817) japol
»

[C++] izris v [x,y]

Oddelek: Programiranje
131070 (772) DuleKrtola
»

[c#]4 v vrsto - padanje krogov

Oddelek: Programiranje
81903 (1735) VASkO

Več podobnih tem