2017-07-24 1 views
0

Ok, ich entwickle ein Sidescrolling-Spiel und mein Problem ist, wie man den Bildschirm richtig zeichnet und aktualisiert. Ich zeichne auf einer SurfaceView und ich benutze Path, um die Konturen, derzeit zeichnet der Algorithmus nur dies:Wie sidescroll einen Bildschirm in Android, Leinwand?

Und ich bin sidescrolling mit Path.offSet() und dann canvas.drawPath(), später aktualisieren ich die letzte X-Position auf dem Weg durch die Verwendung Path.addRect() (und das ist im Grunde, wie ich alles zeichnen: mit Path.addRect())

So, hier ist der Thread, der den Bildschirm aktualisiert:

@Override 
public void run() { 
    int x = LibraryLoader.getTerrainSizeX(); 
    int y = LibraryLoader.getTerrainSizeY(); 

    int count = 0; 

    Paint paint = new Paint(); 
    paint.setStyle(Paint.Style.FILL); 

    Path path = new Path(); 
    makePath(path, x, y, 0, LibraryLoader.getTerrainThickness()); 
    Path path2 = new Path(); 
    makePath(path2, x, y, LibraryLoader.getTerrainThickness(), y); 
while (run) { 
     Canvas c = null; 
     try { 
      c = surfaceHolder.lockCanvas(null); 
      synchronized (surfaceHolder) { 
       fps = fps(); 
       drawMyData(c, path, path2, paint, fps); 
       LibraryLoader.updateOffSet(); 
       updatePaths(path, path2, x, y); 
       if ((count++) == (x/2) - 1) { 
        LibraryLoader.updateOffSetArray(); 
        count = 0; 
       } 
      } 

     } finally { 
      if (c != null) {surfaceHolder.unlockCanvasAndPost(c);} 
     } 
    } 

und ihre jeweiligen Methoden:

public void updatePaths(Path path, Path path2, int x, int y) { 
    path.offset(-1f, 0); 
    path.addRect(x-3, topValue, x-2, bottomValue, Path.Direction.CW); 
    path2.offset(-1f, 0); 
    path2.addRect(x-3, topValue, x-2, y, Path.Direction.CW); 
} 

Also, in meinem Telefon funktioniert es perfekt bei 60fps, das Problem ist, dass ich in einem unteren Endgerät getestet und es beginnt bei 40fps dann fällt jedes Update, bis es unter 10fps ... (und fällt weiter). Ich denke, ich muss den Zustand des Pfades reinigen, oder ich sollte nicht einmal die Path-Klasse verwenden. Also meine Frage ist, wie sollte ich den Bildschirm mit der besten Leistung aktualisieren? Obs: Die Leinwand ist nicht hardwarebeschleunigt.

+0

Empfehlen, diese alten Google IO Videos zu beobachten: https://youtu.be/U4Bk5rmIpic und https://youtu.be/7-62tRHLcHk –

+0

Ja, danke Mann! (Ich nehme an, Sie sind in Eile; D) ... Ich bin mir bewusst, dass dies eine sehr grundlegende Frage ist ... Ich denke, ich werde meinen Snack vorbereiten, um diese zu sehen ... – Ariel

Antwort

0

Nun, Leute ich habe herausgefunden, dass ich falsch war mit allem, was ich getan habe. Die Antwort ist einfach: Wenn Ihre Android-Anwendung den gesamten Bildschirm für jeden Frame aktualisiert, verwenden Sie OpenGL. Canvas ist für App-Design für das, was ich gesehen habe, hoffe ich bin nicht falsch. Wenn Sie beispielsweise eine benutzerdefinierte Animation für ein LOGO oder eine Schaltfläche erstellen möchten, verwenden Sie Canvas. Wenn jemand in diesem Beitrag stolpert, schau dir die Videos an, die Morrison Chang erwähnt hat, sie sind sehr hilfreich, um dich auf die richtige Spur zu bringen. Prost.

Verwandte Themen