当前位置: 首页 > news >正文

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获取一个Surfacesp<Surface> surface = surfaceControl->getSurface();SurfaceComposerClient::Transaction t;//设置Layer层级,数值越大层级越高t.setLayer(surfaceControl, 100000).apply();ANativeWindow_Buffer outBuffer;//从BufferQueue中获取获取一个Buffersurface->lock(&outBuffer, NULL);//计算每个像素点的字节大小ssize_t bpr = outBuffer.stride * bytesPerPixel(outBuffer.format);//使用memset16对buffer赋值(颜色值)android_memset16((uint16_t*)outBuffer.bits, 0xF800, bpr*outBuffer.height);//提交填充后的buffersurface->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;
}

结果呈现:

小结:

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

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

3、底层是通过BufferQueue的来实现生产者和消费者模型的流水线方式,进行读写图形缓冲区,进行绘制渲染。

http://www.lryc.cn/news/120325.html

相关文章:

  • 高压放大器怎么设计(高压放大器设计方案)
  • SpringBoot yml配置注入
  • 中科亿海微乘法器(LPMMULT)
  • Redis_持久化(AOF、RDB)
  • 开源数据库Mysql_DBA运维实战 (部署服务篇)
  • 【Java学习】System.Console使用
  • 从零学算法154
  • 95 | Python 设计模式 —— 策略模式
  • 【BASH】回顾与知识点梳理(十九)
  • Selenium之css怎么实现元素定位?
  • 计算机基础之RAID技术
  • 辽宁线上3D三维虚拟工厂生产仿真系统应用场景及优势
  • csrf跨站请求的相关装饰器、Auth模块(模块的使用、相关方法、退出系统、修改密码功能、注册功能)、扩展默认的auth_user表
  • (WWW2023)论文阅读-Detecting Social Media Manipulation in Low-ResourceLanguages
  • centos-stream-9 centos9 配置国内yum源 阿里云源
  • 查看单元测试用例覆盖率新姿势:IDEA 集成 JaCoCo
  • js和nodejs如何将文件切片和合并
  • Java内存模型
  • [国产MCU]-BL602开发实例-看门狗定时器(WDG)
  • 28 | Boss直聘数据分析
  • Hash 缓存
  • 腾讯云CVM服务器标准型S5性能CPU处理器测试
  • 【左神算法刷题班】第16节:累加和为k的数组、逆序对问题、约瑟夫环问题
  • 【React | 前端】在React的前端页面中,判断某个变量值是否被定义?根据是否定义显示不同的内容?
  • 机器学习深度学习——seq2seq实现机器翻译(数据集处理)
  • 锁定Mac的内置键盘,防止外接键盘时的误触
  • 由于找不到d3dx9_42.dll,无法继续执行代码。重新安装程序可能会解决此问题
  • 解决Vue+Element UI使用el-dropdown(下拉菜单)国际化时菜单label信息没有刷新的情况
  • Prometheus技术文档-概念
  • JQuery判断radio(单选框)是否选中和获取选中值方法总结