Android:分配一次图形并在屏幕上移动它而不重写像素

问题描述

我有一个 Google Pixel 4,已扎根,并且成功构建了 AOSP 代码。在 Android 应用程序中,我想分配一个超大的内存区域(可能是 1080x2280 屏幕的 4 倍)并在缓冲区中间绘制一个简单的图形(例如,正方形)。然后,在每一帧上,我只想在缓冲区上滑动指针,使其看起来像正方形在屏幕上移动(因为缓冲区的其余部分将是空白的)。

我不确定这是否可行。到目前为止,我有一个完全原生的 Android 应用程序。在android_main()开始时,我malloc了一个4倍屏幕大小的区域,并在中间画了一个红色方块。在每一帧,我调用

ANativeWindow_lock() 

获取指向 gralloced 内存的指针,以 ANativeWindow_Buffer-> 位访问。然后我使用 memcpy 将像素从我的大 malloced 缓冲区复制到位地址,调整我的 memcpy 调用中的 src 指针以在缓冲区内滑动并使其看起来像正方形在屏幕上移动。最后,我打电话

ANativeWindow_unlockAndPost()

释放 cpu 访问权限并将缓冲区发布到显示器。

但是,我正在尝试尽可能快地渲染。屏幕有 2462400 个像素(每个 2 个字节),因此 memcpy 为每帧复制 5MB 的数据,这需要大约 10 毫秒。所以,我想避免使用 memcpy 并访问指向 dma_buf 的 ORIGINAL 指针,或者 Gralloc3 最初为 GraphicBuffer 分配的任何内容(ANativeWindow 基本上只是一个使用 GraphicBuffer 的 Surface,它使用 GraphicBufferMapper,它在 gralloc 中使用 GrallocMapper )。由于系统似乎是三重缓冲,将三个 gralloced 缓冲区放入 BufferQueue 并在它们之间循环,这一点很复杂。

通过在我的 AOSP 构建中添加日志语句,我可以看到 Gralloc3 何时分配缓冲区以及它们有多大。所以我可以分配超大缓冲区。但它是手动调整指针并将其反映在我卡住的显示器上。 ANativeWindow_lock() 获取指向像素缓冲区的原始指针的副本,因此我想如果我可以一直跟踪该调用,那么我就可以找到原始指针。我将其追溯到 hardware/interfaces/graphics/mapper/3.0/IMapper.hal 和 IAllocator.hal,Gralloc3 使用它们与内存进行交互。但我不知道这之后该去哪里。 HAL 文件基本上是由其他一些特定于供应商的文件实现的标头,我猜....

Checking out ANativewindow_lock() using Android Studio's CPU profiler

根据这张图片,似乎某些 QtiMapper.cpp 文件可能正在实现 HAL。在hardware/qcom 中有一些名为QtiMapper 的文件。 (我猜我应该查看 sm8150 文件夹,因为 Pixel 4 使用 Snapdragon 855。)然后再往下看,IonAlloc::CleanBuffer 和 BufferManager::LockBuffer 看起来可能在 hardware/qcom/ 的 gr_ 文件显示/msmxxxx/gralloc 文件夹。但我无法确定调用的确切路由位置,因为如果我尝试修改这些文件或向这些文件添加日志语句,我会遇到 AOSP 构建问题。关于如何修改这些的任何说明也将非常有帮助。如果这些是系统正在使用的实际文件,看起来我可以将它们用于我的应用程序,因为我可以在其中看到 ioctl 和 mmap 调用

使用 Linux 直接渲染管理器,我能够通过关闭 SurfaceFlinger 并映射一些内存来直接写入 C 文件中的显示。请参阅我的演示 here。所以如果我关闭Android框架,我就可以完成我想做的事情。但我想让 Android 保持正常运行,因为我希望在我的应用程序中使用加速计和其他 API。 (目标是使用加速度计读数尽可能快地稳定显示器上的文本。)这也很烦人,因为再次启动显示服务器会导致某种重启。

首先,我想做的事值得吗?看起来应该是这样,因为 Pixel 上的显示可以每 10 毫秒刷新一次,在这种情况下花时间复制像素内存是没有意义的。 其次,有没有人知道我可以在我的应用程序中调整指向内存中像素缓冲区的低级指针并仍然使其推送到显示器的方法

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)