gpt4 book ai didi

android 快速像素访问和操作

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:59:09 26 4
gpt4 key购买 nike

我正在尝试将我用 java 编写的模拟器移植到 android。一切进展顺利,我能够通过微小的更改移植我的大部分代码,但是由于仿真的工作原理,我需要在像素级别渲染图像。

至于我用的桌面java

int[] pixelsA = ((DataBufferInt) src.getRaster().getDataBuffer()).getData(); 

它允许我获取对像素缓冲区的引用并动态更新它(最小化对象创建)

目前这是我的安卓模拟器对每一帧所做的

@Override
public void onDraw(Canvas canvas)
{
buffer = Bitmap.createBitmap(pixelsA, 256, 192, Bitmap.Config.RGB_565);
canvas.drawBitmap(buffer, 0, 0, null);

}

pixelsA是一个int[]数组,pixelsA包含了所有的颜色信息,所以每一帧都需要创建一个位图对象

buffer = Bitmap.createBitmap(pixelsA, 256, 192, Bitmap.Config.RGB_565);

我认为这是相当昂贵和缓慢的。

有什么方法可以用 Canvas 高效地绘制像素吗?

最佳答案

一个非常低级的方法,但对我来说效果很好(使用 native 代码):

创建 Bitmap 对象,与您的可见屏幕一样大。同时创建一个 View 对象并实现 onDraw 方法。

然后在本地代码中加载 libjnigraphics.so 本地库、查找函数 AndroidBitmap_lockPixelsAndroidBitmap_unlockPixels。这些函数在 Android 源代码中的 bitmap.h 中定义。

然后您将在位图上调用锁定/解锁,接收原始像素的地址。您必须根据实际情况(16 位 565 或 32 位 8888)解释像素的 RGB 格式。

更改位图内容后,您希望将其显示在屏幕上。在您的 View 上调用 View.invalidate()。在它的 onDraw 中,将您的位图 blit 到给定的 Canvas

此方法非常低级,依赖于 Android 的实际实现,但速度非常快,您可以毫无问题地获得 60fps。

bitmap.h 自平台版本 8 起就是 Android NDK 的一部分,因此这是从 Android 2.2 开始执行此操作的官方方法。

关于android 快速像素访问和操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7593810/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com