我使用GLSurfaceView遇到了不同的行为.

AFAIK是程序的责任,清除每帧的缓冲区(颜色和深度).这意味着如果我不清除缓冲区,我会得到最后一帧的内容(或者之前用于双缓冲的内容).

似乎无论在某些设备上是什么,缓冲区都被清除了.我在Addison Wesley OpenglES2.0编程指南中对一些具有不同结果的测试设备进行了“Hello Triangle”程序的以下修改:

> Acer Iconia A500(4.0.3):未清除(预期行为)

> Sony XPERIA Go(4.0.4):已清除

> Galaxy S3(4.1.1):清除

> LG Optimus 4x HD(4.0.3):未清除

>三星Galaxy Tab 20.1(4.0.4):未清除

>摩托罗拉Xoom(3.2):未清除

> Galaxy S2(4.1.2 – rooted):清除

有没有办法强制在每个绘制回调中获得一个未更改的缓冲区?

清除屏幕的设备的结果如下所示:

测试活动如下所示:

package com.example.glcleartest;

import java.nio.Buffer;

import java.nio.ByteBuffer;

import java.nio.ByteOrder;

import java.nio.FloatBuffer;

import javax.microedition.khronos.egl.EGLConfig;

import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLES20;

import android.opengl.GLSurfaceView;

import android.opengl.GLSurfaceView.Renderer;

import android.os.Bundle;

import android.app.Activity;

import android.util.Log;

public class MainActivity extends Activity {

protected static final int NUM_VERTICES = 3;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

GLSurfaceView glview = (GLSurfaceView) findViewById(R.id.glview);

glview.setEGLConfigChooser(false);

glview.setEGLContextClientVersion(2);

glview.setRenderer(new Renderer() {

private int programObject;

private FloatBuffer vertexBuffer;

@Override

public void onSurfaceCreated(GL10 gl, EGLConfig config) {

}

@Override

public void onSurfaceChanged(GL10 gl, int width, int height) {

GLES20.glViewport(0, 0, width, height);

init();

}

@Override

public void onDrawFrame(GL10 gl) {

float x = 0.1f*(float) Math.sin(System.currentTimeMillis()/1000.0);

float[] vVertices = new float[]{x, 0.5f, 0.0f,

x-0.5f, -0.5f, 0.0f,

x+0.5f, -0.5f, 0.0f};

vertexBuffer.rewind();

vertexBuffer.put(vVertices);

vertexBuffer.rewind();

// Use the program object

GLES20.glUseProgram(programObject);

int handle = GLES20.glGetUniformLocation(programObject, "uColor");

float r = (float) (0.5f+Math.sin(System.currentTimeMillis()/1000.0));

float g = (float) (0.5f+Math.sin(System.currentTimeMillis()/300.0));

GLES20.glUniform4f(handle, r, g,0,1);

// Load the vertex data

GLES20.glVertexAttribPointer(0, 3, GLES20.GL_FLOAT, false, 0, vertexBuffer);

GLES20.glEnableVertexAttribArray(0);

GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);

}

private void error(String s) {

Log.e("GLTEST", s);

}

private int loadShader(int shaderType, String source) {

if (shaderType != GLES20.GL_FRAGMENT_SHADER && shaderType != GLES20.GL_VERTEX_SHADER) {

throw new RuntimeException("Illegal shader type");

}

int shader = GLES20.glCreateShader(shaderType);

if (shader != 0) {

GLES20.glShaderSource(shader, source);

GLES20.glCompileShader(shader);

int[] compiled = new int[1];

GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);

if (compiled[0] == 0) {

error("Could not compile shader :");

error(GLES20.glGetShaderInfoLog(shader));

GLES20.glDeleteShader(shader);

shader = 0;

throw new RuntimeException("Shader Syntax / compilation error");

}

}

return shader;

}

private void init() {

String vShaderStr = "attribute vec4 vPosition; \n" +

"void main() \n" + "{ \n" +

" gl_Position = vPosition; \n" +

"} \n";

String fShaderStr = "precision mediump float; \n" +

"uniform vec4 uColor;" +

"void main() \n" +

"{ \n" +

" gl_FragColor = uColor; \n" +

"} \n";

ByteBuffer vbb = ByteBuffer.allocateDirect(NUM_VERTICES*3*4);

vbb.order(ByteOrder.nativeOrder());

vertexBuffer = vbb.asFloatBuffer();

int vertexShader;

int fragmentShader;

// Load the vertex/fragment shaders

vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vShaderStr);

fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fShaderStr);

// Create the program object

programObject = GLES20.glCreateProgram();

if (programObject == 0)

return;

GLES20.glAttachShader(programObject, vertexShader);

GLES20.glAttachShader(programObject, fragmentShader);

// Bind vPosition to attribute 0

GLES20.glBindAttribLocation(programObject, 0, "vPosition");

// Link the program

GLES20.glLinkProgram(programObject);

int[] linkStatus = new int[1];

GLES20.glGetProgramiv(programObject, GLES20.GL_LINK_STATUS, linkStatus, 0);

if (linkStatus[0] != GLES20.GL_TRUE) {

error("Could not link program: ");

error(GLES20.glGetProgramInfoLog(programObject));

GLES20.glDeleteProgram(programObject);

programObject = 0;

}

}

});

}

}

android清空frame,android – GLSurfaceView onDrawFrame清除行为相关推荐

  1. android 内部存储 清空,Android清空应用内部文件缓存

    Android应用中加载的图片以及一些数据缓存怎么清掉呢?最近在做项目中遇到了这个问题,网上搜了一下找到了不少的源代码,综合了这些源码,下面给大家说一下吧,怎么有效的清除应用内存的缓存信息? 清除应用 ...

  2. android+清除循环动画,android自定义View之(4)-一键清除动画

    android自定义View之(四)------一键清除动画 1.前言: 自己也是参考别人的一些自定义view例子,学习了一些基本的自定义view的方法.今天,我参考了一些资料,再结合自已的一些理解, ...

  3. android自定义View之(四)------一键清除动画

    1.前言: 自己也是参考别人的一些自定义view例子,学习了一些基本的自定义view的方法.今天,我参考了一些资料,再结合自已的一些理解,做了一个一键清除的动画.当年,我实现这个是用了几张图片,采用F ...

  4. android textview清空内容,Android中使用 AutoCompleteTextView 实现手机号格式化附带清空历史的操作...

    有个小伙伴遇到了这样一个问题,就是autocompletetextview实现自动填充的功能.同时要具备手机格式化的功能.下拉列表最后一行是有个清除历史的功能.可是点击"清除历史" ...

  5. Android简单实现搜索功能 显示清除历史搜索记录

    本文主要为大家分享了Android实现搜索功能,并且可以实时显示搜索的历史记录,根据输入的内容去模糊查询,供大家参考,界面图如下. 本案例实现起来也非常的简单,所以可以直接拿来嵌入项目中使用,主要涉及 ...

  6. android之frame动画详解

    上一篇我们说了android中的tween动画,这一篇我们说说frame动画,frame动画主要是实现了一种类似于gif动画的效果,就是多张图按预先设定好的时间依次连续显示. 新建一个android项 ...

  7. android camera 分辨率,Android:相机帧分辨率大于640x480(Android: camera frame resolution larger than 640x480)...

    Android:相机帧分辨率大于640x480(Android: camera frame resolution larger than 640x480) 在Android中,您需要将Surface设 ...

  8. Android 10 恢复出厂设置和清除应用数据接口

    1 .恢复出厂方式的接口 a.通过广播方式调用: Intent intent = new Intent(Intent.ACTION_FACTORY_RESET);         intent.set ...

  9. android卸载app代码,android app卸载后不被清除的数据的一种解决方法

    使用场景:APP某一种设置,不想因为清除缓存后丢失; 一.系统数据库的位置在/data/data/com.android.providers.settings/databases/ 二.创建数据库的实 ...

最新文章

  1. 九度OJ #1437 To Fill or Not to Fil
  2. 多路复用与设置阻塞、非阻塞模式
  3. 亮度 调整_摄影后期必备!如何用亮度蒙版技术精准调整照片影调
  4. Codeforces Round #445 div.2 D. Restoration of string 乱搞
  5. 性能监控工具yourkit的安装及eclipse、tomcat的集成
  6. 15.Nginx 服务器的高级配置
  7. LINUX编译java3d/j3d
  8. CSS:淘宝商品展示样式
  9. 双网卡同时上内外网的解决方法
  10. 我的世界电脑锁屏.html,怎么设置电脑锁屏
  11. linux下使用C语言实现MQTT通信(三丶总结经验)
  12. 接口测试、接口协议以及常用接口测试工具介绍
  13. JAVA中的flush()方法
  14. 【附源码】计算机毕业设计JAVA支部党建工作
  15. 手机QQ视频图像是反的——解决办法
  16. 均匀分布 卡方分布_深度学习需要掌握的13个概率分布(附代码)
  17. 测试意外:DevOps测试中的右移
  18. Sybase数据库技术,数据库恢复---分享Sybase数据库知识(博客文章索引)
  19. Ecplise捕捉异常的快捷键
  20. java虚拟机多久触发垃圾回收_每日一问:讲讲 Java 虚拟机的垃圾回收

热门文章

  1. 各维度 特征 重要程度 随机森林_机器学习算法——随机森林
  2. flink 3-转换
  3. idea设置scanner = new Scanner(System.in);的实时模板
  4. redis 后台运行_第一章 1.3Linux下安装Redis
  5. anaconda 历史版本_【windows】下Anaconda详细安装过程
  6. java压缩对象_Java 对象指针压缩
  7. word公式插件_添加office小插件,让办公更高效
  8. pythonapi是什么意思_python api是什么
  9. maven多模块合并打包_Spring Boot 多模块项目实践(附打包方法)
  10. Vue中使用LayUI没有效果