C# Delta Du Temps De Mise En Œuvre
Heres un extrait de code de ma tentative de faire un de particules 2D sim
static long lastTime = 0;
static double GetDeltaTime()
{
long now = DateTime.Now.Millisecond;
double dT = (now - lastTime); ///1000
lastTime = now;
Console.WriteLine(dT);
return dT;
}
Il devrait être assez évident qu'il serait de retour le temps (en millisecondes) depuis la dernière fois que la méthode a été appelée. Seul problème, c'est qu'il imprime
393
1
0
0
0
0
0
0
0
0
0
...
Ok, donc peut-être que c'est juste parce que chaque passe est prendre moins d'une milliseconde. Donc je l'ai changé pour
static long lastTime = 0;
static double GetDeltaTime()
{
long now = DateTime.Now.Ticks; //Changed this to ticks
double dT = (now - lastTime); ///1000
lastTime = now;
Console.WriteLine(dT);
return dT;
}
mais qui imprime toujours
6.35476136625848E+17
20023
0
0
0
0
0
0
...
et si "particule simulateur" n'est pas un assez bon indicateur de la complexité de mon programme est, permettez-moi de dire, il faut beaucoup plus que de 0 à tiques pour compléter une passe!
Donc ce qui se passe ici?
------- Code De Référence ------
Heres l'ensemble de la classe juste pour la référence
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace _2D_Particle_Sim
{
static class Program
{
public static Particle2DSim pSim;
static Form1 form;
public static Thread update = new Thread(new ThreadStart(Update));
///<summary>
///The main entry point for the application.
///</summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
form = new Form1();
pSim = new Particle2DSim(form);
pSim.AddParticle(new Vector2(-80, -7), 5);
pSim.AddParticle(new Vector2(8, 7), 3);
Console.WriteLine("Opening Thread");
Program.update.Start();
Application.Run(form);
//System.Threading.Timer timer;
//timer = new System.Threading.Timer(new TimerCallback(Update), null, 0, 30);
}
static void Update()
{
GetDeltaTime();
while (true)
{
pSim.Update(GetDeltaTime());
}
}
static long lastTime = 0;
static double GetDeltaTime()
{
long now = DateTime.Now.Ticks;
double dT = (now - lastTime); ///1000
lastTime = now;
Console.WriteLine(dT);
return dT;
}
}
}
Aussi, si mon analogie de la complexité de mon code est encore nétait pas assez, voici la mise à jour methord de la Particle2DSim classe
public void Update(double deltaTime)
{
foreach (Particle2D particle in particles)
{
List<Particle2D> collidedWith = new List<Particle2D>();
Vector2 acceleration = new Vector2();
double influenceSum = 0;
//Calculate acceleration due to Gravity
#region Gravity
foreach (Particle2D particle2 in particles)
{
double dist2 = particle.position.Distance2(particle.position);
double influence = dist2 != 0 ? particle2.mass / dist2 : 0;
acceleration.Add(particle.position.LookAt(particle2.position) * influence);
influenceSum += influence;
if (dist2 < ((particle.radius + particle2.radius) * (particle.radius + particle2.radius)) && dist2 != 0)
{
collidedWith.Add(particle2);
}
}
acceleration.Divide(influenceSum);
#endregion
particle.Update(deltaTime);
//Handle Collisions
#region Collisions
if (collidedWith.Count > 0)
{
Console.WriteLine("Crash!");
double newMass = 0;
double newRadius = 0;
Vector2 newPosition = new Vector2();
Vector2 newVelocity = new Vector2();
newMass += particle.mass;
newRadius += Math.Sqrt(particle.radius);
newPosition += particle.position;
newVelocity += particle.velocity * particle.mass;
particles.Remove(particle);
foreach (Particle2D particle2 in collidedWith)
{
newMass += particle2.mass;
newRadius += Math.Sqrt(particle2.radius);
newPosition += particle2.position;
newVelocity += particle2.velocity * particle2.mass;
particles.Remove(particle2);
}
newPosition.Divide(collidedWith.Count + 1);
newVelocity.Divide(newMass);
AddParticle(newPosition, newVelocity, newMass, newRadius);
}
#endregion
}
}
- Avez-vous essayé de ne pas utiliser
while(true)
et de dormir un peu? Vous aurez envie de le faire de toute façon. - Sachez que
Millisecond
est de0
à999
. (Puisque vous utilisezlong
, vous pouvez vous attendre à être total millisecondes.)
Vous devez vous connecter pour publier un commentaire.
Le problème est que vous utilisez
DateTime
à essayer de mesurer le passage du temps.DateTime
est conçu pour représenter une date et une heure, mais pas pour la mesure du temps écoulé.Utiliser le
stopwatch
classe pour la mesure du temps:Pour plus de détails sur la différence, découvrez Eric Lippert blog ICI