android - SurfaceView 闪烁/撕裂

标签 android rendering flicker surfaceview tearing

我正在尝试弄清楚如何解决我的问题。我读过 http://groups.google.com/group/android-developers/browse_thread/thread/a2aac88a08cb56c2/b7dff4ba388cd664?lnk=gst&q=SurfaceView#b7dff4ba388cd664哪种回答了我的问题,但据我所知,这是一种“倒霉”的回答。所以这是我的问题:

我以正常方式使用 SurfaceView (lock/unlockAndPost) 在表面发生变化(例如方向等)时绘制我的游戏背景的位图,并且我正在渲染一系列移动的圆圈(最多 30 个半径约为 25.f)。这些圆圈位置的 x,y 数据来自服务器,并且一切正常。 所有圆形对象都存储在一个列表中,它们的位置会更新,注意确保此更新是同步的。 然而,当我将这些圆圈绘制到屏幕上时(在 canvas.lock() 期间),大多数时候它们渲染得很好但偶尔(例如每隔几秒一次)一些圆圈似乎会撕裂或短暂闪烁一帧。圈子的数量总是恒定的,所以这不是问题,并且没有对圈子列表的并发修改(正如我所说,它是同步的)。 我什至尝试在每个渲染循环中将所有这些圆圈绘制到位图,并将该位图绘制到主 Canvas 。这似乎对性能的影响更大(~13FPS 而不是直接在主 Canvas 上绘制圆圈时的~30FPS)。 对不起,如果信息有点模糊,伙计们,(试图让公司开心 :p )但我只是想知道是否有人可以给我一个线索?或者我只是运气不好。我应该注意,来自服务器的定位数据是实时数据,渲染反射(reflect)这些实时位置至关重要。

感谢您的帮助! 克里斯

编辑:

很公平。这是来自渲染线程的 run()。

@Override
    public void run() {
        Canvas c;
        while (mRun) {
            c = null;
            try {
                c = mSurfaceHolder.lockCanvas(null);
                synchronized (mSurfaceHolder) {
                    panel.onDraw(c);
                }
            } finally {
                if (c != null) {
                    mSurfaceHolder.unlockCanvasAndPost(c);
                }
            }
        }
    }

非常标准的东西(几乎是月球着陆器的副本:p)

@Override
public void surfaceCreated(SurfaceHolder holder) {
    mBackground= Bitmap.createBitmap(this.getWidth(), this.getHeight(), Bitmap.Config.RGB_565);
    screenOrientation = getResources().getConfiguration().orientation;
    if(thread.getState()== Thread.State.TERMINATED){
        thread = new RenderThread(holder, this);
        thread.setRunning(true);
        thread.start();
    }else {
        thread.setRunning(true);
        thread.start();
    }
}



@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    Canvas c = new Canvas(mField);
    c.drawARGB(255,0,144,0);
    backgroundDetails.renderOnPanel(c, this);
    screenOrientation = getResources().getConfiguration().orientation;
}

非常容易理解,如果方向改变并启动渲染线程,只需重新绘制背景位图即可。

public void onDraw(Canvas canvas) {
    canvas.drawBitmap(mField,0,0,null);
    drawPositionBeans(canvas, this);
}

最后:

    public void onDraw(Canvas canvas, RadarView radarView) {
    float beanX=0, beanY=0;
    float radius = 25.0f;
    final List<PositionBean> copyOfList = Collections.synchronizedList(positionBeans.getPositionBeans());
    synchronized(copyOfList){
        try {
            for (final PositionBean pb : copyOfList)
            {
                if (panel.getOrientation() == Configuration.ORIENTATION_PORTRAIT) {
                    beanX = (float)pb.getY()*(-1);
                    beanY = (float)pb.getX();
                } else {
                    beanX = (float)pb.getY()*(-1);
                    beanY = (float)pb.getX()*(-1);
                }
                mPaint.setARGB(255,pb.getRgbColor().getR(), pb.getRgbColor().getG(), pb.getRgbColor().getB());
                panel.drawSpot(canvas, beanX, beanY, radius, mPaint);

                mPaint.setStyle(Paint.Style.STROKE);
                mPaint.setARGB(255,255,222,1);
                for (int j = 0; j < selectedBean.size(); ++j)
                {
                    if(pb.getTrack()==selectedBean.get(j)) {
                        panel.drawSpot(canvas, beanX, beanY, radius+1, mPaint);
                    }
                }
                mPaint.setStyle(Paint.Style.FILL);
            }

        } catch(Exception e) {
            Log.e("render", "Exception Drawing Beans: " + e);
        }
    }
}

再次感谢大家。 克里斯

最佳答案

我有那个问题。适合我的解决方案是 onDraw 方法和更新变换矩阵的方法同步。因为当矩阵相同时存在帧(新矩阵()的初始值)并且在下一帧中它具有正确的值。

关于android - SurfaceView 闪烁/撕裂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3573004/

相关文章:

android - Google Play 服务 v23 Proguard 配置

c++ - SFML C++ 不渲染

java - PDF 中的图像为黑色

delphi - 如何在截图时排除自己的窗口而不闪烁?

安卓 : how to find the "known" WiFi networks?

android - 发出 REST 请求

安卓仪器 : How do I go back to a previously launched Activity?

pdf - 如何使用 knp-snappy-bundle 从 HTML 在 PDF 中设置页眉和页脚?

css - 过渡期间闪烁的固定背景

iphone - 异步图片加载闪烁?