ゲームアプリケーションでFrames Per Secondを計算する方法を探していますが、問題はそれらのアプリケーションのソースコードを持っていないということです。正直言って、私はこれが可能であると本当に期待していませんが、尋ねる価値がありました。Androidゲームで1秒あたりのフレーム数を計算する
そして、私は、FPSを数えるためには、メインペインティングループの基本的な知識とコードが必要だと私は理解しています。
よろしく
ゲームアプリケーションでFrames Per Secondを計算する方法を探していますが、問題はそれらのアプリケーションのソースコードを持っていないということです。正直言って、私はこれが可能であると本当に期待していませんが、尋ねる価値がありました。Androidゲームで1秒あたりのフレーム数を計算する
そして、私は、FPSを数えるためには、メインペインティングループの基本的な知識とコードが必要だと私は理解しています。
よろしく
私はレンダリングを制御し、編集JREクラスとjarファイルをxbootうAndroidのゲーム開発とあまりにも精通してないんだけど、2Dで中(...それは少しハックだが、それは動作します) (例えば、Canvas
)をプロセスに挿入します。
メインペイントループがあるときにFPSをカウントするのはどうですか?
私はAndroidの機能に精通していませんが、どのOSのどのゲームでも同じように行われています。ゲームを作る最も簡単な方法は、2つのスレッドを作ることです。最初はロジックアクション(軌道の計算、時間の経過に伴うオブジェクトの位置の変化など)です。 2番目のスレッドは、現在のゲーム状態(最初のスレッドによって計算された)をとり、それを画面に描画します。ゲームループ上
//Class that contain current game state
class GameState {
private Point objectPosition;
public Point getObjectPosition() {
return objectPosition;
}
public void setObjectPosition(Point pos) {
this.objectPosition = pos;
}
}
//Runnable for thread that will calculate changes in game state
class GameLogics implements Runnable {
private GameState gameState; //State of the game
public GameLogics(GameState gameState) {
this.gameState = gameState;
}
public void run() {
//Main thread loop
while (true) { //Some exit check code should be here
synchronize (gameState) {
gameState.setObjectPosition(gameState.getObjectPosition()+1); //Move object by 1 unit
}
Thread.sleep(1000); //Wait 1 second until next movement
}
}
}
//Runnable for thread that will draw the game state on the screen
class GamePainter implements Runnable {
private Canvas canvas; //Some kind of canvas to draw object on
private GameState gameState; //State of the game
public GamePainter(Canvas canvas, GameState gameState) {
this.canvas = canvas;
this.gameState = gameState;
}
public void drawStateOnCanvas() {
//Some code that is rendering the gameState on canvas
canvas.drawLine(...);
canvas.drawOtherLine(...);
....
}
public void run() {
//Last time we updated our FPS
long lastFpsTime = 0;
//How many frames were in last FPS update
int frameCounter = 0;
//Main thread loop
//Main thread loop
while (true) { //Some exit check code should be here
synchronize (gameState) {
//Draw the state on the canvas
drawStateOnCanvas();
}
//Increment frame counter
frameCounter++;
int delay = (int)(System.getCurrentTimeMillis() - lastFpsTime);
//If last FPS was calculated more than 1 second ago
if (delay > 1000) {
//Calculate FPS
double FPS = (((double)frameCounter)/delay)*1000; //delay is in milliseconds, that's why *1000
frameCounter = 0; //Reset frame counter
lastFpsTime = System.getCurrentTimeMillis(); //Reset fps timer
log.debug("FPS: "+FPS);
}
}
}
}
はFPSカウンターとの両方のスレッドでコメントしたコードです。ゲームループのさまざまな実装と長所/短所について説明します。
そしてthis is a good tutorialはAndroidでgameloop + FPSカウンタを実装しています。
ゲームループの記事は素晴らしいですが、実際には時代遅れです。あるスレッドにupdate()とrender()を入れるのは悪いです。特に、スレッドの作成と管理が現代の言語ほど簡単です。 – bezmax
問題は、私はDONTにソースコードへのアクセス権があります。私はapkのアプリケーションをコンパイルしただけで、ソースコードへのアクセスは説明どおりに簡単です。 – ajoz
ああ。あなたのメッセージにその部分を気付かなかった。結局クリスマス後の月曜日:) – bezmax