我正在尝试将我用 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_lockPixels
和 AndroidBitmap_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/