自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(37)
  • 资源 (5)
  • 收藏
  • 关注

原创 OpenGL系列(六)摄像机

在开发过程中,首先要确定射线机的类型,以确定是创建OrthographicCamera对象还是PerspectiveCamera对象,摄像机对象创建好以后,一般不会修改投影矩阵,但是经过修改摄像机的观察角度,通过对Camera的mPosition、mRight和mUp可以改变观察的角度。观察矩阵和投影矩阵主要针对观察者而已,这两个变换决定了观察者以怎样的视角观察世界,可以把观察者比作一台摄像机,摄像机拍摄景象的角度由观察矩阵和投影矩阵决定。类定义完后,接下来实现返回观察矩阵和投影矩阵。

2024-06-28 22:31:17 1355

原创 Android开发系列(十二)Jetpack Compose之BottomSheet

BottomSheet 是 Android 中一个常用的 UI 组件,它通常用于显示从屏幕底部弹出的用户界面。Jetpack Compose 中也有一个名为 BottomSheet 的组件,它可以用来实现类似的功能。当点击按钮改变showBottomSheet为true是,这是才执行ModalBottomSheet开始底部弹窗,当用户用手向上滑动时,弹框会向上伸张,当用手向下滑动时,弹框会慢慢消失。BottomSheet 是一个可滚动的面板,可以从屏幕底部弹出,显示额外的内容。执行效果如下图所示。

2024-06-27 23:16:11 333

原创 Android开发系列(十一)Jetpack Compose之Dialog

AlertDialog使用内置的布局,) {Card() {Column() {Image(Text(text = "带按钮和图片的弹框",Row() {showDialog},) {Text("取消")showDialog},) {Text("确认")运行效果如下图所示在本例中,Dialog的子控件是一个Card控件,Card控件的子控件为Column,Column的子控件有Image、Text、和Row,Row的子空间是2给TextButton。

2024-06-27 23:16:05 392

原创 Android开发系列(十)Jetpack Compose之Card

从这里可以看到,Card其实就是一个容器,只不过这个容器可以设置特定的外观,主要是上面提到的elevation、shape、color、padding。Card是一种常用的UI组件,用于显示一个具有卡片样式的容器。使用Jetpack Compose的Card组件可以让您轻松地创建具有卡片样式的UI元素,并为其添加交互性和样式。使用Card组件,您可以轻松地创建带有卡片效果的UI元素。shape(形状):Card组件支持自定义形状,您可以通过指定一个Shape对象来改变卡片的形状。

2024-06-25 23:14:58 478

原创 Android开发系列(九)Jetpack Compose之ConstraintLayout

使用ConstraintLayout,您可以通过定义视图之间的约束关系来指定它们的位置。在解耦的实现中,通过layoutId指定某个视图的id,在约束实现中,通过createRefFor为某个id创建索引,有了索引,即可对视图建立约束关系。它通过将子视图限制在给定的约束条件下来定位和排列视图。在上面的例子中,可以看到约束条件与组件耦合在一起,这样不容易让这个约束重复利用,其实可以把这些约束代码解耦出来,示例如下。Text被Button约束,显示在Button的下面,并且离Button有16dp的距离。

2024-06-25 23:14:34 412

原创 Android开发系列(八)Jetpack Compose之LazyColumn

通过使用LazyColumn的onScroll事件和加载更多数据的逻辑,可以实现无限滚动的效果。自动测量:LazyColumn会自动计算和测量列表项的大小,因此您不需要手动指定列表项的大小。一开始只显示8个item,当往下滑动时,才会创建可见的item,同时销毁不可见的item,对于有大量数据的列表,不用一下子创建大量的对象,从而有效利用内存。这种惰性加载的机制可以提高性能,并且适用于非常大的列表。与LazyColumn类似的是LazyRow,它们的区别是方向不一样,前者是垂直方向,后者是横向。

2024-06-24 23:52:25 454

原创 Android开发系列(七)Jetpack Compose之Column

Column是一个用于垂直布局的组件。它允许您将其他Compose组件按垂直顺序排列,并根据需要自动调整它们的大小。使用Column,您可以在一个垂直线性布局中放置多个子组件。例如,您可以在Column中添加文字、按钮、图像等,它们将按添加的顺序垂直排列。

2024-06-24 23:52:01 591

原创 Android开发系列(六)Jetpack Compose之Box

BoxWithConstraints 是 Jetpack Compose 中的一个组件,用于根据父容器的尺寸限制来调整自身的尺寸和布局。父Box的大小为整个屏幕的大小,子Box是一个正方向,边长为100dp。由于最大高度为180,长方形高度为100,180 < 100 *2,因此走第1个分支,只显示1个Box。由于最大高度为220,长方形高度为100,220 > 100 *2,因此走第2个分支,显示2个Box。Box可以设置子控件的对齐方式,子控件也可以设置它在Box中的对齐方式,如下所示。

2024-06-21 22:21:36 659

原创 Android开发系列(五)Jetpack Compose之Icon & Image

Icon是用于在界面上显示矢量图标的组件。它提供了很多内置的矢量图标,也支持自定义图标。要使用Icon组件,可以通过指定图标资源的名称或引用来创建一个Icon对象。例如,使用Icons.Default.Home来创建一个默认风格的首页图标。可以通过设置图标的大小、颜色、和点击事件等属性来自定义Icon的外观和行为。Image是用于在界面上显示位图图像的组件。它支持从本地资源、网络URL或图像字节数组加载图像。要使用Image组件,可以通过指定图像资源的路径或源来创建一个Image对象。

2024-06-21 22:21:32 989

原创 Android开发系列(四)Jetpack Compose之Button

在Jetpack Compose中,Button是一个常用的用户界面组件,用于执行某些操作或触发某些事件。Button控件是可触摸的,并且通常会显示一个文本或图标来表示其功能。要在Jetpack Compose中创建一个Button,可以使用Button()函数,并通过参数指定按钮的文本、图标以及点击事件。Button的函数声明如下。下面通过简单的示例说明Button的使用方法。

2024-06-18 22:48:20 536

原创 Android开发系列(三)Jetpack Compose 之TextField

KeyboardOptions的imeAction可以自定义Enter键图标,如下所示。这里定义为Search,输入法显示的是一个查询的图标。3)自定义输入法的类型KeyboardOptions的keyboardType可以定义输入法类型。这里把Number数值给keyboardType,表示只输入数字,因此输入法只显示数据按键。在该示例中还有其它参数,这里简单介绍一些。placeholder:占位符,当输入框没有内容会显示占位符。leadingIcon: 头部图标。

2024-06-18 22:48:00 730

原创 Android开发系列(二)Jetpack Compose 之Text控件

Jetpack Compose是一种全新的声明式UI框架,用于构建Android应用程序。Jetpack Compose Text控件是Compose中用于显示文本的基本UI组件。Text是一个可组合函数,函数声明如下所示。下面通过示例说明Text的使用方法。

2024-06-17 10:01:52 780

原创 OpenGL系列(六)变换

在和示例中,顶点使用的是归一化设备坐标,在该坐标系下,顶点的每个轴的取值为-1到1,超出范围的顶点不可见。基于归一化设备坐标的物体的形状随着设备的大小变换而变化,这里产生的第一个问题是,本来要画一个正方形,顶点为(-0.5,0.5)、(0.5,0.5)(0.5,-0.5)(-0.5,-0.5),由于显示设备的宽与高不一致,结果显示出来的是一个长方形。即使针对某个设备定义好了一组顶点,显示出来刚好是正方形,可以在不一样尺寸显示的却是长方形。

2024-06-17 09:10:21 1050

原创 OpenGL系列(五)纹理贴图

OpenGL纹理是一种在三维图形中应用纹理映射的技术。纹理是一张图像,可以应用到三维模型的表面上,从而使得模型看起来更加真实和具有细节。通过纹理映射,可以将图像的像素值与三维模型的顶点进行匹配,从而为模型的表面增加细节和图案。OpenGL提供了一套用于加载、创建和使用纹理的API,使得纹理映射变得简单和高效。在OpenGL中,纹理被存储在纹理缓冲区中,并通过纹理坐标来进行访问。纹理坐标是一个二维向量,范围在[0,1]之间,用于映射纹理的像素值。

2024-06-06 23:18:05 1436

原创 Android开发系列(一)Clean Architecture示例

软件架构可以简单理解为代码的组织方式,如果把软件比作一个建筑物,那么软件架构就是建筑的主体框架。建筑一个矮小的土坯房不需要复杂的框架,同样一个简单的项目也不需要过多注重架构的设计。如果要建造一个摩天大厦,如果没有一个好的主体框架是很难建起来的,同样地要开发一个大型的软件项目,也需要进行架构的设计。Clean Architecture为Android官方推荐的应用架构,该架构基于关注点分离和依赖反转的原则。它将应用程序分为多个层,每个层都有特定的职责。

2024-06-06 23:17:54 1107

原创 OpenGL系列(四)Shader

通过VBO和VAO准备好数据后,接下来要指示GPU如何通过这些数据绘制图形。类似CPU可以通过执行程序来完成特定的任务,GPU也可以执行特定的程序来完成绘制任务,GPU执行的程序称为Shader,也叫着色器。GPU绘制图形分为不同的处理阶段,在顶点处理和片元OpenGL的着色器使用GLSL语言编写。

2024-06-03 23:32:52 833

原创 OpenGL系列(三)VBO、VAO

这里涉及一个问题,将数据传递到GPU是一个耗时的过程,每次绘制之前都执行数据的传递操作势必会影响整体性能,为了解决这个问题,引入了VBO,VBO是Vertex Buffer Object(顶点缓冲对象)的缩写,用于表示显存中的一个缓冲,该缓冲的数据可以被GPU访问,只要把数据存放到该缓冲中,就不必每次绘制前都执行传递数据的操作了。上面定义的数组存放在内存中,可以被CPU访问,但是GPU访问不了,绘制图形是由GPU执行的,为了能让GPU访问到顶点数据,需要把它们从内存传递到显存中。

2024-06-03 23:31:22 482

原创 Android NDK系列(五)内存监控

通过以上log可以看到,重载的运算符new、delete,构造函数和析构函数里都走进去了,说明重载运算符是可以接管分配和释放内存的工作的,而调用构造函数和析构函数还是由编译器处理了,无须担心创建对象和销毁对象时这两个函数没有被调用。尽管通过重载new和delete运算符可以接管内存的分配和释放工作,但是在new操作符函数中还是无法指定是谁申请的内存,为了能确定是哪里申请的内存,需要对new操作符进行改进,如下所示。有了保存内存信息的聊吧,可以统计当前内存的使用请求,下面实现统计当前内存使用情况的快照。

2024-05-30 09:11:41 885

原创 OpenGL系列(二)EGL

EGL是OpenGL ES 和本地窗口系统(Native Window System)之间的通信接口。OpenGL ES的平台无关性正是借助 EGL 实现的,EGL屏蔽了不同平台的差异。初始化完成后,即可调用OpenGL的API了,如glViewport设置视口的大小。在三角形示例中,以上的接口都封装到了EglManager中,初始化过程如下。绘制完成后,调用swapBuffer交换图形缓冲,绘制的内容才能显示出来。中用到了EGL的接口,本文主要介绍这部分内容。

2024-05-30 09:11:35 180

原创 Android NDK系列(四)NDK的编译

Native工程一般会用到NDK,一般开发者使用的NDK是官方提供的,直接下载即可使用。在工作过程中一般很少要定义NDK,不过对于想了解NDK是怎么生成的,可以继续往下阅读。Google提供了编译NDK的说明文档,地址为,这是国外的网站,需要有访问国外网站的条件才能打开。

2024-05-22 23:39:53 675 1

原创 Android NDK系列(三)输入事件分发到Native层的流程

在创建的Native工程中,是可以接收输入事件的,只需在android_main中注册输入事件的处理函数,当触摸屏幕后,handleInputEvent函数便会调用,代码如下。本文主要介绍触摸事件是如何传递过来的,主要分为以下两个部分。

2024-05-22 23:39:32 1087 1

原创 Mesa系列(一)搭建环境

Mesa主要对OpenGL、EGL、Vulkan等图形库API的软件实现,本系统主要通过Mesa学习OpenGL的实现原理,在学习相关的流程之前,先搭建好Mesa的运行环境。

2024-05-21 23:26:05 768

原创 OpenGL系列(一)三角形

本系统主要介绍OpenGL的使用示例,通过示例学习OpenGL API的使用方法。本文先从简单的绘制三角形例子开始,介绍如何在Native层使用OpengGL绘制一个三角形,创建Native工程的示例可参考。

2024-05-21 23:25:49 619

原创 Android NDK系列(二)NativeActivity工作流程

在已经介绍了如何手动搭建一个基于NativeActivity的工程,本文主要介绍NativeActivity的工作流程,通过本文的学习,可以了解到NativeActivity是如何与Native层交互的,Native的NativeWindow是从哪里来的。下面从NativeActivity的源码开始了解它的工作流程。

2024-05-20 23:28:07 828

原创 Android NDK系列(一)手动搭建Native Project

使用NDK编写的本地代码具有高性能等特性,在游戏、图形处理等领域有广泛应用,下面介绍如何手动搭建一个纯C++版的Android项目,通过该项目可以理解Android的项目结构。

2024-05-20 23:25:10 1116

原创 Fence同步

由于GPU的执行是异步的,向GPU发命令,CPU是不知道命令什么时候执行完的,如果GPU渲染的内容还没完成,图形缓存的内容可能是空的或者不完整的,此刻CPU就开始对它进行消费,读取出来的图形数据是有问题的。使用的是Fence的同步机制,Fence,是栅栏的意思,在CPU使用缓存的地方设置一个栅栏挡住,等GPU对该缓存的操作完成后,再通知把栅栏撤了,CPU就可以开始对缓存进行操作。通过上面的流程可以看到,生产者和消费者对于缓存的操作在时间轴上是没有重叠的,并且相隔很近。2)生产者通过GPU开始生产内容。

2024-04-13 23:03:34 508

原创 Android Camera预览通道

在HAL进程中,调用ANativeWindow的dequeue_buffer申请缓存,调enqueue_buffer投递缓存,根据前面介绍eglSwapBuffers已经知道,enqueue_buffer会调到Surface的queueBuffer,dequeue_buffer调到Surface的dequeueBuffer。》中介绍了2D图形和3D图形的生产过程,对于视频的生产方式没有介绍,这里以Camera预览为例,介绍Camera拍摄得到的图像是如何传递到显示设备显示的。

2024-04-13 22:51:02 460

原创 理解SurfaceView和SurfaceTexture

该对象创建后,在native层会创建缓存队列,同样存在图形流生产者和图形流消费者,图形流程生产者可得到Surface,通过Suface可向图形缓存生产图形数据,生产好的图形数据由SurfaceTexture传递到纹理对象中,从而被GPU渲染出来。ViewRootImpl的Surface与SurfaceView的Surface存在父子关系。SurfaceView本质上是一个View,它与一般View的区别是它有自己的Surface,而一般的View使用的ViewRootImpl中的Surface,如下所示。

2024-04-12 23:53:21 319

原创 Android系统冻屏、黑屏问题的分析思路

是新加的方法,需要在Layer也加上相应的实现,如下。》可以指导,应用的图形内容要经过SurfaceFlinger才能传递到显示设备,SurfaceFlinger每隔一定时间(间隔由帧率决定)会向屏幕传递图形数据,但是并不是每个应用的图形都会显示,只有最前面应用的画面才能显示,应用的图形数据一般保存在图层中,因此每次刷新都会收集可见的图层。在Android系统开发过程中,偶尔会遇到显示异常的问题,如画面不再刷新,也就是冻屏,或者屏幕变黑,如果对图形显示系统不熟悉,遇到此类问题还是比较棘手的。

2024-04-12 23:30:16 2041

原创 图层、窗口、画布、视图

窗口一般对应于SurfaceFlinger中的一个图层,窗口主要用于控制图层的状态,或者向图层传递图形数据,WMS使用SurfaceControl控制图层的状态,比如前后顺序,位置,透明度等。4)视图,也就是View,是UI的组成部分,向TextView, ImageView和RelativeLayout等都属于视图,视图主要调用画布的接口绘制它的内容,视图可以响应输入事件。3)画布,也就是Canvas,画布主要主要对渲染库和图形缓冲进行封装,并向外提供接口,开发者通过这些接口即可把图形渲染到图形缓冲中。

2024-04-11 22:47:25 373 1

原创 套接字通信模型

调用socketpair成功后,会返回两个套接字的文件描述符,文件描述符可执行读和写操作,对其中一个文件描述符执行写操作发送数据,另一个文件描述符会收到数据,执行读操作可把数据读取出来,反过来也是可以的,因此套接字可以双向传输。进程A通过socketpair创建了一对套件字,文件描述符分别为FD0和FD1,通过Binder方式把FD0传给进程B,进程B收到的文件描述符为FD0',FD1和FD0。有数据,执行读操作可把数据读取出来,从而实现了进程A向进程B传输数据,反过来进程B也可向进程A传输数据。

2024-04-11 22:24:37 308 1

原创 Android 输入法框架

输入法属于输入系统的一部分,区别于输入系统只能向系统产生时间,输入法能向系统输入具体的内容,下面来认识输入法的大体框架,以下内容参考清华大学出版社出版的《Android图形显示系统》。它的主要功能是为应用进程和输入法进程建立输入法会话。(3)InputMethodManager(IMM):输入法管理,应用进程通过它请求显示输入法,接收到输入内容后传给输入框。(2)InputMethodService(IMS):输入法服务,负责显示输入法界面,并把输入的内容传给应用进程。

2024-04-10 22:35:12 303 1

原创 Android输入框架

在Android系统中,输入系统是不可缺少的,下面简单介绍输入系统的整体框架,以下内容参考清华出版社出版的《Android图形显示系统》。(4)应用进程的NativeInputEventReceiver负责接收InputDispatcher发送过来的输入事件,收到事件后传递到java层的WindowInputEventReceiver。(3)InputManager主要成员包括InputReader和InputDispatcher,前者负责从驱动层读取输入事件,后者负责把输入事件传给目标窗口。

2024-04-10 22:25:44 180 1

原创 HwBinder流程分析

HwBinder与普通Binder是一样的,区别是前者是专门给硬件使用,后者是给一般的应用程序使用,为了不影响现有的binder,单独增加硬件的HwBinder来实现硬件相关进程的通信。HwBinder也是有四部分组成:hwservermanager、server、client,driver,其中Driver部分与普通Binder是一样的,《Android图形显示系统》对Binder的原理进行过详细的介绍,这里主要介绍HwBinder与Binder不一样的地方。

2024-04-09 22:28:26 719

原创 Binder线程池

startThreadPool开启一个新线程,并加入到线程池中接收和处理请求。经过以上2步,线程池就有2个空闲线程等待处理请求。Binder是支持并发请求的,也就是多个客户进程可以同时向同一个服务进程发送请求,服务进程需要同时处理这些请求。如果某个时间点服务进程同时收到多个请求,当前的线程已经处理不过来,会动态地增加线程,增加新线程的条件如下。服务进程使用线程池接收和处理请求,线程池是管理多线程的一种方式,使用线程池有以下3点好处。服务进程开启线程池的方法比较简单,方法如下。

2024-04-09 09:24:36 443

原创 Binder通信模型

为了使得客户进程与服务进程通信,服务进程需要向服务管理进程添加服务,添加的过程中在驱动层创建binder_node对象记录服务对象的信息,同时在服务管理进程创建binder_ref对象与服务进程的binder_node对象关联。客户进程向服务管理进程查询是否有特定名称的服务,如果查询到服务,在返回结果的过程中,在客户进程也创建binder_ref对象,该对象同样与binder_node对象关联,binder_ref的句柄最终会保存到BpMyService的BpBinder中。

2024-04-08 22:11:09 306

原创 Android图形显示架构概览

图形流生产者一般指的是各个应用,应用通过不同的方式生产出要显示的图形流。对于图形显示而言,消费过程是将各个应用生产的图形数据进行汇总,根据窗口管理提供的窗口元数据将多个图形数据合成到帧缓冲(硬件抽象层封装了与底层驱动交互的细节,对外提供简单的接口,有了硬件抽象层,图形消费者只需调用相关的接口即可与底层驱动进行交互,无须关心具体的交互细节。在硬件抽象层有两个与图形显示系统相关的组件,分别是Gralloc和Hardware Composer,前者负责图形缓冲的分配,后者负责将图形缓冲的内容传递到底层驱动显示。

2024-04-08 08:51:19 953

多核通信-共享内存

介绍android平台AP与modem两边的系统通过共享内存进行通信的机制

2013-05-25

understanding-linux-network-internal

对linux的网络协议栈进行比较详细的介绍,对于深入理解协议栈很有帮助

2013-05-24

MPEG1 11172-1

MPEG-1标准: part 1: 系统

2011-01-16

Android多媒体框架

简单讲述了android平台支持的媒体格式和多媒体模块的架构

2010-07-17

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除