android清空frame,android – GLSurfaceView onDrawFrame清除行为
我使用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清除行为相关推荐
- android 内部存储 清空,Android清空应用内部文件缓存
Android应用中加载的图片以及一些数据缓存怎么清掉呢?最近在做项目中遇到了这个问题,网上搜了一下找到了不少的源代码,综合了这些源码,下面给大家说一下吧,怎么有效的清除应用内存的缓存信息? 清除应用 ...
- android+清除循环动画,android自定义View之(4)-一键清除动画
android自定义View之(四)------一键清除动画 1.前言: 自己也是参考别人的一些自定义view例子,学习了一些基本的自定义view的方法.今天,我参考了一些资料,再结合自已的一些理解, ...
- android自定义View之(四)------一键清除动画
1.前言: 自己也是参考别人的一些自定义view例子,学习了一些基本的自定义view的方法.今天,我参考了一些资料,再结合自已的一些理解,做了一个一键清除的动画.当年,我实现这个是用了几张图片,采用F ...
- android textview清空内容,Android中使用 AutoCompleteTextView 实现手机号格式化附带清空历史的操作...
有个小伙伴遇到了这样一个问题,就是autocompletetextview实现自动填充的功能.同时要具备手机格式化的功能.下拉列表最后一行是有个清除历史的功能.可是点击"清除历史" ...
- Android简单实现搜索功能 显示清除历史搜索记录
本文主要为大家分享了Android实现搜索功能,并且可以实时显示搜索的历史记录,根据输入的内容去模糊查询,供大家参考,界面图如下. 本案例实现起来也非常的简单,所以可以直接拿来嵌入项目中使用,主要涉及 ...
- android之frame动画详解
上一篇我们说了android中的tween动画,这一篇我们说说frame动画,frame动画主要是实现了一种类似于gif动画的效果,就是多张图按预先设定好的时间依次连续显示. 新建一个android项 ...
- android camera 分辨率,Android:相机帧分辨率大于640x480(Android: camera frame resolution larger than 640x480)...
Android:相机帧分辨率大于640x480(Android: camera frame resolution larger than 640x480) 在Android中,您需要将Surface设 ...
- Android 10 恢复出厂设置和清除应用数据接口
1 .恢复出厂方式的接口 a.通过广播方式调用: Intent intent = new Intent(Intent.ACTION_FACTORY_RESET); intent.set ...
- android卸载app代码,android app卸载后不被清除的数据的一种解决方法
使用场景:APP某一种设置,不想因为清除缓存后丢失; 一.系统数据库的位置在/data/data/com.android.providers.settings/databases/ 二.创建数据库的实 ...
最新文章
- 九度OJ #1437 To Fill or Not to Fil
- 多路复用与设置阻塞、非阻塞模式
- 亮度 调整_摄影后期必备!如何用亮度蒙版技术精准调整照片影调
- Codeforces Round #445 div.2 D. Restoration of string 乱搞
- 性能监控工具yourkit的安装及eclipse、tomcat的集成
- 15.Nginx 服务器的高级配置
- LINUX编译java3d/j3d
- CSS:淘宝商品展示样式
- 双网卡同时上内外网的解决方法
- 我的世界电脑锁屏.html,怎么设置电脑锁屏
- linux下使用C语言实现MQTT通信(三丶总结经验)
- 接口测试、接口协议以及常用接口测试工具介绍
- JAVA中的flush()方法
- 【附源码】计算机毕业设计JAVA支部党建工作
- 手机QQ视频图像是反的——解决办法
- 均匀分布 卡方分布_深度学习需要掌握的13个概率分布(附代码)
- 测试意外:DevOps测试中的右移
- Sybase数据库技术,数据库恢复---分享Sybase数据库知识(博客文章索引)
- Ecplise捕捉异常的快捷键
- java虚拟机多久触发垃圾回收_每日一问:讲讲 Java 虚拟机的垃圾回收
热门文章
- 各维度 特征 重要程度 随机森林_机器学习算法——随机森林
- flink 3-转换
- idea设置scanner = new Scanner(System.in);的实时模板
- redis 后台运行_第一章 1.3Linux下安装Redis
- anaconda 历史版本_【windows】下Anaconda详细安装过程
- java压缩对象_Java 对象指针压缩
- word公式插件_添加office小插件,让办公更高效
- pythonapi是什么意思_python api是什么
- maven多模块合并打包_Spring Boot 多模块项目实践(附打包方法)
- Vue中使用LayUI没有效果