不幸的是,这会导致相当严重的撕裂现象。我尝试了不同的解决方案,如同步、信号量、在2-3个位图之间交替使用,但都无法解决问题。
我在GitHub上设置了一个示例项目,演示了这个问题:https://github.com/Berglund/android-tearing-example 我有一个线程,解码位图,在UI线程上设置它,并休眠5毫秒:
Runnable runnable = new Runnable() {
@Override
public void run() {
while(true) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 1;
if(bitmap != null) {
options.inBitmap = bitmap;
}
bitmap = BitmapFactory.decodeResource(getResources(), images.get(position), options);
runOnUiThread(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap);
}
});
try {
Thread.sleep(5);
} catch (InterruptedException e) {}
position++;
if(position >= images.size())
position = 0;
}
}
};
Thread t = new Thread(runnable);
t.start();
我的想法是ImageView.setImageBitmap(Bitmap)在下一个垂直同步时绘制位图,然而,当这发生时,我们可能已经解码了下一个位图,并且因此已经开始修改位图像素。我方向正确吗?
有人有任何提示从这里去哪里吗?
ImageView
是必需的吗?我建议使用SurfaceView
或TextureView
来实现高绘制速率。 - S.D.