【发布时间】:2013-03-04 05:15:15
【问题描述】:
我遇到了一种情况,即我必须在幻灯片中显示图像,而且切换图像的速度非常快。庞大的图像数量让我想将 JPEG 数据存储在内存中,并在我想显示它们时对其进行解码。为了简化垃圾收集器,我使用BitmapFactory.Options.inBitmap 来重用位图。
不幸的是,这会导致相当严重的撕裂,我尝试了不同的解决方案,例如同步、信号量、在 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) 在下一个 vsync 上绘制位图,但是,当这种情况发生时,我们可能已经在解码下一个位图,因此,我们已经开始修改位图像素。我的想法是否正确?
有人对从这里去哪里有任何提示吗?
【问题讨论】:
-
ImageView是必要条件吗?我建议SurfaceView或TextureView获得高抽取率。 -
我面临同样的撕裂,但情况不同。由于这个 ass stackoverflow 政策,我无法提问。请帮助我的人。这对我有很大的帮助。
标签: android bitmap bitmapfactory tearing