Простой вопрос о примере с лунарлендером - PullRequest
0 голосов
/ 06 января 2011

Я основываю свою игру на примере с лунландцами.Это цикл запуска, который я использую (очень похоже на то, что используется в lunarlander).У меня возникают значительные проблемы с производительностью, связанные с моим рисованием, даже если я рисую почти ничего.

Я заметил следующий метод.Почему холст создается и устанавливается равным нулю в каждом цикле?

    @Override
    public void run() 
    {
        while (mRun) 
        {
            Canvas c = null;
            try 
            {
                c = mSurfaceHolder.lockCanvas();//null
                synchronized (mSurfaceHolder) 
                {
                    updatePhysics();
                    doDraw(c);
                }
            } finally 
            {
                // do this in a finally so that if an exception is thrown
                // during the above, we don't leave the Surface in an
                // inconsistent state
                if (c != null) 
                {
                    mSurfaceHolder.unlockCanvasAndPost(c);
                }
            }
        }
    }

В большинстве случаев, когда я читал что-нибудь о холстах, это больше похоже на:

mField = new Bitmap(...dimensions...);
Canvas c = new Canvas(mField);

Мойвопрос в том, почему пример Google сделан таким образом (null canvas), в чем его преимущества, и есть ли более быстрый способ сделать это?

Ответы [ 2 ]

2 голосов
/ 06 января 2011

В вашем примере вы действительно делаете новый холст.Но когда вы говорите

Почему холст создается и устанавливается равным нулю каждый цикл?

Я не думаю, что так и происходит.Существует холст (переменная) 'a', для которого для начала установлено значение null.Тогда это называется

c = mSurfaceHolder.lockCanvas();

, который возвращает используемый холст.(см. http://developer.android.com/reference/android/view/SurfaceHolder.html#lockCanvas%28%29)

Не существует «нового холста», созданного, как вам кажется.Если что-то идет не так, как надо, c остается нулевым, и вы можете проверить это.Если он не нулевой, вы делаете разблокировку.

0 голосов
/ 06 января 2011

Может быть, вы не делаете свой рисунок в отдельном потоке, как это делается в примере с Лунным.

...