Ja irgendwie gehst du das komisch an. Irgendwie hab ich den Eindruck du hast das mit den FPS noch nicht so ganz verstanden. Sorry falls ich mich täusche aber irgendwie scheint mir das so.
FPS heisst Frames per second und gibt an, wie oft pro Sekunde der Inhalt des Bildschirms neu gezeichnet wird. Das ist letztendlich nur dafür wichtig, dass Objekte die sich bewegen, für das menschliche Auge flüssig erscheinen und nicht ruckeln. Mit der Geschwindigkeit wie schnell sich das Objekt von Punkt A nach B bewegt, hat das gar nix zu tun.
Wie Thomas M gesagt hat, ist es für den Anfang am einfachsten, die FPSs FPSs sein zu lassen und sich nicht darum zu kümmern, dass man eine bestimmte Anzahl schafft oder nur eine bestimmte Anzahl hat.
Probier das mal. Ich hab es jetzt nicht getestet, sondern aus dem Kopf zusammen geschrieben. Du lässt die Loop so schnell laufen wie es geht und misst bei jedem Durchgang wie viel Zeit vergangen ist, seit dem du das letzte mal die Position des Rechtecks aktualisiert hast. Dann wird berechnet wie viele Pixel sich das Rechteck in dieser Zeit bewegt hat und diese Anzahl wird auf die x-Position drauf gezählt.
Dann wird das Rechteck gezeichnet und der Frame Zähler eins hochgezählt. Am Ende wir dann noch überprüft ob eine Sekunde vergangen ist, wenn ja, dann wird der Counter ausgelesen und an die FPS übergeben und alles wieder zurück gesetzt.
// Position des Rechtecks
private int xPos = 0;
private int yPos = 0;
// Geschwindigkeit mit dem sich das Rechteck bewegt in Pixel pro Sekunde
private float xSpeed = 200;
// Variablen zum Brechnen der vom Rechteck zurückgelegten Strecke.
private long lastUpdate;
private long deltaTime;
// Variablen zum Berechnen von FPS
private int counter = 0;
private int fps = 0;
long startTime;
public void run() {
startTime = System.currentTimeMillis();
lastUpdate = System.currentTimeMillis();
while (running) {
if (!holder.getSurface().isValid()){
Canvas canvas = holder.lockCanvas();
deltaTime = System.currentTimeMillis() - lastUpdate;
updateModel(deltaTime);
draw(canvas);
holder.unlockCanvasAndPost(canvas);
counter++;
if(System.currentTimeMillis() - startTime > 1000){
// eine Sekunde ist rum
fps = counter;
counter = 0;
startTime = System.currentTimeMillis();
}
}
}
}
private void updateModel(long deltaTime) {
xPos += (deltaTime/1000f) * xSpeed;
lastUpdate = System.currentTimeMillis();
}
private void draw(Canvas canvas) {
canvas.drawColor(Color.BLUE);
canvas.drawRect(xPos, yPos, xPos + 10, yPos + 10, paint);
canvas.drawText("FPS: " + fps, 50, 50, paint);
}
— geändert am 16.02.2012, 20:36:03
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.