Gdx

作者: 瞎晃的攻城狮 | 来源:发表于2020-12-26 15:04 被阅读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/

    相关文章

      网友评论

        本文标题:Gdx

        本文链接:https://www.haomeiwen.com/subject/siubnktx.html