Es gibt einen besseren Ansatz für diese sogenannte AOP (Aspect Oriented Programming). Ich habe in der Vergangenheit (vor etwa 7 Jahren) mit SpringFramework und PostSharp einige Erfahrungen mit C# gemacht. Dieser Ansatz verwendet weitgehend Codeinjektionstechniken.
Also als ich dieses Problem (Verfolgung von GL-Fehlern) konfrontiert wurde, erschien es als ein klassisches Problem für AOP.Da die Code-Injection einige Leistungseinbußen mit sich bringt, gehe ich davon aus, dass diese Änderung (Aktivierung der GL-Protokollierung) zeitlich ist und sie in einem git-Patch für die Fälle, in denen ich sie verwenden möchte, erhalten bleiben.
1) Zuerst wird Ihre gradle Build-Skripte ändern: In Top-Level-Build-Skript hinzufügen:
buildscript {
dependencies {
classpath 'com.uphyca.gradle:gradle-android-aspectj-plugin:0.9.14'
In app-Ebene Skript fügen Sie diese:
apply plugin: 'com.uphyca.android-aspectj'
Diese aspectj ermöglichen Plugin in Großbuchstaben. Dieses Projekt (gehostet hier: https://github.com/uPhyca/gradle-android-aspectj-plugin) scheint jetzt veraltet, aber es funktioniert. Sie können hier eine neuere Version anzeigen: https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx. Für meine Bedürfnisse (einfaches Java-Code-Weben) funktionierte die alte Version gut. Neu erstellen, um festzustellen, ob Probleme auftreten.
package com.example.neutrino.maze;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Created by Greg Stein on 7/18/2016.
*/
@Retention(RetentionPolicy.CLASS)
@Target({ ElementType.CONSTRUCTOR, ElementType.METHOD })
public @interface GlTrace {
}
3) unsere Aspect hinzufügen:
package com.example.neutrino.maze;
import android.opengl.GLES20;
import android.opengl.GLU;
import android.util.Log;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
/**
* Created by Greg Stein on 7/18/2016.
*/
@Aspect
public class GlTraceAspect {
private static final String POINTCUT_METHOD =
"execution(@com.example.neutrino.maze.GlTrace * *(..))";
private static final String POINTCUT_CONSTRUCTOR =
"execution(@com.example.neutrino.maze.GlTrace *.new(..))";
@Pointcut(POINTCUT_METHOD)
public void methodAnnotatedWithGlTrace() {}
@Pointcut(POINTCUT_CONSTRUCTOR)
public void constructorAnnotatedWithGlTrace() {}
@Around("methodAnnotatedWithGlTrace() || constructorAnnotatedWithGlTrace()")
public Object weaveJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {
Signature signature = joinPoint.getSignature();
String className = signature.getDeclaringType().getSimpleName();
String methodName = signature.getName();
// Before method execution
// -- nothing --
Object result = joinPoint.proceed();
// After method execution
Log.d(className, buildLogMessage(methodName));
return result;
}
/**
* Create a log message.
*
* @param methodName A string with the method name.
* @return A string representing message.
*/
private static String buildLogMessage(String methodName) {
StringBuilder message = new StringBuilder();
int errorCode = GLES20.glGetError();
message.append("GlState[");
message.append(methodName);
message.append("]: ");
if (GLES20.GL_NO_ERROR != errorCode) {
message.append("ERROR:");
}
message.append(GLU.gluErrorString(errorCode));
return message.toString();
}
}
4) Mark
2) Fügen Sie unsere Anmerkung, die wir später Methoden zur Markierung verwenden wir unser Aspekt wollen angewendet werden Methoden oder Konstrukteure, die GL-Code mit @GlTrace Anmerkung ausführen:
...
@GlTrace
public GlEngine(int quadsNum) {
...
@GlTrace
public void draw(float[] mvpMatrix) {
...
Jetzt, nach all dies nur getan, erneut ausführen das Projekt in AndroidStudio. Sie werden die folgende Ausgabe haben:
07-18 12:34:37.715 19167-19187/com.example.neutrino.maze D/GlEngine: GlState[<init>]: no error
07-18 12:34:37.715 19167-19187/com.example.neutrino.maze D/GlEngine: GlState[draw]: no error
07-18 12:34:37.733 19167-19187/com.example.neutrino.maze D/GlEngine: GlState[<init>]: no error
07-18 12:34:37.735 19167-19187/com.example.neutrino.maze D/GlEngine: GlState[draw]: no error
07-18 12:34:37.751 19167-19187/com.example.neutrino.maze D/GlEngine: GlState[<init>]: no error
07-18 12:34:37.751 19167-19187/com.example.neutrino.maze D/GlEngine: GlState[draw]: no error
07-18 12:34:37.771 19167-19187/com.example.neutrino.maze D/GlEngine: GlState[<init>]: no error
07-18 12:34:37.771 19167-19187/com.example.neutrino.maze D/GlEngine: GlState[draw]: no error
In meinem Projekt habe ich nur zwei Methoden, mit GL ruft: Draw-Verfahren und der Konstruktor von GlEngine Klasse.
Nachdem Sie ein wenig mit diesem spielen und die lästigen „kein Fehler“ -Meldungen erhalten Sie können einige Verbesserungen tun: 0) Druckfehler nur 1) überwachen alle Methoden welche Match gl * (alle OpenGl Methoden).
Viel Spaß!
JIC, "Enable OpenGL Spuren" kam in 4.2 ... :) –
Danke, ich habe meinen Beitrag entsprechend bearbeitet. – sschuberth
Ich kann "OpenGL-Traces aktivieren" auf Oreo nicht finden. Irgendwelche Ideen, warum sie weg sind? – Pavel