Ich habe ein bisschen Performanceprobleme bei der folgenden Methode:
Dis Methode bewegt die Kamera in der 3D-Ansicht (Java3D) von einer Position zu einer anderen. Dazu benutze ich eine anonyme Konkretisierung von Behavior. Nach jedem angezeigten Frame (Bild auf der Ausgabefläche) wird die Methode processStimulus ausgeführt, bis der Zeitraum vorüber ist. Quat4f ist einfach eine Klasse, die vier Variablen speichert, um eine Rotation darzustellen, Vector3f hat 3 Variablen x/y/z. Bei jedem Durchlauf wird der Quotient aus abgelaufener und Gesamtzeit berechnet, und so ein neuer Vector3f bzw. Quat4f berechnet. Ich greife in der Schleife schon nicht mehr auf die Variablen von außen zu und erstelle keine neuen Objekte. Blöderweise ruckelt das ganze trotzdem ein bisschen (und mein PC ist nicht grad der schlechteste). Sieht jemand irgendwo etwas performancefressendes in der processStimulus-Methode?
Code:
/**
* Bewegt/Dreht die Kamera innerhalb eines Zeitraumes an den gegebenen Punkt.
*/
public static void moveSmooth (SimpleUniverse simpleU, final Transform3D target, final long time, BranchGroup append)
{
//*
final Object LOCK = new Object();
final TransformGroup tg = get (simpleU);
final Transform3D t3d = new Transform3D();
tg.getTransform(t3d);
final Vector3f trans1 = new Vector3f();
t3d.get(trans1); //Starttranslation
final Vector3f trans2 = new Vector3f();
target.get(trans2); //Zieltranslation
final Vector3f transNow = new Vector3f(trans1); //wird in der Schleife verwendet
final Vector3f trdiff = new Vector3f ();
trdiff.sub(trans2, trans1); //auf Differenz der Vectoren setzen
final Quat4f rot1 = new Quat4f();
t3d.get(rot1);
final Quat4f rot2 = new Quat4f();
target.get(rot2);
final Quat4f rotNow = new Quat4f(rot1);
final Quat4f rotdiff = new Quat4f ();
rotdiff.sub(rot2, rot1);
System.out.println ("rotdiff: " + rotdiff);
System.out.println ("rot1: " + rot1);
System.out.println ("rot2: " + rot2);
final long start = System.currentTimeMillis();
final long end = start + time;
final BranchGroup bg = new BranchGroup();
bg.setCapability(BranchGroup.ALLOW_DETACH);
Behavior b = new Behavior(){
WakeupOnElapsedFrames wuoef = new WakeupOnElapsedFrames (1);
float trans1x, trans1y, trans1z, trdiffx, trdiffy, trdiffz;
float rot1x, rot1y, rot1z, rot1w, rotdiffx, rotdiffy, rotdiffz, rotdiffw;
public void initialize()
{
trans1x = trans1.x; //Membervariablen initialisieren
trans1y = trans1.y;
trans1z = trans1.z;
trdiffx = trdiff.x;
trdiffy = trdiff.y;
trdiffz = trdiff.z;
rot1x = rot1.x;
rot1y = rot1.y;
rot1z = rot1.z;
rot1w = rot1.w;
rotdiffx = rotdiff.x;
rotdiffy = rotdiff.y;
rotdiffz = rotdiff.z;
rotdiffw = rotdiff.w;
wakeupOn (wuoef);
}
public void processStimulus (Enumeration criteria)
{
long now = System.currentTimeMillis();
if (now >= end){
bg.detach();
synchronized (LOCK){
LOCK.notifyAll();
}
return;
}
float percentage = (time)/(now-start); //neue Variablen berechnen
transNow.x = trans1x + trdiffx / percentage;
transNow.y = trans1y + trdiffy / percentage;
transNow.z = trans1z + trdiffz / percentage;
rotNow.x = rot1x + rotdiffx / percentage;
rotNow.y = rot1y + rotdiffy / percentage;
rotNow.z = rot1z + rotdiffz / percentage;
rotNow.w = rot1w + rotdiffw / percentage;
System.out.println ("rot: " + rotNow);
System.out.println ("trans: " + transNow);
t3d.set (rotNow, transNow, 1);
tg.setTransform(t3d);
wakeupOn (wuoef);
}
};
b.setSchedulingBounds(new BoundingSphere(new Point3d(), Double.MAX_VALUE));
bg.addChild(b);
append.addChild(bg);
synchronized (LOCK){
try {
LOCK.wait((long)(time*1.5)); //im Fehlerfall
}catch (Exception ex) {}
}// */
tg.setTransform(target); //falls das letzte nicht genau gepasst hat, hier nochmal setzen
}
Dis Methode bewegt die Kamera in der 3D-Ansicht (Java3D) von einer Position zu einer anderen. Dazu benutze ich eine anonyme Konkretisierung von Behavior. Nach jedem angezeigten Frame (Bild auf der Ausgabefläche) wird die Methode processStimulus ausgeführt, bis der Zeitraum vorüber ist. Quat4f ist einfach eine Klasse, die vier Variablen speichert, um eine Rotation darzustellen, Vector3f hat 3 Variablen x/y/z. Bei jedem Durchlauf wird der Quotient aus abgelaufener und Gesamtzeit berechnet, und so ein neuer Vector3f bzw. Quat4f berechnet. Ich greife in der Schleife schon nicht mehr auf die Variablen von außen zu und erstelle keine neuen Objekte. Blöderweise ruckelt das ganze trotzdem ein bisschen (und mein PC ist nicht grad der schlechteste). Sieht jemand irgendwo etwas performancefressendes in der processStimulus-Methode?