afr*_*100 9 android image pixel draw android-canvas
我正在尝试将我用java编写的模拟器移植到android.事情进展顺利,我能够通过微小的更改移植我的大部分代码,但由于仿真的工作方式,我需要在像素级渲染图像.
至于我使用的桌面java
int[] pixelsA = ((DataBufferInt) src.getRaster().getDataBuffer()).getData();
Run Code Online (Sandbox Code Playgroud)
这允许我获得对像素缓冲区的引用并动态更新它(最小化对象创建)
目前这是我的android模拟器为每一帧做的
@Override
public void onDraw(Canvas canvas)
{
buffer = Bitmap.createBitmap(pixelsA, 256, 192, Bitmap.Config.RGB_565);
canvas.drawBitmap(buffer, 0, 0, null);
}
Run Code Online (Sandbox Code Playgroud)
pixelsA是一个数组int [],pixelsA包含所有颜色信息,因此每个帧都需要通过执行来创建一个位图对象
buffer = Bitmap.createBitmap(pixelsA, 256, 192, Bitmap.Config.RGB_565);
Run Code Online (Sandbox Code Playgroud)
我认为这是相当昂贵和缓慢的.
有没有办法用画布有效地绘制像素?
Poi*_*ull 10
一个非常低级的方法,但对我来说工作正常(使用本机代码):
创建Bitmap与可见屏幕一样大的对象.还要创建一个View对象和实现onDraw方法.
然后在本机代码中,您将加载libjnigraphics.so本机库,查找函数AndroidBitmap_lockPixels和AndroidBitmap_unlockPixels.这些函数在bitmap.h中的Android源代码中定义.
然后你在位图上调用锁定/解锁,接收原始像素的地址.您必须根据实际情况(16位565或32位8888)解释RGB格式的像素.
更改位图的内容后,您希望在屏幕上显示此内容.打电话View.invalidate()给你View.在其中onDraw,将您的位图blit到给定的位置Canvas.
这个方法水平很低,并且依赖于Android的实际实现,但是它非常快,你可能得到60fps没问题.
bitmap.h是Android NDK自平台版本8以来的一部分,因此这是从Android 2.2执行此操作的官方方式.
不要每次都重新创建位图。尝试这样的事情:
Bitmap buffer = null;
@Override
public void onDraw(Canvas canvas)
{
if(buffer == null) buffer = Bitmap.createBitmap(256, 192, Bitmap.Config.RGB_565);
buffer.copyPixelsFromBuffer(pixelsA);
canvas.drawBitmap(buffer, 0, 0, null);
}
Run Code Online (Sandbox Code Playgroud)
编辑:正如所指出的,您需要更新像素缓冲区。并且位图必须是可变的才能发生这种情况。
| 归档时间: |
|
| 查看次数: |
12769 次 |
| 最近记录: |