2012-03-13 64 views
3

我已經擴展了GLSurfaceView並實現了我自己的GLSurfaceView.Renderer來創建我的第一個相對簡單的2D OpenGLES遊戲。XML FrameLayout降低了我的OpenGL SurfaceView幀率(fps)

我一直在活動onCreate方法上使用以下代碼測試我的遊戲,該方法將表面視圖設置爲內容視圖,並從中獲取恆定的60fps。

60fps的活動:

mGLView = new OpenGLTest1SurfaceView(this); 
setContentView(mGLView); 

不過我現在已經轉移到一個XML佈局,使我可以將AdMob廣告覆蓋在屏幕的右下角,

AdMob的XML:

<Frame Layout... 
<...OpenGLTest1SurfaceView... 
<com.google.ads.adView... 

admob活動:

setContentView(R.layout.main); 

現在我的應用程序在43fps和60fps之間波動,看似隨機的時間間隔。我已經看過LogCat,並且GC沒有過度運行(每20秒左右一次)。

  • 當我將表面視圖移動到XML佈局時,我是否應該預期較低的幀頻?
  • 是否有另一種顯示admob廣告而不使用XML佈局的方法?
  • 有什麼我可以做的,以確定爲什麼我的應用程序FPS在特定時間降低?

任何幫助將不勝感激,因爲我希望能夠在不久的將來通過我的OpenGL應用程序貨幣化。

+0

我決定接受窗口的答案,因爲這確實增加了我的幀率 - 不過,我將獎賞獎給@RajPara作爲他的回答,因爲它解釋瞭如何將admob視圖添加到現有佈局。 – TerryProbert 2012-04-25 18:12:57

回答

5

作爲一個SurfaceView的GLSurfaceView在窗口中有一點點不同的表現方式。

「的SurfaceView衝頭在其窗口中的孔,以允許其表面 被顯示。該視圖層次結構將採取正確 合成的護理與表面SurfaceView的任何兄弟姐妹的是 通常會出現上的頂它。這可以被用於放置疊加 如上表面的頂部按鈕,雖然記然而,它可以 具有自全alpha混合複合 將每次進行表面變化對性能產生影響。」

第一步你需要繪製AdMobView在主窗口的頂部一個單獨的窗口(層) 這裏是你如何做到這一點的例子:

View topLocker = lockDownWindow.getChildAt(0); 

WindowManager.LayoutParams windowParams = new WindowManager.LayoutParams(); 
windowParams.gravity = Gravity.TOP; 
windowParams.x = 0; 
windowParams.y = 0; 
windowParams.height = WindowManager.LayoutParams.MATCH_PARENT; 
windowParams.width = WindowManager.LayoutParams.MATCH_PARENT; 
windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 
    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; 
windowParams.format = PixelFormat.TRANSLUCENT; 
windowParams.windowAnimations = 0; 

WindowManager wm = getWindowManager(); 
wm.addView(yourAwesomView, windowParams); 

「yourAwesomeView」這裏是包含佈局adView。當心你必須正確配置窗口的標誌讓喲你接觸到背景窗口。你也可以通過移除這個窗口來重新定位。

我的另一個建議是嘗試在你的主題中禁用默認背景,因爲你的GLSurfaceView是最重要的,你不需要額外的抽象。

在你的主題添加

希望這有助於。

+0

我試過你的代碼片段與Greystripe廣告網絡。工作正常,但我遇到了一個我無法解決的問題:如果我點擊橫幅廣告,瀏覽器打開並顯示廣告 - 一切正常,但是當我回到我的應用程序時,我看到一個黑屏和廣告。不知何故,我的OpenGL視圖消失:( – Maecky 2012-07-13 10:27:50

+0

據我所知,當你打開另一個窗口/關閉OpenGL surfaceview卸載所有紋理,你需要重新加載紋理。 – EvilDuck 2012-07-14 07:19:13

0

我之前讀過類似的東西,解決方法是將 疊加層放在單獨的窗口中,在glsurfaceview之上。

1

要回答其中的一點,您可以創建AdMob廣告並以編程方式將其放入您的視圖層次結構中,但您可能只需要給它一個「bottom」的引力或其他東西,以便它停留在底部FrameLayout。

AdView adView = new AdView(this, AdSize.BANNER, INSERT_ADMOB_ID_HERE); 
    AdRequest adRequest = new AdRequest(); 
    adRequest.addTestDevice(AdRequest.TEST_EMULATOR); 
    adView.loadAd(adRequest); 
    // Add the adView into your view hierarchy using addView 
    layout.addView(adView); 
0

我不記得在哪裏,但我在Android的挑釁看了一些地方,當你正在更新一個視圖,如您OpenGLTest1SurfaceView,屏幕失效是在你的觀點是,如果你採取這樣矩形發射將admobe放在它上面,你的fps會掉下來。如果你把admobe放在它旁邊,你會沒事的。