2015-09-07 31 views
0

我有一個應用程序,它有一個非常奇怪的問題。有時啓動應用程序時,所有的片段都會遇到這個問題。它看起來像GPU正在做一些奇特的事情。 在下面的動畫GIF中,您可以清楚地看到具有上述工件的PreferenceFragment。安卓應用上的GPU工件

編輯1。它看起來像我有一個特定的片段,一旦「畫」在屏幕上的錯誤出現。使用.replace切換片段不會「清除」問題。

我該如何調試?

gpu-artifacts android

+2

是您可能在「設置」 - >「開發人員選項」中啓用了某個複雜的複選框。 – Blackbelt

+1

嘿@Blackbelt我剛剛檢查。我只有嚴格的模式積極。 :(禁用它沒有任何效果。 –

+0

是否做到這一點在其他設備/模擬器? – LukeStoneHm

回答

0

好了,因爲我有我的主題內的問題已經引起

<item name="android:windowBackground">@color/dark</color> 

其中dark是一個顏色項設置爲#313131

然後,我不得不說我作爲一個覆蓋了一些其他的一塊視圖內容變暗的基本觀點如下:

<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> 

編程,我不得不設置coverview由阿爾法使用coverView.getBackground().setAlpha((int)(0.6f*255));

令人驚訝的這個新的Alpha值也適用於窗口背景,併產生了很多你在我的問題看文物

(甚至切換片段,其中coverview是在視圖樹不再後)

默認情況下,從同一資源加載的所有可繪製實例共享一個公共狀態。因此,我的代碼是錯誤的,我需要在應用新的alpha值之前在背景上調用.mutate

除了我自己的錯誤@調用.setAlpha沒有調用.mutate() GPU的閃爍仍然是一個謎給我

爲什麼GPU閃爍呢?正如克里斯托弗here指出:

的GPU閃爍造成的背景是現在半透明的, 系統嘗試與什麼是目前在空的緩衝 (主要是垃圾)混合它。

爲了展示錯誤問題,我創建了一個GitHub庫與樣本項目展示在這裏的問題:https://github.com/vekexasia/gpuflickering-background-alpha

解決方法:有幾個。如果您喜歡使用相同的方法(這也會導致透支),則應該以編程方式設置顏色,然後爲其設置Alpha值。像這樣: coverView.setBackground(new ColorDrawable(getResources().getColor(R.color.dark)));

一個更好的方法將是一個ColorFilter適用於ImageView的,或者如果你正在使用Picasso使用Transformation

另一種方法是隻是調用.mutate().setAlpha()

+0

嘗試:'coverView.getBackground()。mutate()。setAlpha((int)(0.6 F * 255));' – BladeCoder

+0

@BladeCoder .mutate()也解決了問題,所以從資源共享加載_common STATE_的繪項目,如果你想改變。只有其中的一個,如你所建議的,你最好先調用'.mutate()'。它只是爲了理解GPU爲什麼閃爍。 –

+0

對不起@BladeCoder我不知道你是G +中的同一個人。我在答案的最後編輯中已經提到過你。 (我希望你不介意) –

0

它看起來像垃圾從GPU的到來。
你需要看的第一件事是你的窗口背景(以及之後的各種全屏佈局背景)。
它可能被定義爲null或其他類似的問題。

+1

的windowBackground在我的主題定義引用一個顏色資源解析爲#313131 –

+0

問題從沒有被不透明的窗口背景來了。根據需要,當它與當前幀中沒有繪製任何東西時,最初存在於GPU硬件緩衝區中的垃圾混合在一起。 – BladeCoder