OpenGL ES入门详解

发布时间:2016-04-18 移动开发 C/C++

 http://blog.csdn.net/wangyuchun_799/article/details/7736928

1.决定你要支持的OpenGL ES的版本。目前,OpenGL ES包含1.1和2.0两个版本,iPhone 3G+和iPad开始支持OpenGL ES2.0。而且这两个版本之间的差异非常大,不仅仅在编程思想上,API之间的差距也很大。因此,如果你想使用OpenGL ES开发3D程序或游戏,那么首先就要决定使用哪个版本,还是说两个版本都支持。OpenGL ES定义了代表不同版本的宏:

                     enum
                    {
                        kEAGLRenderingAPIOpenGLES1 = 1,     //1.1版
                        kEAGLRenderingAPIOpenGLES2 = 2      //2.0版
                    }typedef NSUInteger EAGLRenderingAPI;

以iPhone代码为例,你可以通过以下方式判断用户设备所支持的OpenGL ES版本,如果支持2.0,就使用2.0进行渲染;如果仅支持1.1,则使用1.1版进行渲染:

                   EAGLRenderingAPI api = kEAGLRenderingAPIOpenGLES2;    //默认优先使用2.0版
                  m_context = [[EAGLContext alloc] initWithAPI:api];     //使用2.0版初始化EAGLContext
                  if (!m_context ) {            //使用2.0版初始化EAGLContext失败
                      api = kEAGLRenderingAPIOpenGLES1;        //将API设为1.1版
                      m_context = [[EAGLContext alloc] initWithAPI:api];//使用1.1版初始化EAGLContext
                  }
                  if (!m_context || ![EAGLContext setCurrentContext:m_context]) {     //1.1版初始化失败,则释放内存
                      [self release];
                      return nil;
                  }
                  if (api == kEAGLRenderingAPIOpenGLES1) {
                      //使用1.1版开始渲染
                  }
                  else {
                      //使用2.0版开始渲染
                  }

         2.你想让你的OpenGL ES程序跨手机平台运行么?Android、iPhone、windows phone手机系统是当前最主流的手机系统,如何才能让我们编写出来的程序可以跨平台运行呢?好消息是,这三个平台都支持OpenGL ES,而且都支持C++语言。也许你明白了,方法就是通过C++来封装OpenGL ES,尽量少用特定平台的耦合代码。这样我们就可以将封装的OpenGL ES引擎在不同的手机平台的使用,而且仅需要修改特定平台连接OpenGL ES的代码即可。

        3.入门常见代码解析

3.1创建渲染缓冲区

    GLuint m_renderbuffer;//创建一个渲染缓冲区对象

    glGenRenderbuffers(1, &m_renderbuffer);//创建一个渲染缓冲区对象
    glBindRenderbuffer(GL_RENDERBUFFER, m_renderbuffer);//将该渲染缓冲区对象绑定到管线上

3.2创建帧缓冲区

   GLuint m_framebuffer;//创建一个帧缓冲区对象

    glGenFramebuffers(1, &m_framebuffer);//创建一个帧染缓冲区对象
    glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);//将该帧染缓冲区对象绑定到管线上
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_renderbuffer);//将创建的渲染缓冲区绑定到帧缓冲区上,并使用颜色填充

3.3设置视口

glViewport(0, 0, width, height);//定义视口大小,说白了就是OpenGL ES窗口大小


3.4创建着色器

3.4.1创建一个空着色器

GLuint shaderHandle = glCreateShader(shaderType);//shaderType代表着色器的类型,可以是GL_VERTEX_SHADER(顶点着色器)或GL_FRAGMENT_SHADER(片元着色器)

3.4.2指定着色器源代码
    glShaderSource(shaderHandle, 1, &source, 0);// source代表要执行的源代码字符串数组,1表示源代码字符串数组的字符串个数是一个,0表示源代码字符串长度数组的个数为0个

3.4.3编译着色器
    glCompileShader(shaderHandle);//编译着色器

3.4.4检查编译是否成功
    GLint compileSuccess;
    glGetShaderiv(shaderHandle, GL_COMPILE_STATUS, &compileSuccess);//查看编译着色器是否成功,可选的查询状态有L_DELETE_STATUS,GL_COMPILE_STATUS, GL_INFO_LOG_LENGTH, GL_SHADER_SOURCE_LENGTH

//如果编译出错,则记录出错信息
    if (compileSuccess == GL_FALSE) {
        GLchar messages[256];
        glGetShaderInfoLog(shaderHandle, sizeof(messages), 0, &messages[0]);
        std::cout << messages;
        exit(1);
    }

3.5创建渲染源程序

3.5.1创建一个空源程序

GLuint programHandle = glCreateProgram();//创建一个渲染程序

3.5.2向源程序中添加着色器
    glAttachShader(programHandle, shaderHandle);//将着色器添加到程序中

3.5.3链接源程序
    glLinkProgram(programHandle);//你可能添加了多个着色器,链接程序

3.5.4检查链接程序是否成功
    GLint linkSuccess;
    glGetProgramiv(programHandle, GL_LINK_STATUS, &linkSuccess);//查看连接是否成功

//链接失败记录失败信息

    if (linkSuccess == GL_FALSE) {
        GLchar message[256];
        glGetProgramInfoLog(programHandle, sizeof(message), 0, &message[0]);
        std::cout << message;
        exit(1);
    }

3.6顶点结构体

//此处定义了一个代表顶点的结构体,内部包含一个有两个点(x,y)组成的顶点的位置信息,和一个四个值(r, g, b, a)表示的颜色信息

struct Vertex{
    float Position[2];
    float Color[4];
};
//创建顶点数组,里面有6个顶点信息
const Vertex vertices[] = {
    {{-0.5, -0.866}, {0.5, 1, 0.5, 1}},
    {{0.5, -0.866}, {0.2, 0.6, 0.5, 1}},
    {{0, 1}, {0.6, 0.1, 0.8, 1}},
    {{0.5, -0.866}, {0.5, 0.5, 0.5, 1}},
    {{1.5, -0.866}, {0.5, 0.5, 0.5, 1}},
    {{1, 0.4}, {0.5, 0.5, 0.5, 1}}
};

3.7着色器

3.7.1顶点着色器

#define STRINGIFY(A) #A

const char *SimpleVertexShader = STRINGIFY(
attribute vec4 Position;//位置,vec4说明有4个点组成,attribute表示属性,由程序提供输入值
attribute vec4 SourceColor;//源颜色,RGBA
varying vec4 DestinationColor;//目标颜色,输出值,用来传递到片元着色器,vary表示可变传出变量
uniform mat4 Projection;//投影矩阵,mat4表示一个4*4的矩阵,uniform表示统一的,不变的,每个顶点都是固定的这个值
uniform mat4 Modelview;//模型矩阵
void main(void){
    DestinationColor = SourceColor;//简单的将源颜色赋给目标颜色
    gl_Position = Projection * Modelview * Position;//通过矩阵乘法获得目标位置,gl_Position是OpenGL ES内定的值,必须指定
}
);

3.7.2片元着色器

const char *SimpleFragmentShader = STRINGIFY(
varying lowp vec4 DestinationColor;//由顶点着色器传入,lowp表示低精度
void main(void){
    gl_FragColor = DestinationColor;//片元颜色,gl_FragColor也是OpenGL ES内定的,必须指定
}
);

3.8开始渲染

3.8.1填充(清理)屏幕

glClearColor(0.1f, 0.9f, 0.5f, 1);//指定填充屏幕的RGBA值
glClear(GL_COLOR_BUFFER_BIT);//指定要清除哪些缓冲区,GL_COLOR_BUFFER_BIT表示颜色缓冲区,GL_DEPTH_BUFFER_BIT表示深度缓冲区,GL_STENCIL_BUFFER_BIT表示模板缓冲区

3.8.2从着色器代码中获取属性信息

    GLuint m_simpleProgram = programHandle;    

    GLuint positionSlot = glGetAttribLocation(m_simpleProgram, "Position");//从着色器源程序中的顶点着色器中获取Position属性
    GLuint colorSlot = glGetAttribLocation(m_simpleProgram, "SourceColor");//从着色器源程序中的顶点着色器中获取SourceColor属性

3.8.3开启顶点属性数组
    glEnableVertexAttribArray(positionSlot);
    glEnableVertexAttribArray(colorSlot);

3.8.4为着色器属性赋值
    GLsizei stride = sizeof(Vertex);//单个顶点的数据长度
    const GLvoid *pCoords = &vertices[0].Position[0];//顶点数组中的位置数组首地址
    const GLvoid *pColors = &vertices[0].Color[0];/顶点数组中的颜色数组首地址
    glVertexAttribPointer(positionSlot, 2, GL_FLOAT, GL_FALSE, stride, pCoords);//为顶点着色器位置信息赋值,positionSlot表示顶点着色器位置属性(即,Position);2表示每一个顶点信息由几个值组成,这个值必须位1,2,3或4;GL_FLOAT表示顶点信息的数据类型;GL_FALSE表示不要将数据类型标准化(即fixed-point);stride表示数组中每个元素的长度;pCoords表示数组的首地址
    glVertexAttribPointer(colorSlot, 4, GL_FLOAT, GL_FALSE, stride, pColors);//同上

3.8.5渲染顶点
    GLsizei vertexCount = sizeof(vertices)/sizeof(Vertex);//顶点个数
    glDrawArrays(GL_TRIANGLES, 0, vertexCount);//将顶点数组使用三角形渲染,GL_TRIANGLES表示三角形, 0表示数组第一个值的位置,vertexCount表示数组长度

3.8.6渲染完毕,关闭顶点属性数组
    glDisableVertexAttribArray(positionSlot);
    glDisableVertexAttribArray(colorSlot);

4.OpenGL 1.1和2.0在编程上的区别

4.1函数命名上的区别

1.1版API函数和宏末尾通常都为加上OES(即OpenglES的缩写),2.0版本基本上都把这个后缀名给去掉了,如:

1.1API函数和宏:glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_renderbuffer);

2.0API函数和宏:glBindRenderbuffer(GL_RENDERBUFFER, m_renderbuffer);

4.2渲染方式不同

1.1版是基于不可编程管线,2.0版是基于可编程管线的,明显的差别是1.1不支持着色器而2.0支持着色器,如下:

在1.1版将顶点渲染到屏幕上一般这样写:

    glMatrixMode(GL_PROJECTION);
    const float maxX = 2;
    const float maxY = 3;
    glOrthof(-maxX, maxX, -maxY, maxY, -1, 1);
    glMatrixMode(GL_MODELVIEW);

2.0版支持着色器,就不再这么渲染顶点了。将顶点属性和变换方式全部放在顶点着色器和片元着色器中,然后程序中通过着色器来渲染

4.3编写同样的程序API不同

如,同样是激活和关闭顶点数组,在1.1中是glEnableClientState(GL_VERTEX_ARRAY);和glDisableClientState(GL_VERTEX_ARRAY);

但在2.0中,就变成了:glEnableVertexAttribArray(*);和glDisableVertexAttribArray(*);

差别的来源就在于1.1不使用着色器,而2.0使用着色器。

4.4编程难易程度不同。

1.1是基于不可编程管线的,因此,管线的各个组件都是写好的,我们仅需要调用即可。而2.0是基于可编程管线的,灵活性大大增加了,但是编写的难度和复杂度也增加了,因为什么功能都得自己写了。

5.着色器的使用流程

刚开始学习OpenGL ES2.0,对其着色器十分不感冒,什么是着色器,着色器该怎么使用,着色器包含哪些内容呢?

着色器就是一段包含着色信息的源代码字符串。通常着色器分为顶点着色器(Vertex Shader)和片元着色器(Fragment Shader),两个着色器分别写在不同的文件中,文件没有固定的后缀名,可以根据你自己的爱好写,但是最好能区别文件中写的是顶点着色器还是片元着色器,不然时间长了自己都不知道哪个文件中写的是什么信息了。如你可以给你的顶点着色器后缀名命名为:vert, ver, v, vsh等,给你的片元着色器后缀名命名为:frag, fra, f, fsh等。

着色器源代码和OpenGL源代码不是一起编译的,所以要特别强调我刚才说的“着色器是一段包含着色信息的源代码字符串”。所以,OpenGL源代码肯定是和工程一起编译的,但是着色器源代码是在运行期编译的。你可能会问,着色器的源代码是一个字符串怎么编译呢?所以OpenGL ES提供了一套运行期动态编译的流程:

(1)创建着色器:glCreateShader

(2)指定着色器源代码字符串:glShaderSource

(3)编译着色器:glCompileShader

(4)创建着色器可执行程序:glCompileShader

(5)向可执行程序中添加着色器:glAttachShader

(6)链接可执行程序:glLinkProgram

转载于:https://www.cnblogs.com/nafio/p/9137368.html

更多相关推荐


十佳移动应用程序测试框架

发布时间:2015-10-04 移动开发 RUBY PYTHON
2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt;如今,智能手机已经迎来了一个新的时代——移动应用程序开发。如今,移动应用程序能够帮助大家简化很多日常事务。使用移动应用程序,您能在线支付账单、在线观看视频以及玩游戏等等,那么是什么让这些应用程序在智能手机上的运行变得非常完美呢?那就是测试!那么,什么是测试?测试是移动应用程序开发过程中至关重要的部分。它涉及到审查应用程序的几个...

LeanCloud SDK 中秒杀70%问题的调试方法

发布时间:2017-05-04 移动开发 JSON
非常多同学在LeanCloud上遇到的不少问题,事实上能够自我解决的,如今介绍一下LeanCloud上的调试方法。LeanCloud是通过RESTAPI来进行前后端分离的。这意味着当出现故障的时候,首先应该看看网络请求是什么,来确定是client发出的请求不正确,还是服务端处理请求不正确。LeanCloud上有专门的RESTAPI文档。概要  通过调用同意打印日志的函数。来打印很多其它的日志。包含...

[转] 漫谈NodeJS

发布时间:2011-07-04 C/C++ 网络 JAVASCRIPT VIEWUI
作者:zhangxin来源:http://blog.csdn.net/zhangxin09/article/details/5836777学习NodeJS第一天:node.js引言Node.JS是资深C程序员RyanDahl(http://four.livejournal.com/)的作品,依据Google著名的开源JavaScript引擎V8来进行二次开发的WebI/O服务器(http://no...

《Java程序员,上班那点事儿》荣登西单图书大厦销售榜第2名,立贴纪念!

发布时间:2009-08-07 C/C++ JAVA
《Java程序员,上班那点事儿》荣登北京新华书店销售榜第2名,立贴纪念! 今天得到消息,《Java程序员,上班那点事儿》荣登北京新华书店销售榜第二名! 包括四个书店的统计指标: 北发图书网、西单图书大厦、王府井书店、中关村图书大厦 链接如下:http://www.xhsd.com.cn/books/views.asp?PLUCODE=730220514   著名的谭浩强的《C语言程序设计》,据说一...

ImageButton按压效果失效

发布时间:2014-06-27 移动开发
LinearLayout中ImageButton的按压效果不起作用,如图布局如下:&lt;LinearLayout  android:id="@id/ll_add_reply_face"  android:layout_width="0dp"  android:layout_height="wrap_content"  android:layout_gravity="center_vertical...

(高考作文题)期待成长——说说Android应用市场(2011年6月)

发布时间:2011-06-22 移动开发 UI
为什么80%的码农都做不了架构师?&gt;&gt;&gt;  (高考作文题)期待成长——说说Android应用市场(2011年6月) 进入Android这行当时间很短,也没啥业绩,但多少也有点心得总结,愿拿出来与诸位分享、探讨(所提及数据仅为个人的,并不代表全部,仅供参考,请勿人肉)。 应用市场在Android产业中扮演着非常重要的角色,对于应用开发者来说,尤其是中小开发者,因为没有太多的时间、精...

Android源码——AsynTask

发布时间:2016-08-03 移动开发
AsyncTask&lt;Params,Progress,Result&gt;中三个参数为:Params    输入数据Progress   过程数据Result     结果数据 工作队列LinkedlockingQueue的特性     线程从空的LinkedlockingQueue中取任务执行,线程会被阻塞;     线程向一个满的LinkedlockingQueue中添加任务,同样会被阻塞...

Android EditText小结

发布时间:2015-07-27 移动开发
防止EditText获取焦点弹出输入法android:focusable="true"  android:focusableInTouchMode="true"EditText不可编辑,获取点击事件android:editable="false"et.setOnTouchListener(newView.OnTouchListener(){@OverridepublicbooleanonTouch...

Android EditText 应用小小结

发布时间:2011-11-19 移动开发 JAVA
最近开始学习Android,看书的时候觉得还可以,没事没事的,好像都懂,但是真正动起手来却是另外一回事。现在只拿EditText来说,看了半天的文档才知道它的一些用法。我想获取当前控件的字符串,一开始发现它有一个toString()方法,就用了,结果发现返回的是一个乱七八糟大字符串,什么ID之类大,这时才知道理解错了,就去看文档,没有发现直接获取字符串的方法(不知道有没有),但是发现了一个getT...

android4.4(kitkat),如何让APP可以直接写入SMS短信

发布时间:2016-09-14 移动开发 JAVA PYTHON
2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt;以下代码的修改是针对android平台研发的,另外如果没有系统源码的情况下,通过逆向修改ROM中的对应文件,也是可以做到的。之所以有这样需求,是因为假如是你自己的ROM,需要对自己的某个APP授予SMS写入权限,可以通过修改如下代码中的OTHERSMS_PACKAGE_NAME,换成你自己APP的packagename就可以了...

C语言extern引用AT&T汇编中的变量,任意转换类型

发布时间:2015-04-18 C/C++
今天研究出了一个小问题,在C语言里引用汇编的变量,会是什么结果,汇编中的变量没有像C语言中int类型那样的类型约束,可以把数据当作任何类型处理,那么传到C语言中我们应该当作什么类型处理呢。换句话说,在汇编里定义变量var,在C语言里引用,我们肯定要用extern声明var外部变量,那么extern后面接什么类型?难道是externintvar么?还是 externshortvar实例:注意:混合编...

Fiddler捕获抓取 App端数据包

发布时间:2017-01-08 移动开发
最近项目设计到App抓包,所以采用Fiddler工具来采集获取APP数据包,但是fiddler对有些app是无法捕获到数据包的,以下是我的处理方法:1.我默认代理端口使用的是自定义的端口而不是默认的8888端口;2.手机端安装Fiddler证书,电脑端关闭防火墙对我采集的app来说亲测有效能获取到数据包,记录一下操作过程:  以下是我对安卓App进行抓取的步骤:1. Fiddler下载地址(htt...

js与objective-c的交互-备

发布时间:2016-04-18 移动开发 JAVASCRIPT VIEWUI 操作系统
在写JavaScript的时候,可以使用一个叫做window的对象,像是我们想要从现在的网页跳到另外一个网页的时候,就会去修改window.location.href的位置;在我们的Objective-C程序码中,如果我们可以取得指定的WebView的指标,也就可以拿到这个出现在JavaScript中的window对象,也就是[webViewwindowScriptObject]。 这个对象就是W...

2021苹果官方iCloud迁移照片到Google Photo教程

目前苹果官方推出了iCloud迁移到GooglePhoto的功能,此功能可让用户将iCloud云端照片转移备份到Google相册。目前只有美国、加拿大、澳大利亚、冰岛、列支敦士登、新西兰、挪威和瑞士8个国家和地区的AppleID才支持此功能。一、确保你的AppleID是以上几个区中的;二、打开下方链接并登录。https://privacy.apple.com/三、如果你的AppleID符合条件,点...

android 弹出一个在桌面上出现的window

发布时间:2015-06-06 移动开发
最近发现,如果我在ActivityA的Handler里面写了消息处理事件,然后从ActivityA跳转到界面B之后,A的handler还在继续处理消息,我的项目中,用户进入到房间界面了,开始接收消息,然后他也可以跳转到设置界面去进行一些房间设置,假如这个时候用户被强制T出去了,不管他在哪个界面,都需要弹出对话框显示用户被踢出,之前用的普通的Dialog,然后只有房间界面显示出来的时候才会看到被踢出...

重新创建一个Activity(翻译)

发布时间:2015-09-20 移动开发
重新创建一个Activity这里有些场景,你的Activity因为普通的app行为被销毁了,比如当用点击返回按钮时或者你的Activity通过调用finish()方法通知自己被销毁了。系统也会销毁你的Activity,如果它当前被停止并且有较长时间没有被使用了,或者前台运行的Activity需要更多的系统资源导致系统必须关闭后台进程来恢复内存。当你的Activity是因为用户点击了返回按钮或者是A...

[Android Training视频系列]2.4 Recreating an Activity

发布时间:2012-12-18 移动开发 RUNTIME
[AndroidTraining视频系列]2.4RecreatinganActivity1.主要内容本讲讲解onSaveInstanceState与onRestoreInstanceState的使用。2.视频讲解http://www.eyeandroid.com/thread-11391-1-1.html3.翻译参考存在一些情况,由于普通的程序行为,你的activity会被销毁,比如,当用户点击B...

跟我一起写 Makefile——1.11 隐含规则

发布时间:2013-03-08 C/C++ 操作系统
隐含规则————  在我们使用Makefile时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C++的源程序为中间目标文件(Unix下是[.o]文件,Windows下是[.obj]文件)。本章讲述的就是一些在Makefile中的“隐含的”,早先约定了的,不需要我们再写出来的规则。  “隐含规则”也就是一种惯例,make会按照这种“惯例”心照不喧地来运行,那怕我们的Makefi...

Android Material Design:基于CoordinatorLayout实现向上滚动导航条ToolBar滚出、向下滚动导航条滚出...

发布时间:2015-10-03 移动开发 JAVA
AndroidMaterialDesign:基于CoordinatorLayout实现向上滚动导航条ToolBar滚出、向下滚动导航条滚出要实现的效果:一个导航条和一个ToolBar,初始状态:手指在屏幕向上滑动时候的效果,ToolBar滚出:当手指在屏幕向下滑动时候,ToolBar又滚出:实现上述效果要使用AndroidMaterialDesign引入的CoordinatorLayout。关...

Android animation学习笔记之propery animation

发布时间:2013-05-07 移动开发 ANDRIOD
   以前写博客都是用百度空间,总感觉不专业,访问量少,好友少,里边可运用的资源也少,所以昨天网上查了一下,觉得iteye社区还不错,就申请了一个iteye帐号,今天开始写博,希望大家多关注多交流,共同进步.    最近一直在做中国最强音app的开发,好不容易闲了下来,觉得在做中国最强音app的时候动画方面的知识还不够扎实,所以这周腾出手来主要学习了animation和graphics方面的知识,...

四、Android性能优化之性能优化工具

发布时间:2018-01-18 移动开发 C/C++ JAVA
性能优化的帮助工具:MAT,MemoryMonitor(属于AndroidMonitor中一个模块),HeapTool(查看堆信息),AllactionTracking,LeakCanaryLint工具1.AllactionTracking(1)追踪在内存图中点击途中箭头的部分,启动追踪,再次点击就是停止追踪,随后自动生成一个alloc结尾的文件,这个文件就记录了这次追踪到的所有数据,然后会在右上...

Android基础-EditText键盘的显示与隐藏

发布时间:2015-12-01 移动开发
场景一、点击EditText之外的空白区域隐藏键盘:howtohidesoftkeyboardonandroidafterclickingoutsideEditText?首先定义一个关闭键盘的方法:/***关闭软键盘*/publicstaticvoidcloseSoftKeyboard(Contextcontext){InputMethodManagerinputMethodManager=(In...

Android零基础入门第9节:Android应用实战,不懂代码也可以开发

发布时间:2017-08-12 移动开发 JAVA 开发工具
原文:Android零基础入门第9节:Android应用实战,不懂代码也可以开发通过上一期的学习,我们成功开发了Android学习的第一个应用程序,不仅可以在Android模拟器上运行,同时还能在我们的Android手机上运行,是不是很有成就感。接下来我们来开发更加复杂的Android应用程序,并逐步踏入Android开发真正的学习成长之路。 一、继续Android应用程序开发大家还记得我们上一期...

Google透露Android Market恶意程序扫描服务

发布时间:2012-02-04 移动开发
Google工程师透露了一个基于云的AndroidMarket恶意应用扫描服务。该服务代号Bouncer,可自动扫描AndroidMarket中的所有应用,核对与已知恶意程序、木马和间谍软件相匹配的数字签名,模拟程序运行,检查该应用是否存在滥用行为。扫描将会在开发商首次上传Market应用后立即开始,并在之后定期执行。在频频发现恶意应用之后,指责Google未能加强AndroidMarket安全的...

团队转型之痛之悟

发布时间:2017-12-12 移动开发 JAVA UI
1、为什么转型?之前一篇文章详细介绍了转型《回到交友8个月来的测试团队转型实践》其中有几个关键点:从手工型团队向技术全栈型团队转型促成团队成员具备android、iOS、Java代码基础知识,要求基本的编程能力;转型前我跟管理层沟通:要么转型,提高生产力,会有成功的脱颖而出,该奖励就奖励,也会有淘汰的;要么继续平庸,过过日子,也别搞啥全程测试了;如果你是leader,会怎么选择呢?2、为什么团队痛...

Android BroadcastReceiver 注册和反注册

发布时间:2017-11-09 移动开发
说起来这个问题很简单,只要注册和反注册成对出现就行,好像很多教材都是如此介绍。但实际开发中,对广播注册和反注册的时机把握还是很重要的。关于广BroadcastReceiver注册和反注册时机,主要有以下几点:onCreate-onDestroy(即便页面未显示,仍然能接受广播)onResume-onPause(即只有页面显示时,才能接受广播)onStart-onStophttp://stackov...

《OpenGL ES应用开发实践指南:Android卷》—— 3.6 小结

发布时间:2017-07-03 移动开发
本节书摘来自华章出版社《OpenGLES应用开发实践指南:Android卷》一书中的第3章,第3.6节,作者:(美)KevinBrothaler,更多章节内容可以访问云栖社区“华章计算机”公众号查看。3.6 小结在最后把第一个版本的空气曲棍球桌子显示之前,我们不得不撰写了很多样例代码,好消息是,我们可以在后面的项目中重用这些代码。让我们花点儿时间回顾一下本章学过的内容:如何创建和编译着色器。顶点着...

《Android 应用测试指南》——第2章,第2.4节包浏览器

发布时间:2017-05-02 移动开发 测试
本节书摘来自异步社区《Android应用测试指南》一书中的第2章,第2.4节包浏览器,作者【阿根廷】DiegoTorresMilano(迭戈D.),更多章节内容可以访问云栖社区“异步社区”公众号查看2.4 包浏览器创建完前面提到的两个项目之后,我们打开包浏览器(Packageexplorer),就会看到像图2.3一样的界面。我们注意到这里存在两个相关的项目,每个项目都有自己独立的组件和项目属性。图...

《Android智能穿戴设备开发指南》——第6章,第6.1节Socket编程基础

发布时间:2017-05-02 移动开发 网络 JAVA
本节书摘来自异步社区《Android智能穿戴设备开发指南》一书中的第6章,第6.1节Socket编程基础,作者王长青,更多章节内容可以访问云栖社区“异步社区”公众号查看6.1Socket编程基础Android智能穿戴设备开发指南网络编程中有两个主要问题,一个是如何准确地定位网络中的一台或多台主机,另一个就是找到主机后如何可靠、高效地进行数据传输。在TCP/IP协议中IP层主要负责网络主机的定位,数...

《Android 应用测试指南》——第2章,第2.8节其他命令行选择

发布时间:2017-05-02 移动开发
本节书摘来自异步社区《Android应用测试指南》一书中的第2章,第2.8节其他命令行选择,作者【阿根廷】DiegoTorresMilano(迭戈D.),更多章节内容可以访问云栖社区“异步社区”公众号查看2.8 其他命令行选择之前已经提到了,aminstrument命令中接收输入&lt;名称,值&gt;的键值对,含义如表2.11中所示。表2.11 aminstrument命令的其他选项...

《Android 应用测试指南》——第2章,第2.2节创建一个Android主项目

发布时间:2017-05-02 移动开发 开发工具
本节书摘来自异步社区《Android应用测试指南》一书中的第2章,第2.2节创建一个Android主项目,作者【阿根廷】DiegoTorresMilano(迭戈D.),更多章节内容可以访问云栖社区“异步社区”公众号查看2.2 创建一个Android主项目我们先创建一个新的Android项目。在Eclipse里面单击菜单栏File-new-Project-Andriod-AndriodProject...

《Android 应用测试指南》——第2章,第2.3节创建一个Android测试项目

发布时间:2017-05-02 移动开发
本节书摘来自异步社区《Android应用测试指南》一书中的第2章,第2.3节创建一个Android测试项目,作者【阿根廷】DiegoTorresMilano(迭戈D.),更多章节内容可以访问云栖社区“异步社区”公众号查看2.3 创建一个Android测试项目单击图2.1中Next按钮,会进入创建Android测试项目的对话框界面。注意这里将会有一些值是继承主项目的,设置值或者是跟主项目对应。另外一...

《Java和Android开发学习指南(第2版)》——第2章,第2.2节分隔符

发布时间:2017-05-02 移动开发 JAVA
本节书摘来自异步社区《Java和Android开发学习指南(第2版)》一书中的第2章,第2.2节分隔符,作者【加】BudiKurniawan,更多章节内容可以访问云栖社区“异步社区”公众号查看2.2 分隔符Java使用某些字符作为分隔符。这些特殊的字符见表2.1。熟悉这些符号和名称很重要,但是,如果你现在还不理解“说明”栏中的术语,也不要担心。...

《Java和Android开发学习指南(第2版)》——第2章,第2.9节注释

发布时间:2017-05-02 移动开发 JAVA 数据库
本节书摘来自异步社区《Java和Android开发学习指南(第2版)》一书中的第2章,第2.9节注释,作者【加】BudiKurniawan,更多章节内容可以访问云栖社区“异步社区”公众号查看2.9 注释在整个代码中编写注释,充分地说明一个类提供了什么函数,一个方法做些什么,一个字段包含什么等,这是一种好的做法。在Java中,有两种类型的注释,它们都和C和C++中的注释有类似的语法。传统注释。传统的...

《Java和Android开发学习指南(第2版)》——第2章,第2.4节变量

发布时间:2017-05-02 移动开发 JAVA
本节书摘来自异步社区《Java和Android开发学习指南(第2版)》一书中的第2章,第2.4节变量,作者【加】BudiKurniawan,更多章节内容可以访问云栖社区“异步社区”公众号查看2.4 变量变量是数据占位符。Java是一种强类型的语言,因此,每个变量必须有一个声明的类型。Java中有两种数据类型:引用类型一个引用类型的变量,提供对一个对象的引用。基本类型一个基本类型的变量,保存一个基本...

《Java和Android开发学习指南(第2版)》—— 1.4 集成开发环境

发布时间:2017-05-02 移动开发 JAVA 开发工具
本节书摘来异步社区《Java和Android开发学习指南(第2版)》一书中的第1章,第1.4节,作者:【加】BudiKurniawan,更多章节内容可以访问云栖社区“异步社区”公众号查看。1.4 集成开发环境你可以使用一个文本编辑器来编写Java程序。然而,使用集成开发环境(IntegratedDevelopmentEnvironment,IDE)将会更有帮助。IDE不仅会检查代码的语法错误,还可...

《Java和Android开发学习指南(第2版)》—— 2.3 基本类型

发布时间:2017-05-02 移动开发 JAVA
本节书摘来异步社区《Java和Android开发学习指南(第2版)》一书中的第2章,第2.3节,作者:【加】BudiKurniawan,更多章节内容可以访问云栖社区“异步社区”公众号查看。2.3 基本类型当我们编写一个面向对象应用程序的时候,就会创建和现实世界相似的对象模型。例如,一个工资支付应用程序有Employee对象、Tax对象、Company对象等。然而,在Java中,对象并非唯一的数据类...

《Java和Android开发学习指南(第2版)》—— 1.2 第一个Java程序

发布时间:2017-05-02 移动开发 JAVA
本节书摘来异步社区《Java和Android开发学习指南(第2版)》一书中的第1章,第1.2节,作者:【加】BudiKurniawan,更多章节内容可以访问云栖社区“异步社区”公众号查看。1.2 第一个Java程序本小节将强调Java开发中的步骤,即编写程序,将其编译为字节码以及运行字节码。1.2.1 编写Java程序可以使用任何文本编辑器来编写Java程序。打开一个文本编辑器,并且输入代码清单1...

【翻译】Ext JS 4之HelloWorld

发布时间:2012-06-23 移动开发 测试 JAVASCRIPT VIEWUI
原文:http://www.sencha.com/blog/helloworld-with-ext-js-4/本教程将帮助你学习使用SenchaExtJS4。在文章最后附有完整的源代码和3个高清视频。开始之前使用本教程,需要为Sencha配置开发环境,包括一个浏览器、Web服务器和文本编辑工具(或代码IDE)。我使用的是Chrome浏览器、Mac的Web服务器和komodo编辑器。在Sencha的...

Unity3D性能优化总结

发布时间:2017-02-06 移动开发 游戏
一、程序方面  01、务必删除脚本中为空或不需要的默认方法;  02、只在一个脚本中使用OnGUI方法;  03、避免在OnGUI中对变量、方法进行更新、赋值,输出变量建议在Update内;  04、同一脚本中频繁使用的变量建议声明其为全局变量,脚本之间频繁调用的变量或方法建议声明为全局静态变量或方法;  05、不要去频繁获取组件,将其声明为全局变量;  06、数组、集合类元素优先使用Array,...

Delphi之DLL知识学习4---创建DLL

发布时间:2015-04-24 C/C++
  下面是在Delphi中创建一个DLL的全过程,你将看到怎样创建一个接口单元,使之可以被其他的应用程序访问。并且将学会怎么把Delphi的窗体加入DLL中。  一、数美分:一个简单的DLL  下面是包含一个例程的DLL例子。该例程是将以美分计算的货币换算成五分镍币、一角硬币的数目。1.一个简单的DLL  该DLL中包含PenniesToCoins()函数,下面完整的显示了该DLL项目文件代码li...

(转)C#学习入门基础

发布时间:2008-08-14 C/C++ JAVA C#
1         基本语法的学习与法学习主要包含了以下几个方面:(1)      基本的数据类型;(2)      字符串;(3)      控制语句;(4)      c#特殊的关键字;(5)      异常处理机制;1.1        基本的数据类型比较特殊的几个类型有:decimal;非齐整数组;定义常量的方式:(1)常量publicconstdoublegravitationalCon...

QPainter绘制图片填充方式(正常大小、剪切大小、自适应大小、平铺)

发布时间:2019-07-22 C/C++
Qt中QPainter提供了绘制图像的API,极大地方便了我们对图像的绘制。Qt中提供了QPixmap,QBitmap,QBitMapQImage,QPicture等图像绘图设备,它们的类关系如下图所示:QPixmap继承了QPaintDevice,您可用以建立QPainter并于上进行绘图,您也可以直接指定图案加载Qt所支持的图档,像是BMP、GIF、JPG、JPEG、PNG等,并使用QPain...

【新发现】不用苹果开发账号就能申请ios证书真机调试

发布时间:2019-04-12 移动开发 游戏 XCODE
虽然xcode现在可以免证书进行测试了,但众多跨平台开发者,如果还没注册苹果开发者账号。想安装到自己非越狱手机测试是无能为力了。 不过新技术来了,只需要普通免费的苹果账号无需付费成为开发者就可以申请iOS证书打包ipa安装到自己手机测试,强大吧! 当然如果要上架AppStore还是需要注册一个付费的苹果开发者账号。 如果只是安装ios应用到自己手机测试,现在只需要注册一个普通的苹果账号就行了。下面...

RP值

发布时间:2011-11-29 C/C++
前段时间,有看到小白问一个问题,大概就是这样while(big.size()&gt;sml.size()+1)           //ACwhile(big.size()-sml.size()&gt;1)           //WA如果判断写成第一种就能AC,写成第二种就WA了,为什么呢?然后,昨晚有遇到这样一种情况,小蒙有一段代码一直WA,我改了下AC了,其中a,b,c都是int型,如下。i...

android4.2音频管理技术

发布时间:2013-04-20 移动开发 ANDROID软件开发 技术人生
如果你的应用程序中有播放音频的功能,一定要让你的用户能够对它进行有效的控制。为了是用户有更好的体验,你的应用程序应该确保多个应用不能同时播放音频(这个可以根据不同的应用进行单独考虑)。通过本篇文章,你将实现播放按钮播放音频的功能,响应系统或应用程序的调用。实现下面的功能:1.实现音频的音量控制和重播。2.控制当前播放的音频和其他应用音频播放的顺序关系。3.控制音频播放输出的硬件。包括音频播放方式和...

【个人重点】开发中应该重视的几点

发布时间:2016-11-01 移动开发 运维 人工智能
个人总结URL统一管理,调用统一方法,并且URL必须返回全路径,可以封装成service,并且url是全路径(包含域名),以后更改都非常方便了静态资源加版本好,调用统一方法用户密码必须加salt,最好记录在数据库中,每个用户都有不同的salt静态资源版本号,每次上线需要版本号不一样了对于数据量很大的查询,时刻记得要释放内存详见phpexcel内存溢出优化手机API必须指定版本号,例如/v1/use...

玩转Android Camera开发(三):国内首发---使用GLSurfaceView预览Camera 基础拍照demo

发布时间:2017-06-15 移动开发 JAVA UI
GLSurfaceView是OpenGL中的一个类,也是能够预览Camera的,并且在预览Camera上有其独到之处。独到之处在哪?当使用Surfaceview无能为力、痛不欲生时就仅仅有使用GLSurfaceView了。它能够真正做到让Camera的数据和显示分离,所以搞明确了这个,像Camera仅仅开预览不显示这都是小菜,妥妥的。Android4.0的自带Camera源代码是用SurfaceV...

深入Android渲染机制

发布时间:2017-11-16 移动开发 UI 嵌入式
1.知识储备CPU:中央处理器,它集成了运算,缓冲,控制等单元,包括绘图功能.CPU将对象处理为多维图形,纹理(Bitmaps、Drawables等都是一起打包到统一的纹理).GPU:一个类似于CPU的专门用来处理Graphics的处理器,作用用来帮助加快格栅化操作,当然,也有相应的缓存数据(例如缓存已经光栅化过的bitmap等)机制。OpenGLES是手持嵌入式设备的3DAPI,跨平台的、功能完...