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;
}

结果呈现:

小结:

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值