У меня есть некоторые проблемы с моей частотой кадров, используя SurfaceView. Я делаю типичные вещи, которые я нашел в некоторых уроках (все они сказали то же самое), но я не могу достичь приличной частоты кадров на моей Samsung Galaxy S (старая, i9000).
Вот код, который у меня есть для потока цикла. FPS инициализируется в 30.
@Override
public void run() {
long ticksPS = 1000/FPS;
long startTime;
long sleepTime;
//fps checker
long contms=0;
long lasttimecheck = System.currentTimeMillis();
int fps=0;
while (running) {
long time = System.currentTimeMillis();
if(contms>1000) {
Log.v("FPS",String.valueOf(fps));
contms=time-lasttimecheck;
fps=1;
}
else {
fps++;
contms+=time-lasttimecheck;
}
lasttimecheck = time;
Canvas c = null;
startTime =time;
try {
c = view.getHolder().lockCanvas();
synchronized (view.getHolder()) {
view.onDraw(c);
}
} finally {
if (c != null) {
view.getHolder().unlockCanvasAndPost(c);
}
}
sleepTime = ticksPS-(System.currentTimeMillis() - startTime);
try {
if (sleepTime > 10)
sleep(sleepTime);
else {
Log.w("LOWFPS",String.valueOf(contms));
sleep(10);
}
} catch (Exception e) {}
}
}
В SurfaceView я инициализирую держатель с holder.setFormat (PixelFormat.RGBA_8888); но я не знаю, нужно ли мне что-то делать с растровыми изображениями, чтобы избежать бесполезной работы процессора (я сохраняю растровые изображения в локальных переменных, затем рисую их). Игра проста, она должна работать намного быстрее.
Частота кадров довольно случайная, иногда она работает смузи, иногда нет, но всегда ниже 30FPS.
Есть идеи ???
РЕДАКТИРОВАТЬ С ОБЪЯСНЯТЬ ОБЪЯСНЕНИЕ
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(bg, 0, 0, null); //1
stars.draw(canvas,dx,dy); //2
if(playing.on()) reactors.draw_reaccio(canvas,dx,dy); //3
gotes.draw(canvas,dx,dy); //4
reactors.draw(canvas,dx,dy); //5
sg.draw(canvas); //6
sr.draw(canvas); //7
eraser.draw(canvas); //8
playing.draw(canvas); //9
opcions.draw(canvas); //10
}
1) Рисование фона (480х800)
2) это класс, который содержит список базовых объектов (звезд) getHeight () с его координатами (x, y) и идентификатор связанного изображения (около 9 различных изображений звезд)
3) он рисует n * 2 окружностей, один с заливкой, а другой с обводкой на связанный объект (около 20 или около того)
4) Рисует основной объект игры, маленькие капли с анимацией. Есть 9 различных видов капель, и у каждого из них есть 5 связанных изображений анимации (я должен поместить 5 изображений в 1, может быть?)
5) так же, как капли, но без анимации
6-10) не имеет значения, просто нарисуйте изображение
Я полагаю, что медлительность вызвана: (2) из-за количества звездочек (4) из-за анимации, каждые 2-3 кадра меняются на другое изображение, и, возможно, это слишком много для памяти, я думаю я должен объединить все изображения всего за 1.
Частота кадров составляет около 20-22 кадров в секунду с S. Galaxy S i9000