Probleme mit GLSurfaceView: Bildschirm flimmert und Objekt wird mehrfach gezeichnet

  • Antworten:14
Duke
  • Forum-Beiträge: 8

07.03.2014, 13:09:02 via Website

Hi.

Ich versuche mich grade als beginnender Android-Entwickler
und da tauchen natürlich gleich Probleme auf :mellow:

Auf Basis von "Spieleentwicklung 101" habe ich ein eigenes Projekt erstellt,
welches einfach nur ein buntes Dreieck zeichnen soll.Im Simulator klappt das ganz
wunderbar, nur auf meinen Nexus 4 kommt dann der Müll raus

Das Dreieck wird mehrfach gezeichnet und der Bildschirm flimmert auch arg.
Datenmüll (helles/lila Gepixel) ist auch vorhanden. (siehe Bild)

Was kann das sein ?
Danke und gruß

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 13:39:51 via Website

Können wir ohne nen Bisschen Code garnicht sagen.
Deine Zeichenmethode wäre zusetzlich noch interessant

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Duke
  • Forum-Beiträge: 8

07.03.2014, 14:43:35 via Website

Ja, klar. Sorry, war'nen Schnellschuss von unterwegs.

Hier also der Code. Wie gesagt, das merkwürdige ist, dass
das auf dem Eclipse-Simulator anstandslos läuft, bloß auf meinem
Handy siehts so komisch aus.

1import java.nio.ByteBuffer;
2import java.nio.ByteOrder;
3import java.nio.FloatBuffer;
4
5import javax.microedition.khronos.egl.EGLConfig;
6import javax.microedition.khronos.opengles.GL10;
7
8import com.ragingbudgie.test3.util.SystemUiHider;
9
10import android.annotation.TargetApi;
11import android.app.Activity;
12import android.graphics.Rect;
13import android.os.Build;
14import android.os.Bundle;
15import android.os.Handler;
16import android.view.MotionEvent;
17import android.view.View;
18import android.opengl.GLSurfaceView;
19
20
21public class MainActivity extends Activity implements GLSurfaceView.Renderer {
22
23 private GLSurfaceView m_GLView;
24 private Rect m_currentScreen;
25
26 private FloatBuffer m_Vertices;
27 private FloatBuffer m_Colors;
28
29 private Boolean m_Drawn;
30 private Boolean m_Created;
31
32 @Override
33 public void onDrawFrame(GL10 gl) {
34 // GLSurfaceView.Renderer
35
36 if (! m_Drawn) {
37 gl.glViewport(0, 0, m_currentScreen.width(), m_currentScreen.height());
38
39 // Vertices
40 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
41 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, m_Vertices);
42
43 //Colors
44 gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
45 gl.glColorPointer(4, GL10.GL_FLOAT, 0, m_Colors);
46
47 gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
48
49 m_Drawn = true;
50
51 }
52 }
53
54 @Override
55 public void onSurfaceChanged(GL10 gl, int width, int height) {
56 // GLSurfaceView.Renderer
57 if (m_currentScreen == null) {
58 m_currentScreen = new Rect();
59 }
60
61 m_currentScreen.set(0, 0, width, height);
62
63 }
64
65 @Override
66 public void onSurfaceCreated(GL10 gl, EGLConfig config) {
67 // GLSurfaceView.Renderer
68
69 if(! m_Created){
70 m_Drawn = false;
71
72 ByteBuffer tempBuffer = ByteBuffer.allocateDirect( 3 * 3 * 4);
73
74 tempBuffer.order(ByteOrder.nativeOrder());
75
76 m_Vertices = tempBuffer.asFloatBuffer();
77
78 m_Vertices.put(-0.5f);
79 m_Vertices.put(-0.5f);
80 m_Vertices.put( 0.0f);
81
82 m_Vertices.put( 0.5f);
83 m_Vertices.put(-0.5f);
84 m_Vertices.put( 0.0f);
85
86 m_Vertices.put( 0.0f);
87 m_Vertices.put( 0.5f);
88 m_Vertices.put( 0.0f);
89
90 m_Vertices.rewind();
91
92
93 tempBuffer = ByteBuffer.allocateDirect( 3 * 4 * 4);
94
95 tempBuffer.order(ByteOrder.nativeOrder());
96
97 m_Colors = tempBuffer.asFloatBuffer();
98
99 m_Colors.put(1);
100 m_Colors.put(0);
101 m_Colors.put(0);
102 m_Colors.put(1);
103
104 m_Colors.put(0);
105 m_Colors.put(1);
106 m_Colors.put(0);
107 m_Colors.put(1);
108
109 m_Colors.put(0);
110 m_Colors.put(0);
111 m_Colors.put(1);
112 m_Colors.put(1);
113
114 m_Colors.rewind();
115
116 m_Created = true;
117 }
118 }
119
120 /* (non-Javadoc)
121 * @see android.app.Activity#onCreate(android.os.Bundle)
122 */
123 @Override
124 protected void onCreate(Bundle savedInstanceState) {
125 // TODO Auto-generated method stub
126 super.onCreate(savedInstanceState);
127
128 // Surfaceview erzeugen
129 m_GLView = new GLSurfaceView(this);
130 // Renderer-Callback registrieren (diese Klasse selbst)
131 m_GLView.setRenderer(this);
132
133 // GLSurfaceView als anzuzeigenden Inhalt setzen
134 this.setContentView( m_GLView );
135
136 m_Created = false;
137 }
138
139 /* (non-Javadoc)
140 * @see android.app.Activity#onPause()
141 */
142 @Override
143 protected void onPause() {
144 // TODO Auto-generated method stub
145 super.onPause();
146 m_GLView.onPause();
147 }
148
149 /* (non-Javadoc)
150 * @see android.app.Activity#onRestart()
151 */
152 @Override
153 protected void onRestart() {
154 // TODO Auto-generated method stub
155 super.onRestart();
156
157 }
158
159 /* (non-Javadoc)
160 * @see android.app.Activity#onResume()
161 */
162 @Override
163 protected void onResume() {
164 // TODO Auto-generated method stub
165 super.onResume();
166 m_GLView.onResume();
167 }
168
169 /* (non-Javadoc)
170 * @see android.app.Activity#onStart()
171 */
172 @Override
173 protected void onStart() {
174 // TODO Auto-generated method stub
175 super.onStart();
176
177 }
178
179 /* (non-Javadoc)
180 * @see android.app.Activity#onStop()
181 */
182 @Override
183 protected void onStop() {
184 // TODO Auto-generated method stub
185 super.onStop();
186
187 }
188
189
190}

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 14:59:41 via Website

Hmm, beim überfliegen keine Fehler endecken können.
Gibt's logCat fehler?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

07.03.2014, 16:26:11 via Website

Evtl glClear bzw glClearColor vergessen ? Zumindest sieht es so aus als ob da der RAM einfach benutzt wird.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Duke
  • Forum-Beiträge: 8

07.03.2014, 17:15:04 via Website

Hier ist mal das Log von dem App-Start. Sieht mir aber auch nicht ominös aus, oder ?

Das Flimmern scheint mir ein ständiges Neuzeichnen zu sein. Aber wieso ?
Und wieso scheinen da 4 (Zeilen) x 3(Spalten) Zeichenbereiche zu sein, wo die Garfik immer wiederholt wird ?


103-07 17:10:21.447: I/ActivityManager(1229): Timeline: Activity_launch_request id:com.ragingbudgie.test3 time:120521096
203-07 17:10:21.447: I/ActivityManager(660): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.ragingbudgie.test3/.MainActivity} from pid 1229
303-07 17:10:21.527: W/BroadcastQueue(660): Permission Denial: receiving Intent { act=com.android.launcher3.action.LAUNCH flg=0x10 (has extras) } to com.google.android.googlequicksearchbox/com.google.android.search.core.summons.icing.InternalIcingCorporaProvider$ApplicationLaunchReceiver requires com.android.launcher3.permission.RECEIVE_LAUNCH_BROADCASTS due to sender com.android.launcher3 (uid 10129)
403-07 17:10:21.577: V/Zygote(7479): Switching descriptor 33 to /dev/null
503-07 17:10:21.577: V/Zygote(7479): Switching descriptor 10 to /dev/null
603-07 17:10:21.577: D/dalvikvm(7479): Late-enabling CheckJNI
703-07 17:10:21.587: I/ActivityManager(660): Start proc com.ragingbudgie.test3 for activity com.ragingbudgie.test3/.MainActivity: pid=7479 uid=10141 gids={50141}
803-07 17:10:21.737: I/Adreno-EGL(7479): <qeglDrvAPI_eglInitialize:320>: EGL 1.4 QUALCOMM build: (CL3776187)
903-07 17:10:21.737: I/Adreno-EGL(7479): OpenGL ES Shader Compiler Version:
1003-07 17:10:21.737: I/Adreno-EGL(7479): Build Date: 10/15/13 Tue
1103-07 17:10:21.737: I/Adreno-EGL(7479): Local Branch:
1203-07 17:10:21.737: I/Adreno-EGL(7479): Remote Branch: partner/upstream
1303-07 17:10:21.737: I/Adreno-EGL(7479): Local Patches:
1403-07 17:10:21.737: I/Adreno-EGL(7479): Reconstruct Branch:
1503-07 17:10:21.787: D/OpenGLRenderer(7479): Enabling debug mode 0
1603-07 17:10:21.867: I/ActivityManager(660): Displayed com.ragingbudgie.test3/.MainActivity: +306ms
1703-07 17:10:21.897: I/ActivityManager(7479): Timeline: Activity_idle id: android.os.BinderProxy@41876e38 time:120521540
1803-07 17:10:21.917: I/ActivityManager(660): Timeline: Activity_windows_visible id: ActivityRecord{428606f0 u0 com.ragingbudgie.test3/.MainActivity t191} time:120521568
1903-07 17:10:26.201: I/ActivityManager(1229): Timeline: Activity_idle id: android.os.BinderProxy@418712a0 time:120525849
2003-07 17:10:26.612: I/ActivityManager(660): Timeline: Activity_windows_visible id: ActivityRecord{4216d628 u0 com.android.launcher3/.Launcher t1} time:120526255

— geändert am 07.03.2014, 17:22:12

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 17:22:43 via Website

Eigentlich meinte ich nur das Log indem Fehler auftreten.
Hier sind aber keine Errors verzeichnet

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Duke
  • Forum-Beiträge: 8

07.03.2014, 17:24:23 via Website

Ich habe in Eclipse die Ausgabe auf "verbose" gestellt. Da müsste doch alles drin sein, oder ? :blink:

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 17:59:49 via Website

Ja das ist richtig, d.h aber auch, dass keine Laufzeitfehler auftreten, somit liegt es an der Programmmierung

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Duke
  • Forum-Beiträge: 8

07.03.2014, 18:03:25 via Website

Ja, sehe ich auch so.
Aber ich verstehe nicht, was so ein Verhalten verursachen könnte.

Hm, doof :mad:

Antworten
Duke
  • Forum-Beiträge: 8

07.03.2014, 20:38:03 via Website

Wenn ich in der Manifestdatei die Min SDK Versoin umsetze
sieht es beim Wert 4 aus wie auf dem obene Bild und unter Wert 3 wie auf dem unteren Bild.
Hat da jemand eine Idee zu, wo der Hund begraben liegt ?
Ursprünglich stand da 8 drin.

SDK4


SDK3

— geändert am 07.03.2014, 20:40:31

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

08.03.2014, 10:18:07 via Website

Schau dir mal evtl ein anderes Tutorial an, irgendwas ist anders, dein Setup sieht zwar gut aus auch erzwingst du kein neuzeichnen, wenn es dann noch flackert ist das ein hinweiß darauf dass du wild im Grafikspeicher rummalst. Nutzt du evtl irgendwelche Styles z.b setzt den Hintergrund transparent, wenn ja, schmeiß das alles mal raus !

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Duke
  • Forum-Beiträge: 8

09.03.2014, 18:20:58 via Website

So, ich weiss jetzt woran's lag. :D

in OnDrawFrame fehlte der Aufruf von

1gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

Da wird im Tutorial auch nicht drauf hingewiesen - wurde wohl schlicht an der Stelle vergessen.
Im kompilierbaren Beispielprogramm im SVN Repository ist der Aufruf dann drin.

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

09.03.2014, 22:47:16 via Website

Na, das hab Ich oben geschrieben ;)

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Duke
  • Forum-Beiträge: 8

10.03.2014, 12:33:19 via Website

Shit happens.
Danke !

Antworten