如何在Android上实现FrameBuffer和Overlay的blend

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Android上实现FrameBuffer和Overlay的blend相关的知识,希望对你有一定的参考价值。

1.SurfaceFlinger是一个服务,主要是负责合成各窗口的Surface,然后通过OpenGLES显示到FrameBuffer上。
2.DisplayHardware是对显示设备的抽象,包括FrameBuffer和Overlay。加载FrameBuffer和Overlay插件,并初始化OpenGLES:
view plain
mNativeWindow = new FramebufferNativeWindow();
framebuffer_device_t const * fbDev = mNativeWindow->getDevice();
if (hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module) == 0)
overlay_control_open(module, &mOverlayEngine);

surface = eglCreateWindowSurface(display, config, mNativeWindow.get(), NULL);
eglMakeCurrent(display, surface, surface, context);

3.FramebufferNativeWindow 是framebuffer 的抽象,它负责加载libgralloc,并打开framebuffer设备。FramebufferNativeWindow并不直接使用 framebuffer,而是自己创建了两个Buffer:
queueBuffer负责显示一个Buffer到屏幕上,它调用fb->post去显示。
dequeueBuffer获取一个空闲的Buffer,用来在后台绘制。
这两个函数由eglSwapBuffers调过来,调到
view plain
egl_window_surface_v2_t::swapBuffers:
nativeWindow->queueBuffer(nativeWindow, buffer);
nativeWindow->dequeueBuffer(nativeWindow, &buffer);
4.msm7k/liboverlay是Overlay的实现,与其它平台不同的是,高通平台上的Overlay并不是提供一个framebuffer设备,而通过fb0的ioctl来实现的,ioctl分为两类操作:
OverlayControlChannel用于设置参数,比如设置Overlay的位置,宽度和高度:
view plain
bool OverlayControlChannel::setPosition(int x, int y, uint32_t w, uint32_t h)
ov.dst_rect.x = x;
ov.dst_rect.y = y;
ov.dst_rect.w = w;
ov.dst_rect.h = h;

ioctl(mFD, MSMFB_OVERLAY_SET, &ov);

OverlayDataChannel用于显示Overlay,其中最重要的函数就是queueBuffer:
view plain
bool OverlayDataChannel::queueBuffer(uint32_t offset)

mOvData.data.offset = offset;

ioctl(mFD, MSMFB_OVERLAY_PLAY, odPtr))


5.msm7k/libgralloc 是显示缓存的抽象,包括framebuffer和普通Surface的Buffer。framebuffer只是/dev/graphic/fb0的包 装,Surface的Buffer则是对/dev/pmem、ashmem和GPU内存(msm_hw3dm)的包装,它的目标主要是方便硬件加速,因为 DMA传输使用物理地址,要求内存在物理地址上连续。
6.msm7k/libcopybit这是2D加速库,主要负责Surface的拉伸、旋转和合成等操作。它有两种实现方式:
copybit.cpp: 基于fb0的ioctl(MSMFB_BLIT)的实现。
copybit_c2d.cpp: 基于kgsl的实现,只是对libC2D2.so的包装,libC2D2.so应该是不开源的。
7.pmem
misc/pmem.c: 对物理内存的管理,算法和用户空间的接口。
board-msm7x27.c定义了物理内存的缺省大小:

view plain
#define MSM_PMEM_MDP_SIZE 0x1B76000
#define MSM_PMEM_ADSP_SIZE 0xB71000
#define MSM_PMEM_AUDIO_SIZE 0x5B000
#define MSM_FB_SIZE 0x177000
#define MSM_GPU_PHYS_SIZE SZ_2M
#define PMEM_KERNEL_EBI1_SIZE 0x1C00

msm_msm7x2x_allocate_memory_regions分配几大块内存用于给pmem做二次分配。
8.KGSL
Kernel Graphics System Layer (KGSL),3D图形加速驱动程序,源代码drivers/gpu/msm目录下,它是对GPU的包装,给OpenGLES 2.0提供抽象的接口。
9.msm_hw3dm
这个我在内核中没有找到相关代码。
10.msm_fb
msm_fb.c: framebuffer, overlay和blit的用户接口。
mdp_dma.c: 对具体显示设备的包装,提供两种framebuffer更新的方式:
mdp_refresh_screen: 定时更新。
mdp_dma_pan_update: 通过pan display主动更新。
mdp_dma_lcdc.c:针对LCD实现的显示设备,mdp_lcdc_update用更新framebuffer。
参考技术A 调用windowmanager的接口悬浮即可
【 在 mixiumaqi 的大作中提到: 】
: 在android上,用overlay显示video,全屏显示,这个是在kernel mode里面直接显示的,然后想在application层在video上画出几条线,类似于在电影上加字幕的效果本回答被提问者和网友采纳

如何在android上实现p2p

【中文标题】如何在android上实现p2p【英文标题】:How to achieve p2p on android 【发布时间】:2013-06-28 09:05:08 【问题描述】:

所以我正在开发一个小游戏,用户将在其中尝试实时回答相同的问题。我认为用户交流的最佳方式是 p2p。经过 3 天的搜索,我发现有 3 种可能的解决方案。 1. XMPP。很多人推荐。不幸的是,在中国使用 GTalk 的人并不多。 2.Jxta。看起来死气沉沉而复杂。 3. SIP。它要求用户有一个 SIP 帐户。 p2p 在手机上似乎真的很难。 我的问题: p2p 真的是解决我问题的最佳方法吗? 如果是,在手机上实现p2p连接的最佳方式是什么?

非常感谢!

【问题讨论】:

XMPP 真的需要 Google Talk 帐户吗?据我所知,它是一个独立的协议,恰好被 Google Talk 使用。 【参考方案1】:

如果XMPP 的唯一问题是您的用户不使用 Google Talk,您应该设置一个服务器并依靠带内注册。

查看这些问答以了解what it is 和how you can get it in android

【讨论】:

谢谢。我只是在开发一个小游戏应用程序。维护 xmpp 服务器对我来说很昂贵。我的计划是使用 Google App Engine 之类的东西。我想我现在唯一的选择就是潜入 jxta。 既然您的目标是Android,为什么不利用几乎所有用户都有Google 帐户的事实呢?我不知道它是否符合您的需求,但您应该看看。【参考方案2】:

XMPP 服务器易于设置,使用 OpenFire。我之前做过这个,你必须在服务器上安装一个java虚拟机,然后安装OpenFIre。

要创建客户端应用程序,您可以将您的工作基于非常完整的 ASMACK 库。

对我来说,它有效,但我的服务器无法处理 OpenFire。我只有一个具有 512 RAM 和 20 Go SSD 的专用服务器连接到 *** 连接。

【讨论】:

但是维护一个 xmpp 服务器对我来说很昂贵。

以上是关于如何在Android上实现FrameBuffer和Overlay的blend的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Cordova 在 Android 上实现打印?

如何在 Android Activity 上实现多线程?

如何在我的解析服务器上实现 Android 和 IOS 应用程序的预定推送通知?

android中如何在appwidget上实现动画效果

如何使用 OkHttp 在 Android 上实现 cookie 处理?

如何在 Android 上实现 Material Design 展开/折叠列表?