安卓系统|安卓系统分屏相关修改思路

安卓系统应用在一些特殊设备时,屏幕显示也会有一些特殊要求;
分屏(一面屏幕内显示两个相同的画面),画面分割等,这里讲述一些基本修改思路和简单实例。
OpenGLES相关修改 【安卓系统|安卓系统分屏相关修改思路】首先说下比较简单的修改方式,在frameworks层,通过修改"OpenGLES"相关调用部分,实现渲染合成的画面显示调整(AOSP6.0.1_r1以左右分屏为示例):
找到"frameworks/base/lib/hwui/renderstate/RenderState.cpp"的
void RenderSate::render(const Glop& glop)函数,修改如下:

1) glDrawElements(mesh.primitiveMode, drawCount, GL_UNSIGNED_SHORT, nullptr); 修改为 glViewport(0, 0, mViewportWidth / 2, mViewportHeight); glDrawElements(mesh.primitiveMode, drawCount, GL_UNSIGNED_SHORT, nullptr); glViewport(mViewportWidth / 2, 0, mViewportWidth / 2, mViewportHeight); glDrawElements(mesh.primitiveMode, drawCount, GL_UNSIGNED_SHORT, nullptr);

2) glDrawElements(mesh.primitiveMode, mesh.elementCount, GL_UNSIGNED_SHORT, indices.indices); 修改为 glViewport(0, 0, mViewportWidth / 2, mViewportHeight); glDrawElements(mesh.primitiveMode, mesh.elementCount, GL_UNSIGNED_SHORT, indices.indices); glViewport(mViewportWidth / 2, 0, mViewportWidth / 2, mViewportHeight); glDrawElements(mesh.primitiveMode, mesh.elementCount, GL_UNSIGNED_SHORT, indices.indices);

3) glDrawArrays(mesh.primitiveMode, 0, mesh.elementCount); 修改为 glViewport(0, 0, mViewportWidth / 2, mViewportHeight); glDrawArrays(mesh.primitiveMode, 0, mesh.elementCount); glViewport(mViewportWidth / 2, 0, mViewportWidth / 2, mViewportHeight); glDrawArrays(mesh.primitiveMode, 0, mesh.elementCount);

实现原理:
void RenderState::setViewport(GLsizei width, GLsizei height) { mViewportWidth = width; mViewportHeight = height; glViewport(0, 0, mViewportWidth, mViewportHeight); } 之前修改图层渲染(LayerRenderer.cpp)时,发现图层变成了左半屏,由此追踪代码,找到这个函数,通过对OpenGL显示窗口的调整及多次调用绘制实现相关功能。

实现思路:
frameworks/base/lib/hwui文件夹内相关文件描述了安卓系统对屏幕渲染的基本思路,缓冲数据在这里处理后写入驱动(部分流数据没有经过这里处理,比如摄像头流),其中包含顶点数据计算、着色器渲染等; 这个示例只能算是参考(至少在效率方面是这样), 具体实现需要对数据缓冲区、着色器等方面进行优化。

画布数据相关修改
画布相关修改比较复杂,但是一些特殊流可以在这里处理... 参考"frameworks/base/core/java/android/view/ViewRootImpl.java"的 private void performLayout(WindowManager.LayoutParams lp, int desiredWindowWidth, int desiredWindowHeight)函数, 这里可以设置布局的大小,这块研究的比较浅只是简单实现了等比例的宽和高...

本人对于安卓系统分屏、屏幕分割等研究的只能算简单了解,描述一下研究思路吧:
目前我了解的安卓屏幕绘制有两种思路: 1) 修改画布,使其画布在画布层上放置等比例的像素; 2) 修改图像渲染,完成屏幕显示多块化或渲染层内等比例放置渲染像素。


相关参考资料: <深入解析Android5.0系统>

<浅谈OpenGL、OpenGL ES>

    推荐阅读