Java 同步Android表面视图

Java 同步Android表面视图,java,android,android-canvas,surfaceview,synchronized,Java,Android,Android Canvas,Surfaceview,Synchronized,我对java和android有点陌生。 现在我使用画布在曲面视图上绘制,因为速度比客户视图快。 但当谈到android中的同步表面视图时,我有点困惑了 我把这个链接作为参考 还有安卓月球着陆器 在编写surfaceview渲染线程运行方法部分时,我有两个版本稍微修改了表单示例,但我不确定哪一个版本在概念上更正确。它们都能工作, 但我只是想澄清我的概念 感谢您提供的任何帮助和建议,如果我以错误的方式提出问题,请也纠正我:) 版本1: protected void run() { while (

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

我把这个链接作为参考 还有安卓月球着陆器

在编写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);
                             }
                 }
    }
}  
编辑

另外,在同步的surface视图中,我还想添加一个锁来控制在Activity和OnDraw方法之间共享数据的数据 因为我认为同步大量的数据和大量的进程功能是太多的开销 所以我想同步一个布尔值,但我在互联网上做的研究表明 同步布尔值真的不是一个好主意//仍然让我很困惑 比如

但是如果我做了下面的事情

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;
}
这仍然不是一个好主意吗


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

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

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

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

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

其思想是,当同步引用变量时,尝试使用该变量的任何其他线程都必须等待当前运行的同步块结束。由于您的布尔值引用boolean.TRUE或boolean.FALSE,因此在第二个布尔值上进行同步后,您将开始看到问题

继续在
渲染器ReadSurfaceHolder
上进行同步,这就是我和我所看到的同步方式


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

您好,我可以问更多相关的问题吗~我编辑了我的问题,感谢您的帮助。非常感谢,很抱歉我这么晚才回复,我想我可以使用原子布尔来同步它,我想在更新之间锁定的原因是bcz我想绘制的内容是按主要活动更改的,在流程数据期间,我不希望surface view访问数据,但我不确定我的概念是否正确:)
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;
}