`
sharp2wing
  • 浏览: 271109 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

Android是怎样调用硬件加速的?

阅读更多
Android是怎样调用硬件加速的

[描述]
如果处理器只有2D硬件加速而没有3D硬件加速,则可以利用opengl中的libagl,
实现封装在libagl里的copybit,因为相对3D API来说,这个模块的封装google
基本是做好的,只要去实现一个copybit HAL即可;
如果处理器2D/3D硬件加速均有,那么可以丢开 copybit,去实现openGL ES
2D/3D API 的加速功能。

[Android是怎样加载软件/硬件加速库的]

1. 全局变量gEGLImpl: 定义egl&gles的API的指针
    egl_connection_t gEGLImpl[IMPL_NUM_IMPLEMENTATIONS];
    enum {
        IMPL_HARDWARE = 0,
        IMPL_SOFTWARE,
        IMPL_NUM_IMPLEMENTATIONS
    };
    具体数据结构参看附录。

2. 初始化全局变量gEGLImpl
  Code:egl_init_drivers_locked()<frameworks/base/opengl/libs/EGL/egl.cpp>
  egl_init_drivers_locked()函数主要的工作就是填充gEGLImp数组变量
  该函数调用Loader.cpp中的Loader::open()加载对应的硬件和软件加速的驱动(动态链接库).
    a. 加载libGLES_android.so填充gEGLImpl[IMPL_SOFTWARE];
    b. 加载libGLES_HWxxxxx.so填充gEGLImpl[IMPL_HARDWARE];
  注:配置文件/system/lib/egl/egl.cfg中列出了系统中的软件/硬件减速库
     格式: dpy  impl  tag
            0    0     android   
            0    1     HWxxxxx

[2D硬件加速]
  frameworks/base/opengl/libagl/egl.cpp 文件中利用hardware/libhardware/hardware.c
  文件中定义的hw_get_module()函数,该函数判断获得的系统属性是否在variant_keys[]数组中定义
  通过load()函数加载相应的硬件模块;否则加载default硬件模块。
  因此需要研究libagl,根据需要实现相应的copybit硬件模块。

  注:
    libGLES_android.so为编译frameworks/base/opengl/libagl/目录而生成的,其专门有一个
    copybit.cpp文件对copybit模块进一步封装。
    libagl中通过在frameworks/base/opengl/libagl/Android.mk文件中定义:
        LIBAGL_USE_GRALLOC_COPYBITS := 1
    来加载copybit模块;如果未定义LIBAGL_USE_GRALLOC_COPYBITS,则通过软件的方式而不使用
    copybit 模块来达到 2D 硬件加速。

[2D/3D硬件加速]
  需研究opengles, 并实现
    /system/lib/egl/libGLES_HWxxxxx.so
  或者
    /system/lib/egl/libEGL_HWxxxxx.so
    /system/lib/egl/libGLESv1_CM_HWxxxxx.so
    /system/lib/egl/libGLESv2_HWxxxxx.so
  来提供 openGL ES 2D/3D 硬件加速 API 。

[应用是怎样使用OpenGLES硬件加速的]
  1.应用调用eglChooseConfig时,libs/EGL/egl.cpp::eglChooseConfig根据参数选择config时,
    调用顺序为:
      gEGLImpl[IMPL_HARDWARE].egl.eglChooseConfig(...)
      gEGLImpl[IMPL_SOFTWARE].egl.eglChooseConfig(...)
    原因: IMPL_HARDWARE=0; IMPL_SOFTWARE=1
    参看:
        enum {
            IMPL_HARDWARE = 0,
            IMPL_SOFTWARE,
            IMPL_NUM_IMPLEMENTATIONS
        };
  2. 创建Surface和Context时, libs/EGL/egl.cpp是根据传入参数config来判断是调用软件还是
    硬件加速API的, 而根据步骤1优先选择的缉硬件的config, 故创建Surface和Context是使用的
    也是硬件加速的API。

[附录]:
struct egl_connection_t
{
    void *              dso;
    gl_hooks_t *        hooks[2];
    EGLint              major;
    EGLint              minor;
    egl_t               egl;
};

struct egl_t {
    #include "EGL/egl_entries.in"
};

struct gl_hooks_t {
    struct gl_t {
        #include "entries.in"
    } gl;
    struct gl_ext_t {
        void (*extensions[MAX_NUMBER_OF_GL_EXTENSIONS])(void);
    } ext;
};
分享到:
评论

相关推荐

    Android代码-使用硬件加速提高安卓动画性能

    使用硬件加速会让动画绘制的更快,因为硬件会把图层缓存在GPU上。  &gt;用法    用法很简单关键方法是View.setLayerType()    1. 在开始动画时调用View.setLayerType(View.LAYER_TYPE_HARDWARE, null)  2. 运行...

    Android如何使用GPU硬件加速3D游戏

    Android 如何使用 GPU 硬件加速 3D 游戏 Android 作为一个流行的移动操作系统,具有强大的图形处理能力,其中 GPU 硬件加速是提高游戏性能的关键。下面将介绍 Android 中如何使用 GPU 硬件加速原理和游戏 3D 性能...

    处理android bitmap oom 2.0版本关闭了硬件加速

    使用`View.setLayerType(View.LAYER_TYPE_SOFTWARE, null)`可以使指定视图不使用硬件加速,但这可能会降低性能。 8. **利用MemoryCache和DiskCache**:通过缓存机制,将Bitmap存储在内存或磁盘中,避免频繁加载大图...

    android 加速传感器的使用

    在Android系统中,加速传感器是一种重要的硬件组件,它能够感知设备在三维空间中的加速度变化,包括设备的移动、旋转以及倾斜等动作。利用这些数据,开发者可以实现各种创新的功能,比如屏幕自动旋转、计步器、游戏...

    理解Android硬件加速原理(小白文)

    soft硬件加速的分歧点可以通过ViewRootImpl的draw方法来判断,具体来说,如果开启了硬件加速,那么就会使用HardwareRenderer的draw方法进行绘制,否则就会使用软件绘制。 Android硬件加速原理主要是通过依赖GPU...

    加速Android模拟器启动运行速度

    1. 硬件加速:Android 模拟器可以使用硬件加速来提高启动速度。硬件加速可以使用 Intel HAXM(Hardware Accelerated Execution Manager)技术,基于 Intel(R) Virtualization Technology(VT)技术来实现硬件加速。...

    详解Android开发中硬件加速支持的使用方法

    Android从3.0(API Level 11)开始,在绘制View的时候支持硬件加速,充分利用GPU的特性,使得绘制更加平滑,但是会多消耗一些内存。  开启或关闭硬件加速:  由于硬件加速自身并非完美无缺,所以Android提供选项来...

    浅谈Android硬件加速原理与实现简介

    在Android中,硬件加速的实现主要是通过使用OpenGL ES和RenderScript等技术,将图形计算转换成GPU专用指令,由GPU完成。这样可以大大提高图形渲染的速度和性能。 上层实现: 在上层实现中,开发者可以使用Android...

    适用于 Android 的轻量级硬件加速视频/音频转码器_java_代码_下载

    默认情况下,LiTr 使用 Android MediaCodec 堆栈进行硬件加速解码/编码,使用 OpenGL 进行渲染。它还使用 MediaExtractor 和 MediaMuxer 来读取/写入媒体。 更多详情、使用方法,请下载后阅读README.md文件

    ffmpeg硬件加速解码.7z

    6. **OpenMAX IL**: 这是一个跨平台的多媒体开发接口,许多移动设备(如Android)支持OpenMAX IL进行硬件加速。 要启用FFmpeg的硬件加速解码,需要在命令行中指定相应的选项。例如,使用VAAPI加速h264解码,可以...

    《Android板级支持与硬件相关子系统》PDF

    7. **硬件加速**:利用硬件加速可以提升图形渲染、多媒体处理等性能。这可能涉及OpenGL ES、Vulkan等图形API的使用,以及硬件编码/解码器的集成。 8. **传感器融合**:现代Android设备通常包含多个传感器,如陀螺仪...

    Android加速器

    总之,Android加速器,尤其是HAXM,是Android开发者不可或缺的工具,它通过硬件加速技术优化了模拟器的性能,使得开发者可以在PC上快速高效地进行应用测试和调试。对于那些频繁使用Android模拟器的开发者来说,掌握...

    Android虚拟机加速器 intel.7z

    通常,这种加速器会利用Intel的硬件加速技术,如VT-x(Virtualization Technology for x86)和EPT(Extended Page Tables),这些技术能够更高效地管理虚拟化内存,降低CPU在虚拟环境中的开销。 VT-x是一种硬件辅助...

    硬件加速编码器codec

    在IT行业中,硬件加速编码器(codec)是一个关键的技术领域,尤其在移动设备如Android系统上,它对于优化性能和节省资源至关重要。标题中的“硬件加速编码器codec”指的是利用设备内部专门的硬件模块来执行音频和...

    android使用webView实现java程序与js脚本的相互调用

    本文将详细介绍如何在Android中使用WebView实现Java程序与JS脚本的相互调用。 ### 1. 添加WebView到布局 首先,在XML布局文件中添加WebView组件,例如在`activity_main.xml`中: ```xml android:id="@+id/...

    Android开发模拟器加速

    总结起来,Android开发模拟器加速涉及多个方面,包括硬件加速技术、模拟器配置优化、使用先进的AVD管理工具、选择合适的系统镜像以及利用第三方模拟器。理解并掌握这些技巧,开发者可以大大提高模拟器的运行效率,...

    海康威视视频监控android移动端调用

    5. **多媒体处理**:视频预览涉及解码和渲染,可能使用到Android的MediaCodec和SurfaceView等组件,进行硬件加速的视频播放。 6. **权限管理**:为了允许应用程序访问网络和硬件,需要在AndroidManifest.xml中声明...

Global site tag (gtag.js) - Google Analytics