2012-05-23 8 views
1

Я как бы новый для java и android. Теперь я использую холст, чтобы рисовать на поверхности, потому что скорость выше, чем вид клиента. Но когда речь идет о синхронном представлении поверхности в андроида я получаю вид запутатьСинхронизированный вид поверхности Android

Я принимаю эту ссылку в качестве ссылки http://android-er.blogspot.com/2010/05/android-surfaceview.html также андроида лунного посадочного модуля

У меня есть две версии, которые немного измененную форму пример когда я пишу часть метода выполнения потока рендеринга surfaceview, но я не уверен, какой из них более правилен в концепции. Они оба работают, Но я просто хочу очистить свои концепции.

Спасибо за любую помощь и предложения в передовых и, если у меня есть задать вопрос неправильно, пожалуйста, также поправил меня :)

version1:

protected void run() 
{ 
    while (isRunning) 
{  
      if(RenderThreadSurfaceHolder.getSurface().isValid()) 
      { 
      Canvas Draw = null; 
      try 
      { 
       Draw =RenderThreadSurfaceHolder.lockCanvas(null); 
       synchronized (RenderThreadSurfaceHolder){  
        if(Draw!=null) 
        {                  
         RenderThreadSurfaceView.onDraw(Draw); 
        } 
       } 
      } 
      finally{      
       if(Draw!=null) 
       {              
         RenderThreadSurfaceHolder.unlockCanvasAndPost(Draw); 
       } 
      } 
     } 
    } 
} 

версия 2:

protected void run() 
{ 
    while (isRunning) 
{  
      Canvas Draw = null; 
       try 
       {  

        synchronized (RenderThreadSurfaceHolder) 
        {  
          if(RenderThreadSurfaceHolder.getSurface().isValid()) 
          { 

            Draw=RenderThreadSurfaceHolder.lockCanvas(null); 
            if(Draw!=null) 
            { 
             RenderThreadSurfaceView.onDraw(Draw); 
            } 

          } 
        } 
       } 
       finally 
       { 

          if (Draw != null) 
          { 
           RenderThreadSurfaceHolder.unlockCanvasAndPost(Draw); 
          } 
       } 
    } 
} 

Редакция

I n дополнительно синхронизировал представление поверхности. Я также хочу добавить блокировку для управления данными, которые обмениваются данными между Activity и методом OnDraw. Поскольку я думаю, что синхронизированное множество данных и много функций процесса слишком много накладных расходов Так что я хочу просто синхронизировать логическое, но что мне делать исследования в Интернете говорят, что Синхронное булево действительно не очень хорошая идея // еще спутанность мне много , такие как

synchronized (Check) 
{ 
    Check=true; 
} 

Но если я что-то вроде ниже

private static lock Lock; //declare in the Activity 

public synchronized void setlock(boolean newlock) 
{ 
    if (newlock!=lock){ 
    lock = newlock; 
    } 
} 

public synchronized boolean isTrue() { 
    return lock; 
} 

Является ли это st плохой не очень хорошая идея?

Моя концепция хотите добавить блокировку между функцией процесса и метода OnDraw:

ответ

0

Это очень субъективный вопрос, но я бы с 1.

Первый подход имеет более жесткий synchronized(RenderThreadSurfaceHolder); меньше кода требует синхронизации, и это может помочь избежать проблем с блокировкой.

Кроме этого, похоже, в основном заказ. В решении 1 также имеет смысл вызвать if(RenderThreadSurfaceHolder.getSurface().isValid()) как можно скорее, потому что, если поверхность недействительна, ничто не может произойти в любом случае. Это позволяет избежать ненужных проверок if/else.

Да, синхронизация не работает на логическом уровне. Причина в том, что BOOLEAN.TRUE и BOOLEAN.FALSE являются статическими константами.

Идея заключается в том, что при синхронизации ссылочной переменной любые другие потоки, которые пытаются использовать, должны ждать окончания текущего синхронизированного блока. Поскольку ваши логические ссылки ссылаются на BOOLEAN.TRUE или BOOLEAN.FALSE, как только вы синхронизируете второе логическое значение, вы начнете видеть проблемы.

продолжать синхронизировать с RenderThreadSurfaceHolder, вот как я это делаю и как я это видел.

Почему вы хотите добавить блокировку между чертежом и обновлением? Возможно, если бы я знал причину, я мог бы помочь вам с другим подходом. Кроме того, это просто добавит лишние накладные расходы, помните, что вы хотите, чтобы ваша игровая петля была максимально плотной.

+0

Привет Могу ли я спросить Более близкий вопрос ~ Я отредактировал свой вопрос и спасибо за вашу помощь. – user1316408

+0

отредактировал его о booleans – edthethird

+0

Большое спасибо и жаль, что я так поздно ответил Я думаю, что я могу использовать атомный булев, чтобы синхронизировать его, Причина, по которой я хочу блокировать обновление, - это те, которые я хочу сделать, это изменение по основной деятельности и во время данных процесса я не хочу, чтобы поверхность смотрела на данные, но я не уверен, что моя концепция правильная или нет :) – user1316408

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