gpt4 book ai didi

java - 同步Android表面 View

转载 作者:行者123 更新时间:2023-12-01 05:19:00 25 4
gpt4 key购买 nike

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

我以此链接为引用 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);
}
}
}
}

编辑

在额外同步的表面 View 中,我还想添加一个锁来控制在Activity和OnDraw方法之间共享数据的数据因为我认为同步大量数据和大量处理函数的开销太大所以我只想同步一个 boolean 值,但是我在互联网上所做的研究表明同步 boolean 值确实不是一个好主意//仍然让我很困惑比如

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

这还不是一个好主意吗?

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

最佳答案

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

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

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

是的,同步不适用于 boolean 值。原因是 BOOLEAN.TRUE 和 BOOLEAN.FALSE 是静态常量。

这个想法是,当您同步引用变量时,尝试使用该变量的任何其他线程都必须等待,直到当前运行的同步块(synchronized block)结束。由于您的 boolean 值引用 BOOLEAN.TRUE 或 BOOLEAN.FALSE,因此一旦同步第二个 boolean 值,您就会开始看到问题。

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

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

关于java - 同步Android表面 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10725453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com