Android应用程序上的GPU工件
我有一个应用程序有一个非常奇怪的问题。有时启动应用程序时,所有片段都会遇到此问题。看起来GPU正在用它做一些有趣的事情。 在下面的动画Gif中,您可以清楚地看到PreferenceFragment,其中包含上述工件 编辑1。看起来我有一个特定的片段,一旦“绘制”到屏幕上,bug就会出现。使用Android应用程序上的GPU工件,android,gpu,Android,Gpu,我有一个应用程序有一个非常奇怪的问题。有时启动应用程序时,所有片段都会遇到此问题。看起来GPU正在用它做一些有趣的事情。 在下面的动画Gif中,您可以清楚地看到PreferenceFragment,其中包含上述工件 编辑1。看起来我有一个特定的片段,一旦“绘制”到屏幕上,bug就会出现。使用.replace切换片段实际上不会“清除”问题 我如何调试这个 它看起来像是来自GPU的垃圾。 您首先需要查看的是您的窗口背景(之后是各种全屏布局背景)。 它可能被定义为null或其他类似问题 好的,我的问题
.replace
切换片段实际上不会“清除”问题
我如何调试这个
它看起来像是来自GPU的垃圾。
您首先需要查看的是您的窗口背景(之后是各种全屏布局背景)。
它可能被定义为null或其他类似问题 好的,我的问题是因为我的主题中有
<item name="android:windowBackground">@color/dark</color>
通过编程,我必须使用coverview.getBackground().setAlpha((int)(0.6f*255))设置coverview的alpha代码>
令人惊讶的是,这个新的alpha值也应用于窗口背景,并生成了许多您在我的问题中看到的工件(即使在切换了coverview不再在视图树中的片段之后)
默认情况下,从同一资源加载的所有drawables实例共享一个公共状态。因此,我的代码是错误的,我需要在应用新的alpha值之前调用后台
除了我在没有调用.mutate()
的情况下错误地@calling.setAlpha
之外,GPU的闪烁对我来说仍然是一个谜
为什么GPU会闪烁?正如克里斯托夫所指出的那样:
GPU闪烁导致背景现在是半透明的,而
系统尝试将其与当前在空缓冲区中的内容混合
(大部分是垃圾)
为了展示这个bug问题,我创建了一个github repo,其中有一个示例项目在这里展示了这个问题:
变通办法:几个。如果您喜欢使用相同的方法(这也会导致过度拉伸),则应以编程方式设置颜色,然后将alpha值设置为该颜色。像这样:
coverView.setBackground(新的ColorDrawable(getResources().getColor(R.color.dark))代码>
更好的方法是将A应用于ImageView,或者如果您使用的是Picasso
则使用A
另一种方法是在.setAlpha()
之前调用.mutate()
。是否可能在设置->开发人员选项中启用了一个奇特的复选框?嘿@Blackbelt我刚刚选中了。我只有一个活动模式(禁用它没有任何效果。它在其他设备/模拟器上也这样做吗?@LukeStoneHm是的。在Nexus 4 api 23 w/Gapis上进行了测试。同样的问题!我曾经遇到过类似的情况,并调用setRetainInstance(true);
在片段中解决了这个问题。我不知道发生了什么。windowBackground是在我的主题中定义的,引用了一个颜色资源,该资源解析为#313131。问题来自于窗口背景没有按要求不透明,因此它与GPU硬件缓冲区中最初存在的垃圾混在一起,当时没有任何东西被绘制出来请尝试:coverView.getBackground().mutate().setAlpha((int)(0.6f*255));
@BladeCoder.mutate()也解决了这个问题。因此,从资源加载的可绘制文件共享一个公共状态,如果您只想更改其中一个,最好调用.mutate()
首先,正如你所建议的那样。现在需要理解的是GPU为什么会闪烁。很抱歉@BladeCoder,我不知道你是来自G+的同一个人。我已经在最后一次编辑答案时提到过你。(希望你不介意)
<FrameLayout
android:layout_width="match_parent"
android:layout_height="200dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/mydrawable"
/>
<View
android:id="@+id/coverview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/dark"/>
</FrameLayout>