android笔记

Gdx

2020-12-26  本文已影响0人  瞎晃的攻城狮
image.png image.png

1.Libgd坐标

使用笛卡尔坐标系(初始坐标为左下0,0),而JavaSE、JavaME以及标准Android系统(还有LGame引擎)使用的是屏幕坐标系(初始坐标为左上0,0),每个点都需要坐标转换。

2. 基础机制

根据配置文件获取目标在PNG中的位置, 截取出来 ,再根据配置文件的时间轴 进行动作。

3.SurfaceView

单独线程 :画图线程由UI线程调用surfaceCreated的时候创建

线程共享内存数据,所以, surface对于两个线程是共享的。所以,为了避免在画图的时候,UI线程也对surface进行操作,在画图前,需要对surface加锁

一般的Activity包含的多个View会组成View hierachy的树形结构,只有最顶层的DecorView,也就是根结点视图,才是对WMS可见的。这个DecorView在WMS中有一个对应的WindowState。相应地,在SurfaceFlinger中对应的Layer。而SurfaceView自带一个Surface,这个Surface在WMS中有自己对应的WindowState,在SurfaceFlinger中也会有自己的Layer。虽然SurfaceView在Application端它仍在View hierachy中,但在Server端(WMS和SurfaceFlinger)中,它与宿主窗口是分离的。


SurfaceView

上图为Surface 与UI 的交互示意


SurfaceFlinger : Surface核心类 开各种线程 接收同步信号
image.png

双缓冲机制:

image.png

4 TextureView

硬件加速

简单说 就是依赖GPU实现图形绘制加速,构建drawOp树,然后将这个绘图Op树交给Render线程进行绘制。
drawOp : 存储 View和OpenGL绘制命令对应关系 和绘图所需数据

image.png
软件加速:

CPU计算,UI线程绘制。

无论是软件绘制还是硬件加速,绘制内存的分配都是类似的,都是需要请求SurfaceFlinger服务分配一块内存,只不过硬件加速有可能从FrameBuffer硬件缓冲区直接分配内存(SurfaceFlinger一直这么干的),两者的绘制都是在APP端,绘制完成之后同样需要通知SurfaceFlinger进行合成,在这个流程上没有任何区别,真正的区别在于在APP端如何完成UI数据绘制

5 OpenGL ES

OpenGL ES (OpenGL for Embedded Systems)是三维图形 API OpenGL 的子集,针对手机、PDA 和游戏主机等嵌入式设备而设计。

OpenGL ES 定义了一个渲染图形的 API,但没有定义窗口系统。为了让 GLES 能够适合各种平台,GLES 将与知道如何通过操作系统创建和访问窗口的库结合使用。用于 Android 的库称为 EGL。

参考:
《SurfaceFlinger》 :https://www.androidperformance.com/2020/02/14/Android-Systrace-SurfaceFlinger/

上一篇下一篇

猜你喜欢

热点阅读