Вот игровой цикл, перед тем как рисовать, блокируем канвас, рисуем и потом разблокируем и видим кадр. Как я понял принцип такой.
В потоке у меня в лог идет печать фпс, это еще ориентир на то, завершен поток или еще работает.
После того, как приложение сворачиваю, вызывается
onPause
D/MainThread: surfaceDestroyed
D/Menu: onSaveInstanceState
D/Menu: Stopping..
и между паузой и surfaceDestroyed успевает выполниться не мало игровых циклов в доп. потоке. Я не стал ждать, пока вызовется surfaceDestroyed
, а стал его метод вызывать в onPause
. И теперь, после того как ставлю на паузу, успевает прорисоваться еще один кадр, который возможно уже в процессе. Но когда я разворачиваю игру перед тем, как на экране что-то отобразится, успевает прорисоваться много кадров, конечно можно поставить паузу, но не в этом суть вопроса. Изображение может на экране так и не появиться и за 10 секунд, а циклов игровых уже за тысячу пройдет. Изображение появляется с выводом в лог строки I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@3220ef63 time:175116982
Activity_idle гугл перевел как активность простаивает. Так и есть: я иногда получаю сообщение о том, что столько то кадров (Skipped frames), главный поток чем то загружен, медленно работает. Заметил, что если ограничить игровой цикл 20 кадрами, то изображение быстрее выводится на экран.
.
public void run() {
Canvas canvas;
while(running){
canvas = null;
try{
this.time.onTickUpdate();
canvas= this.surfaceHolder.lockCanvas(null);
if (canvas == null)
continue;
synchronized(surfaceHolder){
this.gamePanel.update(); // формируем новый кадр
this.gamePanel.Draw(canvas); //Рисуем
}
}
finally {
// в случае ошибки, плоскость не перешла в
//требуемое состояние
if (canvas!=null){
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
Log.d(TAG,"Game loop executed "+ tickCount+" times");
}
Пробую писать на espresso with cucumberИ в одном из примеров наткнулся на такую строчку:
Как применить псевдокласс :hover к такому классу: headermain-header