我是java和android的新手。 现在我使用画布在曲面视图上绘制,因为速度比客户视图更快。 但是当谈到在android中同步表面视图时,我会有点混淆
我将此链接作为参考 http://android-er.blogspot.com/2010/05/android-surfaceview.html 还有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);
}
}
}
}
修改
在附加同步的表面视图中我还想添加一个锁来控制在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方法之间添加锁:
答案 0 :(得分:0)
这是一个非常主观的问题,但我会选择1.
第一种方法更紧密synchronized(RenderThreadSurfaceHolder)
;更少的代码需要同步,这有助于避免阻塞问题。
除此之外,它似乎主要是订购。在解决方案1中,尽快调用if(RenderThreadSurfaceHolder.getSurface().isValid())
也是有意义的,因为如果表面无效,那么无论如何都不会发生任何事情。这样可以避免不必要的if / else检查。
是的,同步不适用于布尔值。原因是BOOLEAN.TRUE和BOOLEAN.FALSE是静态常量。
这个想法是,当您同步引用变量时,尝试使用它的任何其他线程必须等到当前运行的synchronized块结束。当您的布尔引用BOOLEAN.TRUE或BOOLEAN.FALSE时,只要您在第二个布尔值上同步,您就会开始看到问题。
继续在RenderThreadSurfaceHolder
上同步,就是我这样做以及我是如何看待它的。
为什么要在绘图和更新之间添加锁定?也许如果我知道原因,我可以用另一种方法帮助你。此外,这只会增加开销,记住你想让你的游戏循环尽可能紧。