Androidで2Dゲームを描画するためにSurfaceViewを使用するには、メインアクティビティでこれを使用しますonCreate()
。
setContentView(new GameView(this));
これはこのクラスへの参照です:
public class GameView extends SurfaceView implements SurfaceHolder.Callback
run()
さらに、私はその機能を持つスレッドを持っています:
public void run() {
Canvas c;
while (_run) {
c = null;
try {
c = _surfaceHolder.lockCanvas(null);
synchronized (_surfaceHolder) {
_panel.updatePhysics();
_panel.onDraw(c);
}
}
finally { // when exception is thrown above we may not leave the surface in an inconsistent state
if (c != null) {
_surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
updatePhysics()
私はいくつかの計算をします。もちろん、これらはこの単純な例よりも複雑ですが、同じように機能します。
public void updatePhysics() {
GraphicObject.Coordinates coord;
GraphicObject.Speed speed;
for (GraphicObject graphic : _allElements) {
coord = graphic.getCoordinates();
speed = graphic.getSpeed();
coord.setX(coord.getX() + speed.getX());
coord.setY(coord.getY() + speed.getY());
...
}
}
そして、onDraw()
では、すべてをキャンバスに描画します。
@Override
public void onDraw(Canvas canvas) {
canvas.drawBitmap(BITMAP, xPos, yPos, null);
...
}
これは正常に機能します-すべて。そして、私が自分のデバイスでそれをテストしたとき、それはかなり良さそうに見えました。しかし、私がそれを他の誰かに渡して、彼がテストゲームをしたとき、オブジェクトははるかに速く動いていました!なんでそうなの?スレッドはupdatePhysics()
できるだけ頻繁に呼び出すため、これは高速デバイスがこの関数をより頻繁に呼び出すことを意味しますか?
これを防ぎ、すべてのデバイスでゲームを同じように高速にするにはどうすればよいですか?このようなもの?
private long lastRun = System.currentTimeMillis();
public void updatePhysics() {
long millisPassed = System.currentTimeMillis()-lastRun;
...
float newCoord = (coord.getX() + speed.getX()) * millisPassed / 33;
coord.setX(newCoord);
...
}
ご協力いただきありがとうございます!