2011-01-06 4 views
0

Я основываю свою игру на примере лунного ландшафта. Это цикл запуска, который я использую (очень похоже на то, что используется в lunarlander). Я получаю значительные проблемы с производительностью, связанные с моим рисунком, даже если я почти ничего не рисую.Простой вопрос о примере 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, сделано таким образом (пустой холст), какие преимущества этого, и есть ли более быстрый способ сделать это?

ответ

2

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

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

Я не думаю, что это происходит. Существует «холст» (переменная), созданный и установленный в null для стартеров. Это называется

c = mSurfaceHolder.lockCanvas(); 

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

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

+0

А, я довольно новичок в этом, если вы не могли сказать. С методом lockCanvas будет ли какое-либо преимущество в производительности для указания грязного прямоугольника? Кроме того, вам нужно указать размер холста в любом месте? – Smills

0

Возможно, вы не делаете свой рисунок в отдельной теме так же, как в примере Луны.

+0

Как вы конкретно рисуете отдельную тему? – Smills

+0

Создайте нить, которая будет иметь ссылку на держатель или поверхность. Начинает. В методе Run() добавьте свои рисунки. Не забудьте не начинать свою нить до отображения поверхности, иначе у вас будет пустой холст. Разумеется, просто запустите Thread, используя обратный вызов на держателе или в методе onSurfaceCreate. – Twister

Смежные вопросы