Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:分配一个图形一次,在屏幕上移动它而不重写像素_Android_Memory Management_Android Ndk_Rendering_Android Source - Fatal编程技术网

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

Android:分配一个图形一次,在屏幕上移动它而不重写像素,android,memory-management,android-ndk,rendering,android-source,Android,Memory Management,Android Ndk,Rendering,Android Source,我有一个谷歌像素4,根,我有AOSP代码建设成功。在安卓应用程序中,我想使用超大内存(可能是1080x2280屏幕的4倍),并在缓冲区的中间绘制一个简单的图形(例如,一个正方形)。然后,在每一帧上,我只想在缓冲区上滑动指针,使其看起来像正方形在屏幕上移动一样(因为缓冲区的其余部分将是空白的) 我不确定这是否可行。到目前为止,我有一个完全本地的Android应用程序。在ANDROIDIN主()的开头,我把一个区域4x和屏幕一样大,然后画中间的一个红场。在每一帧上,我呼叫 ANativeWindow

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

我不确定这是否可行。到目前为止,我有一个完全本地的Android应用程序。在ANDROIDIN主()的开头,我把一个区域4x和屏幕一样大,然后画中间的一个红场。在每一帧上,我呼叫

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

ANativeWindow_unlockAndPost()
释放CPU访问并将缓冲区张贴到显示器上

但是,我正在尝试以尽可能快的速度渲染。屏幕上有2462400个像素(每个2个字节),因此memcpy为每个帧复制5MB的数据,这需要10毫秒。因此,我想避开memcpy,访问指向dma_buf的原始指针,或者Gralloc3最初为GraphicBuffer分配的任何东西(ANativeWindow基本上只是一个使用GraphicBuffer的曲面,它使用GraphicBufferMapper,它在gralloc中使用GrallocMapper)。这是复杂的,因为系统似乎是三重缓冲,将三个gralloced缓冲区放在BufferQueue中并在它们之间旋转

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

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

使用Linux直接渲染管理器,我可以通过关闭SurfaceFlinger并映射一些内存,直接在C文件中写入显示器。看我的演示。因此,如果我关闭Android框架,我可以完成我想做的事情。但我想让安卓系统跟上,因为我希望在我的应用程序中使用加速计和其他API。(目标是使用加速计读数尽可能快地稳定显示屏上的文字。)这也很烦人,因为再次启动显示屏服务器会导致某种重新启动

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

你真正想做什么?问题太长了,但目标和您已经在做的事情还不是很清楚。ANativeWindow_缓冲区已经为您提供位/宽度/高度/步幅,您可以修改ANativeWindow_缓冲区中的任何像素。那你还想要什么?你真正想要做什么?问题太长了,但目标和您已经在做的事情还不是很清楚。ANativeWindow_缓冲区已经为您提供位/宽度/高度/步幅,您可以修改ANativeWindow_缓冲区中的任何像素。那你还想要什么?