Android图形-合成与显示-SurfaceTestDemo

这篇具有很好参考价值的文章主要介绍了Android图形-合成与显示-SurfaceTestDemo。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

引言:

主程序代码:

结果呈现:

小结:


引言:

通过一个最简单的测试程序直观Android系统的native层Surface的渲染显示过程。

主程序代码:

#include <cutils/memory.h>
#include <utils/Log.h>
#include <binder/IPCThreadState.h>
#include <binder/ProcessState.h>
#include <binder/IServiceManager.h>
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
#include <android/native_window.h>

using namespace android;

//int main(int argc, char** argv)
int main()
{
    // 设置线程池
    sp<ProcessState> proc(ProcessState::self());
    ProcessState::self()->startThreadPool();

    // 创建与Surfaceflinger通信的客户端
    sp<SurfaceComposerClient> client = new SurfaceComposerClient();
    // 创建SurfaceControl并设置名称“resize”、宽高、像素格式,红色分量使用 5 位,绿色分量使用 6 位,蓝色分量使用 5 位。
    sp<SurfaceControl> surfaceControl = client->createSurface(String8("resize"),
            400, 600, PIXEL_FORMAT_RGB_565, 0);
    //通过SurfaceControl获取一个Surface
    sp<Surface> surface = surfaceControl->getSurface();

    SurfaceComposerClient::Transaction t;
    //设置Layer层级,数值越大层级越高
    t.setLayer(surfaceControl, 100000)
        .apply();

    ANativeWindow_Buffer outBuffer;
    //从BufferQueue中获取获取一个Buffer
    surface->lock(&outBuffer, NULL);
    //计算每个像素点的字节大小
    ssize_t bpr = outBuffer.stride * bytesPerPixel(outBuffer.format);
    //使用memset16对buffer赋值(颜色值)
    android_memset16((uint16_t*)outBuffer.bits, 0xF800, bpr*outBuffer.height);
    //提交填充后的buffer
    surface->unlockAndPost();
    sleep(1);

    surface->lock(&outBuffer, NULL);
    android_memset16((uint16_t*)outBuffer.bits, 0x07E0, bpr*outBuffer.height);
    surface->unlockAndPost();
    sleep(1);

    surface->lock(&outBuffer, NULL);
    android_memset16((uint16_t*)outBuffer.bits, 0x001F, bpr*outBuffer.height);
    surface->unlockAndPost();
    sleep(1);

    //对outbuffer进行100次连续的获取与释放
    for (int i = 0; i < 100; i++) {
        surface->lock(&outBuffer, NULL);
        printf("%03d buff addr = 0x%x\n", i, (unsigned int)(uintptr_t)outBuffer.bits);
        surface->unlockAndPost();
    }
    
    IPCThreadState::self()->joinThreadPool();

    return 0;
}

结果呈现:

Android图形-合成与显示-SurfaceTestDemo,Android系统开发,android

小结:

1、基于线程池的方式,创建一个客户端,并与服务端SurfaceFlinger进行connect,这就有了通信和交互的基础渠道

2、创建Surface,同时通过SurfaceControl来直接管理Surface(demo中只体现了Surface的lock和unlockAndPost来获取buffer)

3、底层是通过BufferQueue的来实现生产者和消费者模型的流水线方式,进行读写图形缓冲区,进行绘制渲染。文章来源地址https://www.toymoban.com/news/detail-643148.html

到了这里,关于Android图形-合成与显示-SurfaceTestDemo的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android下SF合成流程重学习之onMessageInvalidate

    虽然看了很多关于Android Graphics图形栈的文章和博客,但是都没有形成自己的知识点。每次学习了,仅仅是学习了而已,没有形成自己的知识体系,这次趁着有时间,这次必须把这个事情干透彻了! 本篇引用的代码,主要是Android R的。 并且Android下Graphics图形栈牵涉的点,太多

    2024年02月19日
    浏览(31)
  • Android下SF合成流程重学习之Refresh流程

    在前面初步分析完成了Android下SF合成流程重学习之Invalidate流程,我们接下来继续下面的分析。当有事务的更新或者有Buffer的更新便会触发后面刷新的流程,即Refresh流程! 前面主要搜集需要送显的layer的情况,封装成compositionengine::CompositionRefreshArgs参数传递给CompositionEngine做进一

    2024年02月19日
    浏览(47)
  • 安卓图形显示系统

    Android图形显示系统是Android比较重要的一个子系统,和很多其他子系统的关联紧密。 Android图形系统比较复杂,这里我们从整体上理一遍,细节留待后期再去深入。Android图形系统主要包括以下几个方面:  - 渲染(也就是绘制内容) - 合成(把多个绘制的结果并和) - 送显(把

    2024年02月12日
    浏览(39)
  • Wine 图形显示基本概念

    在理解wine 图形显示之前先了解下Windows 下当前使用的图形显示方法。 Windows采用了基于GDI(Graphics Device Interface)和 DirectX两种不同的图形显示方式。 GDI(Graphics Device Interface):是Windows中内置的2D渲染引擎,主要负责窗口、控件等基本UI元素的渲染、文字绘制以及打印输出等任

    2024年01月21日
    浏览(37)
  • LCD屏幕汉字及图形显示

    目录 软件准备 1. PCtoLCD2002 2. Img2Lcd 3. 下载地址 中文取模 1. 打开PCtoLCD2002 2. 选择模式 - 字符模式 3. 点击选项,进行设置 4. 设置如下,点阵内的数字手动输入999,然后点击确定。 5. 生成汉字数组(以12x12大小的汉字为例)  6. 在程序中使用 图形取模  1.  利用image2lcd软件将图

    2024年02月02日
    浏览(20)
  • 实例019 以图形按钮显示的界面

    实例说明 菜单和工具栏虽然能方便用户操作程序的相应功能,但各有缺点。如果采用按钮式功能菜单,不但美观大方,而且操作灵活。当单击按钮时,用户区将显示相应的操作按钮组。下面介绍图形界面式菜单的设计方法。运行本例,效果如图1.19所示。 图 1.19  以图形按钮

    2024年02月16日
    浏览(31)
  • 【Django】图形验证码显示及验证

    开发项目时,在登陆或者注册功能中为防止脚本恶意破坏系统,故而添加图形验证码。 安装第三方库 配置settings.py 将已存在的数据库迁移文件集同步到数据库中 配置urls.py: 注意:请将代码中的form替换为从视图层传入前端的form表单名称。 验证码显示 将 captcha = CaptchaField() 写

    2024年02月11日
    浏览(37)
  • 【UEFI实战】UEFI图形显示(字符输出)

    接下来介绍 EFI_HII_FONT_PROTOCOL ,它在UEFI代码中完成了字符到像素的转换,本节主要介绍这个转换关系,它的实现代码在edk2MdeModulePkgUniversalHiiDatabaseDxeHiiDatabaseDxe.inf中,除了 EFI_HII_FONT_PROTOCOL ,这个模块还实现了很多其它的Protocol,后面用到的时候也会介绍,所以HiiDatabaseDx

    2024年02月13日
    浏览(43)
  • 图形化编程(1)之led矩阵显示输出

            在之前的章节中,小编带领大家学习:如何构建micro:bit、pico的图形化开发环境-CSDN博客         今天小编带领大家开始学习图形化编程的第一节、led显示输出。microbit核心板是一个高度集成,功能丰富的模块,来看下他的功能分布:         其自带了一个

    2024年02月03日
    浏览(22)
  • Verilog视频信号图形显示 FPGA(iCE40)

    您需要一块带视频输出的 FPGA 板。 我们将在 640x480 下工作,几乎任何视频输出都可以在此像素工作。 它有助于轻松地对 FPGA 板进行编程并相当熟悉 Verilog。 如果您没有开发板,请不要担心,您可以使用 Verilator 模拟器。 材料 Lattice iCE40 即用型开发平台(Xilinx Artix-7) 视频板

    2024年02月03日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包