나는 안드로이드에서 거의 첫 게임을 끝냈습니다. 나는 혼자서는 이해할 수없는 문제가있다. 내가 만든 게임 엔진의 그리기 메서드를 업데이트하고 호출하는 기본 게임 루프 스레드를 사용합니다. 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);
}
}
: 그러나, 나는 그것이 너무 오래하지 않아야 만 몇 비트 맵을 그릴 ... 여기 내 그리기 방법
가난한 영어@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) {}
}
}
죄송이 처음 라되지 않습니다 :
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);
}
}
}
그리고 여기에 기본적으로 내가 인터넷에서 발견 다른 사람과 같은 내 게임 루프입니다 nguage.
http://idownvotedbecau.se/nomcve/ –
고맙습니다. 제 질문을 편집하고 코드 샘플을 추가했습니다. 중요한 부분을 선택하고 MCVE가있는 것은 꽤 복잡하지만 충분히 좋기를 바랍니다. – Mmarie