私はAndroidで最初のゲームをほぼ終了しました。私は自分で理解できない問題があります。私は作成したゲームエンジンの描画メソッドを更新して呼び出す基本的なゲームループスレッドを使用します。私はFPSが非常に低いことに気が付いたので、レンダリング時間を測定したところ、描画に50msかかることがわかりました(私は約20FPSで目には不快です)。ゲームのレンダリングが非常に遅い
:異なる描画方法は、例えば、drawCops()のために、非常に単純ですpublic void Draw(Canvas canvas){
width = canvas.getWidth();
height = canvas.getHeight();
character_rect.set(character.x, (int)(height*80.0/100), character.x+bmp_character.getWidth(), (int)(height*80.0/100)+bmp_character.getHeight());
background_rect.set(0, 0, width, height);
canvas.drawBitmap(bmp_background, null, background_rect, _paint);
drawCops(canvas);
drawGangsters(canvas);
drawTrees(canvas);
drawButtons(canvas);
drawCharacter(canvas);
_paint.setTextSize(45);
_paint.setColor(Color.WHITE);
canvas.drawText("Score: "+score, (float)(width*3.0/100), (float)(height*3.0/100), _paint);
canvas.drawText("Money: "+money, (float)(width*3.0/100), (float)(height*6.0/100), _paint);
_paint.setColor(Color.RED);
canvas.drawRect((float)(width*3.0/100),(float)(height*8.0/100), (float)(width*3.0/100 + (current_hp*width*1.0/100)), (float)(height*10.0/100), _paint);
if(game_over){
gameover_rect = new Rect(0, 0, width, height);
canvas.drawBitmap(gameover_background, null, gameover_rect, _paint);
_paint.setColor(Color.WHITE);
_paint.setTextSize(60);
canvas.drawText("GAME OVER!", (int)(width*20.0/100), (int)(height*45.0/100), _paint);
canvas.drawText("Score: "+score, (int)(width*20.0/100), (int)(height*50.0/100), _paint);
canvas.drawText("Best score: "+character.bestScore, (int)(width*20.0/100), (int)(height*55.0/100), _paint);
canvas.drawText("Money earned: "+money+" $", (int)(width*20.0/100), (int)(height*60.0/100), _paint);
canvas.drawBitmap(replay_button_image, null, replay_button_rect, _paint);
}
}
: はしかし、私はそれはそう長くすべきではない、ほんの数ビットマップを描く... は、ここに私のdrawメソッドであります
public void drawCops(Canvas canvas) {
for(int i=0; i<cops.length; i++) {
if(cops[i].active) {
canvas.drawBitmap(cops[i].image, null, cops[i].box, _paint);
}
}
}
そして、ここでは基本的に私がネットで見つけ他人と同じである私のゲームループは、次のとおりです。下手な英語のための
@Override
public void run() {
long FPS = 40;
long ticksPS = (long) (1000.0/FPS);
long startTime;
long sleepTime;
while (_isOnRun) {
Canvas c = null;
startTime = System.currentTimeMillis();
engine.Update();
try {
c = _surfaceHolder.lockCanvas();
synchronized (_surfaceHolder) {
engine.Draw(c);
}
} finally {
if (c != null) {
_surfaceHolder.unlockCanvasAndPost(c);
}
}
sleepTime = ticksPS-(System.currentTimeMillis() - startTime);
Log.e("tag", "render time: " + (ticksPS-sleepTime));
try {
if (sleepTime > 0) {
sleep(sleepTime);
}
else{
sleep(4);
}
} catch (Exception e) {}
}
}
申し訳ありませんが、これが私の最初のラではありませんnguage。
http://idownvotedbecau.se/nomcve/ –
ありがとう、私は私の質問を編集し、私のコードのいくつかのサンプルを追加しました。重要な部分を選択してMCVEを持っているのはかなり複雑ですが、それが十分であることを願っています。 – Mmarie