Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


C# DirectX : Rita cirklar på en PictureBox, uppdatera snabbt = slött? DirectX ka

Postades av 2006-02-05 00:14:49 - Ted Ekeroth, i forum managed directX, Tråden har 4 Kommentarer och lästs av 2875 personer

Hej! Denna posten blev lång men jag ville förklara allt så inget är oklart ifall någon orkar hjälpa mig. Eg säkert inte så svårt, men kommer inte riktigt loss... =)

Jag råkade halka in på grafisk programmering i C# nyligen och stötte på patrull. Låt mig förklara vad det är för ett program jag ska göra:

Jag ska i princip läsa in en bild (en karta) med lite vägar och sådant. På denna karta ska ett antal noder (bilar) placeras och sedan ska dessa bilar (i form av blåa cirklar) röra sig längs vägarna. Min uppgift är inte att programmera AI eller så. Jag har en XML-fil med positionerna för varje bil vid varje given tidpunkt. Alltså, en lista med "events" där det för varje event och bil finns information om aktuell position för den bilen, x och y-koordinater på bilden (kartan).

So far so good. Det ser väl bra ut, de rör sig smidigt. Jag har skrivit det första med GDI+ (tror jag iaf), vanlig C#-programmering med andra ord.

PROBLEMET är att jag har en slider där jag ställer in hastigheten på animationen. Fram till en viss gräns ökar bilarna/noderna/cirklarna sin uppdateringshastighet men efter en viss punkt verkar det inte spela någon roll. Efter lite undersökningar verkar det som om min tråd, som uppdaterarar min PictureBox blir upptagen med just denna uppdatering (av PictureBox:en) lite för länge vilket gör att det finns en övre gräns på hur snabbt bilarna rör sig.

Så då kom jag in på DirectX. Jag kan inte speciell tmycket om det ännu, läser lite och letar information men jag behöver hjälp.
** hur ändrar jag i min PictureBox så att den gör samma sak som nu, men i DirectX? **

Nedan visar jag hur koden ser ut i nuvarande lösningen.

Först är det min UpdaterThread (2 metoder). Run-metoden loop:ar genom alla mina events dvs går igenom alla händelser då noderna ska ändra position och PictureBox:en ska ritas om.
<code>
// Class UpdaterThread

public void run()
{
int sleep;
temp1 = "";
while (true)
{
while (currentEvent < GlobalVariables.eventTimeTable.Rows.Count)
{

update(); // kallar metoden nedan.

currentEvent++;
sleep = (int)Math.Round((double)(1000 / speed), 0);

Thread.Sleep(sleep);

}
hasEnded = true;
animationControl.showCurrentEventId(currentEvent-1);
Console.WriteLine(temp1);
theThread.Suspend();
}
} // end run

// Hämtar ny pos., uppdaterar Node:en som finns sparade i en Hashtable. Se nedan.
private void update()
{


long time = long.Parse(GlobalVariables.eventTimeTable.Rows[currentEvent]["TIME"].ToString());
DataRow[] rows = GlobalVariables.eventTable.Select("EVENT_TYPE='1' AND TIME='" + time.ToString() + "'");

for (int i = 0; i < rows.Length; i++)
{
int temp = Convert.ToInt32(rows[i]["NODE_ID"]);
Node node = (Node)GlobalVariables.nodeTable[temp]; // hämtar nod
float x = float.Parse(rows[i]["NEW_POSITION_X"].ToString().Replace(Char.Parse("."), ','));
float y = float.Parse(rows[i]["NEW_POSITION_Y"].ToString().Replace(Char.Parse("."), ','));

float positionX = x;//(x - GlobalVariables.bottomLeftMetricX);
float positionY = y;//(y - GlobalVariables.bottomLeftMetricY);

float nbrOfPixelsX = positionX * GlobalVariables.pixelsPerMeterX;
float nbrOfPixelsY = positionY * GlobalVariables.pixelsPerMeterY;
node.updatePosition(nbrOfPixelsX, nbrOfPixelsY); // uppdatera pos
}


GlobalVariables.myPictureBox1.update(); // kallar en metod för att uppdatera PictureBox:en.

}
</code>

Som man kan se här är det inget konstigt. Jag har mätt lite tider (DateTime.Now.MilliSeconds) och kommeit fram till att det är just
GlobalVariables.myPictureBox1.update();
som tar tiden.

Min PictureBox:

<code>
// class MyPictureBox
using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace STRAW_Visualizer
{
public partial class MyPictureBox : System.Windows.Forms.PictureBox
{
private Hashtable nodeTable;

public void setTable(Hashtable table)
{
this.nodeTable = table;
}
protected override void OnPaint(PaintEventArgs e)
{
Graphics dc = e.Graphics;
base.OnPaint(e);

if (nodeTable != null)
{
IDictionaryEnumerator en = nodeTable.GetEnumerator();
//Console.WriteLine("a. " + System.DateTime.Now.Second + "." + System.DateTime.Now.Millisecond);
while (en.MoveNext())
{

Node temp = (Node)en.Value;
temp.Draw(dc); // Säger åt en Nod att rita om sig

}
//Console.WriteLine("b. " + System.DateTime.Now.Second + "." + System.DateTime.Now.Millisecond);
//Invalidate();
}

}
}
}
</code>

och sist min Node-class:

<code>
// Class Node
...

public void Draw(Graphics dc)
{
dc.DrawEllipse(pen, currentX - 8, currentY - 8, 16, 16);
Font drawFont = new Font("Arial", 9);
SolidBrush drawBrush = new SolidBrush(Color.Black);
dc.DrawString(nodeId.ToString(), drawFont, drawBrush, new PointF(currentX - 6, currentY - 6));
}
</code>


Jag behöver göra om min MyPictureBox till en DirectX-grej... men Draw-metoden finns inte kvar? Hur säger jag åt en sådan DirectX-picturebox att rita om sig?

Tack!


Svara

Sv: C# DirectX : Rita cirklar på en PictureBox, uppdatera snabbt = slött? Direct

Postades av 2006-02-05 23:40:39 - Oskar Johansson

Jag har ett förslag: Testa att köra med dubbelbuffring, på så sätt tror jag inte att gdi kommer behöva anropas i lika stor utsträckning. Dubbelbuffring är en välkänd teknik, kolla lite på nätet så hittar du kodexempel och förklaringar.


Svara

Sv:C# DirectX : Rita cirklar på en PictureBox, uppdatera snabbt = slött? Direct

Postades av 2006-02-21 00:15:36 - Ted Ekeroth

Hej!

Jo, dubbel buffring har jag redan dessvärre =(


Svara

Sv: C# DirectX : Rita cirklar på en PictureBox, uppdatera snabbt = slött? Direct

Postades av 2006-02-28 17:02:37 - Johan Lindfors

Hmm, efter en snabb analys av koden så får jag en känsla av att du uppdaterar din picturebox onödigt ofta.

Uppdatera alla positioner på bilarna, och sedan ritar du ut allihopa samtidigt, eller är det så du redan gör?

Mvh

Johan Lindfors


Svara

Sv:C# DirectX : Rita cirklar på en PictureBox, uppdatera snabbt = slött? Direct

Postades av 2006-03-13 19:51:21 - Ted Ekeroth

Hej!

Jo, jag går igenom listan av alla bilar/noder och sedan gör jag en Invalidate eller vad det nu var.
Så det ritas bara om 1 gång...


Svara

Nyligen

  • 17:07 Snabb och trevlig webbplats utan l
  • 17:00 Bra spelsajt med bonusar
  • 15:51 Slappna av
  • 15:17 Onlineunderhållning på fritiden
  • 11:13 Online Kasino
  • 17:57 Vart är SEO på väg till 2030?
  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 662
27 955
271 720
6 000
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies