【问题标题】:Synchronized Android surface view同步的 Android 表面视图
【发布时间】:2012-05-23 18:04:48
【问题描述】:

我对 java 和 android 有点陌生。 现在我使用画布在表面视图上绘制,因为速度比客户视图快。 但是当谈到在android中同步表面视图时,我有点困惑

我将此链接作为参考 http://android-er.blogspot.com/2010/05/android-surfaceview.html 还有安卓月球着陆器

当我编写surfaceview渲染线程运行方法部分时,我有两个版本稍微修改了表单示例,但我不确定哪个版本在概念上更正确。他们都工作, 但我只是想弄清楚我的概念。

感谢您的任何帮助和建议,如果我以错误的方式提出问题,也请纠正我:)

版本1:

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);
                             }
                 }
    }
}  

编辑

在额外同步的表面视图中我还想加一个锁来控制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;
}

这仍然不是一个好主意吗?

我的想法是想在流程函数和 OnDraw 方法之间加锁:

【问题讨论】:

    标签: java android android-canvas surfaceview synchronized


    【解决方案1】:

    这是一个非常主观的问题,但我会选择 1。

    第一种方法有更紧密的synchronized(RenderThreadSurfaceHolder);更少的代码需要同步,这有助于避免阻塞问题。

    除此之外,它似乎主要是订购。在解决方案 1 中,尽快调用 if(RenderThreadSurfaceHolder.getSurface().isValid()) 也是有意义的,因为如果表面无效,那么无论如何都不会发生任何事情。这避免了不必要的 if/else 检查。

    是的,同步在布尔值上不起作用。原因是 BOOLEAN.TRUE 和 BOOLEAN.FALSE 是静态常量。

    这个想法是,当您同步一个引用变量时,任何其他尝试使用该变量的线程都必须等到当前运行的同步块结束。当您的布尔值引用 BOOLEAN.TRUE 或 BOOLEAN.FALSE 时,一旦您在第二个布尔值上同步,您就会开始看到问题。

    继续在RenderThreadSurfaceHolder 上同步,这就是我的做法和我看到的做法。

    为什么要在绘图和更新之间添加一个锁?也许如果我知道原因,我可以用另一种方法帮助你。此外,这只会增加开销,请记住,您希望游戏循环尽可能紧凑。

    【讨论】:

    • 嗨,我可以问更多相关问题吗~我编辑了我的问题,感谢您的帮助。
    • 非常感谢,抱歉这么晚才回复,我想我可以使用原子布尔值来同步它,我想在更新之间锁定的原因是因为我想画的东西是变化的通过主要活动和处理数据期间,我不希望表面视图访问数据,但我不确定我的概念是否正确:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多