2D игра на Android SurfaceView работает медленно на ощупь - PullRequest
2 голосов
/ 30 августа 2010

Я строю 2D-игру с Android SurfaceView. Когда я касаюсь экрана, анимация игры запускается медленно. Почему и как мне этого избежать?

События касания - это окурки, как и onTouchEvents(MotionEvents ev){ empty };. Вся логика игры и графический код прорисовки находятся в run() в классе extends Thread.

Ответы [ 3 ]

6 голосов
/ 30 августа 2010

Спящий поток пользовательского интерфейса в течение 16-20 мс будет препятствовать тому, чтобы код обработки сенсорного события вызывался слишком много раз в секунду.

Пример:

@Override
public boolean onTouchEvent(MotionEvent event) {

 //Event handling logic

    try {
        Thread.sleep(16);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return true;
}

События касания отправляются так быстро, как поток пользовательского интерфейса может их прочитать, спя поток, вы можете пропустить несколько отправлений событий. (Хотя это не заметно для вашей игровой логики или пользователя)

0 голосов
/ 30 августа 2010
@Override
public void run ( )
{
    while(irunning)
    {
        while(paused)
        {
            sleep(2);
            synchronized ( holder )
            {
                    canvas = holder.lockCanvas(null);
                    //updateEvents();
                    //updatePsgstate();
                    //updateRole();
                    sortImages();
                    drawBgland();
                    drawImages();
                    drawAdminicle();
                    holder.unlockCanvasAndPost(canvas);                         
            }

        }
        sleep(10);
    }

}



@Override
public boolean dispatchTouchEvent ( MotionEvent ev )
{
    try
    {
        Thread.sleep( 32 );
    }
    catch ( InterruptedException e )
    {           
        e.printStackTrace();
    }
    synchronized ( ev )
    {
        Log.i( "T" , "onTouch" );
    }
    return true;
}


@Override
public void surfaceCreated(SurfaceHolder holder) 
{               
    mThread.start();

// if (hasFocus ()) // { // вернуть; //} // еще // { // requestFocusFromTouch (); //}

}

это базовый метод, который я использовал. это мой код какие-либо проблемы по этому поводу?

0 голосов
/ 30 августа 2010

Вы смотрели учебники на http://www.droidnova.com? Они являются хорошими вступительными роликами и бегали очень быстро, когда я их делал. Если они работают медленно на вашем устройстве с сенсорным экраном, это, вероятно, не проблема разработчика

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...