gpt4 book ai didi

android - Android线程控制多个纹理 View 会导致奇怪的闪烁

转载 作者:行者123 更新时间:2023-12-03 13:11:33 33 4
gpt4 key购买 nike

我试图使用 Canvas 锁定/解锁使用单个线程从UI线程渲染三个单独的TextureView。观察到的问题是所绘制的每个纹理 View 的闪烁始终一致,而闪烁由不同的纹理 View 的帧组成。因此,例如,我按此顺序绘制框架A,B和C。帧C看起来不错,但是帧A和B偶尔会出现帧C闪烁,帧A会偶尔出现帧B闪烁。

我通读了描述Android Core Graphics的文档,并且对android的帧缓冲系统如何工作有很好的理解。简而言之,我的怀疑是我连续太快地执行lockCanvas/unlockCanvasAndPost调用,并且帧缓冲区无法完成我的请求,而只是绘制了先前的(不正确的)帧。

我已经尝试了几种方法来解决此问题。在继续调用 Canvas 之前尝试使用Choreographer等待VSYNC有所帮助,但是正如预期的那样降低了我的帧速率,但是问题仍然存在。我还尝试了一种不带 sleep 命令的渲染循环,在观察到的现象上没有差异。

从本质上讲,我对如何解决此问题一无所知,并希望能得到一些外界的建议。在此先感谢您,以下是代码片段:

主渲染循环:

 while (running) {

long now = System.nanoTime();
long updateLength = now - lastLoopTime;
lastLoopTime = now;
float delta = updateLength / ((float)OPTIMAL_TIME.get());

lastFpsTime += updateLength;
fps++;

if (lastFpsTime >= 1000000000)
{
Log.e(TAG, "(FPS Target: " + TARGET_FPS+ " ,FPS Actual: " + fps + ")");
lastFpsTime = 0;
fps = 0;
}


for (MyTextureView mtv : mItemList){
if (!mtv.isLocked()) {
mtv.doUpdate(delta);
mtv.doRender();
}
}

long sleepTime = (lastLoopTime-System.nanoTime() + OPTIMAL_TIME.get())/1000000;
sleepTime = sleepTime < 0 ? 0 : sleepTime;

try{
Thread.sleep( sleepTime );
}
catch (InterruptedException e) {
e.printStackTrace();
}

}

MyTextureView doRender()方法:
public void doRender() {
doubleBufferCanvas.drawPaint(Colors.BLACK);
doDraw(doubleBufferCanvas); //draws content onto secondary canvas

Canvas c = lockCanvas();
c.drawPaint(Colors.BLACK);
c.save();
c.drawBitmap(dbbmp, 0, 0, null);
c.restore();
unlockCanvasAndPost(c);
}

最佳答案

我能够找到解决方法。 (我没有在android 5.0及更高版本上观察到这一点)。

添加伪透明 View ,如下所示

            <View
android:id="@+id/flicker_hack_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:alpha="0.01"
android:background="@color/black_12" />

覆盖了所有 Activity ,无论有没有TextureView。 alpha应该设置为0.01或更小的值,以使其看起来不可见。

该解决方法基于我的观察,即当两个纹理 View 渲染视频重叠时,未观察到闪烁。

关于android - Android线程控制多个纹理 View 会导致奇怪的闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31124496/

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