3 Stimmen

XML FrameLayout hat meine OpenGL SurfaceView Framerate (fps) gesenkt

Ich habe die GLSurfaceView erweitert und meinen eigenen GLSurfaceView.Renderer implementiert, um mein erstes relativ einfaches 2D OpenGLES Spiel für Android zu erstellen.

Ich habe mein Spiel mit dem folgenden Code auf die Aktivitäten onCreate-Methode, die die Oberfläche Ansicht als Inhalt Ansicht, von denen ich eine konstante 60fps erhalten haben, setzt getestet.

60fps Aktivität :

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

Jetzt bin ich jedoch zu einem XML-Layout übergegangen, damit ich ein Admob-Overlay in der rechten unteren Ecke des Bildschirms platzieren kann,

admob xml :

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

admob-Aktivität :

setContentView(R.layout.main);

Jetzt schwankt die Anwendung in scheinbar zufälligen Abständen zwischen 43fps und 60fps. Ich habe mir den LogCat angesehen und die GC läuft nicht übermäßig (einmal alle 20 Sekunden oder so).

  • Hätte ich eine niedrigere Bildrate erwarten sollen, wenn ich meine Oberflächenansicht in ein XML-Layout verschiebe?
  • Gibt es eine alternative Methode für die Anzeige von Admob-Anzeigen, ohne ein XML-Layout zu verwenden?
  • Gibt es irgendetwas, das ich tun kann, um herauszufinden, warum die FPS meiner Anwendungen zu bestimmten Zeiten sinken?

Jede Hilfe wäre sehr willkommen, denn ich möchte meine OpenGL-Anwendungen in naher Zukunft zu Geld machen können.

4voto

EvilDuck Punkte 4376

GLSurfaceView ist eine SurfaceView und hat eine etwas andere Art der Darstellung in einem Fenster.

"Die SurfaceView stanzt ein Loch in ihr Fenster, damit ihre Oberfläche angezeigt werden kann. Die Ansichtshierarchie kümmert sich um das korrekte Compositing mit der SurfaceView alle Geschwister der SurfaceView, die die normalerweise über der SurfaceView erscheinen würden. Dies kann verwendet werden, um Overlays wie z. B. Schaltflächen über der Oberfläche zu platzieren, wobei jedoch zu beachten ist, dass dies Auswirkungen auf die Leistung haben kann, da ein vollständiges Alpha-Blended Composite jedes Mal durchgeführt wird, wenn sich die Oberfläche ändert."

Im ersten Schritt müssen Sie AdMobView in einem separaten Fenster (Ebene) über Ihrem Hauptfenster zeichnen. Hier ist ein Beispiel dafür, wie Sie es tun:

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" ist hier ein Layout, das adView enthält. Achten Sie darauf, dass Sie die Flags für das Fenster richtig konfigurieren, damit Ihre Berührungen in das Hintergrundfenster rutschen können. Außerdem sind Sie für das Entfernen dieses Fensters verantwortlich.

Ein weiterer Rat, den ich haben kann, ist zu versuchen, Standard-Hintergrund in Ihrem Thema zu deaktivieren, da Ihre GLSurfaceView ist oben auf sie, Sie wollen nicht extra zeichnet dahinter.

in Ihrem Thema hinzufügen

<item name="android:windowBackground">@null</item>

Ich hoffe, das hilft.

1voto

RajPara Punkte 2281

Um einen dieser Punkte zu beantworten: Sie können auf jeden Fall eine AdMob-Anzeige erstellen und sie programmatisch in Ihre Ansichtshierarchie einfügen, Sie müssen ihr wahrscheinlich nur eine Schwerkraft von " bottom " oder so ähnlich, damit es am unteren Rand des FrameLayouts bleibt.

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

0voto

user634545 Punkte 8576

Ich habe vor einiger Zeit etwas Ähnliches gelesen, die Lösung war, die Overlay in einem separaten Fenster über der glsurfaceview zu platzieren.

0voto

Ilya Gazman Punkte 29734

Ich erinnere mich nicht, wo, aber ich defiantly irgendwo in Android gelesen, dass, wenn Sie eine Ansicht, wie Ihre OpenGLTest1SurfaceView aktualisieren, Bildschirm Invalidierung auf dem Rect gefeuert wird, dass Ihre Ansicht nimmt, so dass, wenn Sie die Admobe über es Ihre fps platzieren wird fallen. Wenn Sie die Admobe daneben platzieren, ist alles in Ordnung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X