Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android应用程序上的GPU工件_Android_Gpu - Fatal编程技术网

Android应用程序上的GPU工件

Android应用程序上的GPU工件,android,gpu,Android,Gpu,我有一个应用程序有一个非常奇怪的问题。有时启动应用程序时,所有片段都会遇到此问题。看起来GPU正在用它做一些有趣的事情。 在下面的动画Gif中,您可以清楚地看到PreferenceFragment,其中包含上述工件 编辑1。看起来我有一个特定的片段,一旦“绘制”到屏幕上,bug就会出现。使用.replace切换片段实际上不会“清除”问题 我如何调试这个 它看起来像是来自GPU的垃圾。 您首先需要查看的是您的窗口背景(之后是各种全屏布局背景)。 它可能被定义为null或其他类似问题 好的,我的问题

我有一个应用程序有一个非常奇怪的问题。有时启动应用程序时,所有片段都会遇到此问题。看起来GPU正在用它做一些有趣的事情。 在下面的动画Gif中,您可以清楚地看到PreferenceFragment,其中包含上述工件

编辑1。看起来我有一个特定的片段,一旦“绘制”到屏幕上,bug就会出现。使用
.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>