- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要以每秒不同的帧数显示图像,最大 FPS 为 30。图像来自 SD 卡,并且都具有相同的大小:480 x 640。我创建了 3 种可能的解决方案,但每个都有问题:
以下结果是 30 FPS。
我。不重复使用位图
CPU 负载:达到92%
private Bitmap bitmap;
private void startAnimation1() {
TimerTask updateImage = new UpdateImage1();
timer.scheduleAtFixedRate(updateImage, 0, 1000 / FPS);
}
class UpdateImage1 extends TimerTask {
@Override
public void run() {
try {
if (i == IMAGES_NR) {
i = 0;
}
bitmap = BitmapFactory.decodeStream(new FileInputStream(framesFiles[i]), null, null);
i++;
} catch (FileNotFoundException e) {
System.out.println("Exception 1: " + e.getMessage());
}
runOnUiThread(new Runnable() {
@Override
public void run() {
imgView.setImageBitmap(bitmap);
}
});
}
}
二。通过 BitmapFactory.Options.inBitmap 重用位图
运行动画一段时间后,应用程序崩溃了:
06-20 15:08:58.158: WARN/System.err(7880): java.lang.ArrayIndexOutOfBoundsException: length=-5131855; regionStart=0; regionLength=1024
06-20 15:08:58.158: WARN/System.err(7880): at java.util.Arrays.checkOffsetAndCount(Arrays.java:1731)
06-20 15:08:58.158: WARN/System.err(7880): at java.io.BufferedInputStream.read(BufferedInputStream.java:273)
06-20 15:08:58.158: WARN/System.err(7880): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
06-20 15:08:58.158: WARN/System.err(7880): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587)
06-20 15:08:58.158: WARN/System.err(7880): at com.example.SendPreviewOptimization.MyActivity$UpdateImage2.run(MyActivity.java:148)
06-20 15:08:58.158: WARN/System.err(7880): at java.util.Timer$TimerImpl.run(Timer.java:284)
06-20 15:08:58.168: DEBUG/skia(7880): ---- read threw an exception
06-20 15:08:58.168: DEBUG/skia(7880): --- decoder->decode returned false
06-20 15:08:58.168: WARN/System.err(7880): java.lang.IllegalArgumentException: Problem decoding into existing bitmap
06-20 15:08:58.168: WARN/System.err(7880): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:590)
06-20 15:08:58.168: WARN/System.err(7880): at com.example.SendPreviewOptimization.MyActivity$UpdateImage2.run(MyActivity.java:148)
06-20 15:08:58.168: WARN/System.err(7880): at java.util.Timer$TimerImpl.run(Timer.java:284)
06-20 15:08:58.178: ERROR/msm8960.hwcomposer(330): prepareBypass: Unable to setup bypass due to non-pmem memory
06-20 15:08:58.198: ASSERT/libc(7880): Fatal signal 11 (SIGSEGV) at 0xffd1d447 (code=1)
06-20 15:08:58.238: ERROR/msm8960.hwcomposer(330): prepareBypass: Unable to setup bypass due to non-pmem memory
06-20 15:08:58.498: ERROR/MP-Decision(1448): DOWN Ld:25 Ns:1.100000 Ts:190 rq:0.000000 seq:194.000000
06-20 15:08:58.708: INFO/DEBUG(27660): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
private static BitmapFactory.Options bitmapOptions;
private FileInputStream in;
private void startAnimation2() {
bitmapOptions = new BitmapFactory.Options();
// setup bitmap reuse options:
bitmapOptions.inPurgeable = true;
bitmapOptions.inInputShareable = true;
bitmapOptions.inBitmap = reusableBitmap;
bitmapOptions.inMutable = true;
bitmapOptions.inSampleSize = 1;
TimerTask updateImage = new UpdateImage2();
timer.scheduleAtFixedRate(updateImage, 0, 1000 / FPS);
}
class UpdateImage2 extends TimerTask {
@Override
public void run() {
try {
if (i == IMAGES_NR) {
i = 0;
}
//** version 1:
in = new FileInputStream(framesFiles[i]);
//decode into existing bitmap
BitmapFactory.decodeStream(in, null, bitmapOptions);
in.close();
//** version 2:
//BitmapFactory.decodeFile(framesFiles[i].getAbsolutePath(), bitmapOptions);
i++;
} catch (Exception e) {
System.out.println("Exception 2: " + e.getMessage());
}
runOnUiThread(new Runnable() {
@Override
public void run() {
imgView.setImageBitmap(reusableBitmap);
}
});
}
}
III.选项 III:使用缓冲区(使 Bytebuffer
更高效的一件事是使用直接内存。)
这个选项我无法让它工作:(
private ByteBuffer buffer;
private byte[] b;
private IntBuffer mPixels;
private void startAnimation3() {
buffer = ByteBuffer.allocate(480 * 640 * 6);
b = new byte[480 * 640 * 6];
TimerTask updateImage = new UpdateImage3();
timer.scheduleAtFixedRate(updateImage, 0, 1000 / FPS);
}
class UpdateImage3 extends TimerTask {
public void run() {
try {
if (i == IMAGES_NR) {
i = 0;
}
FileInputStream frameInputStream = new FileInputStream(framesFiles[i]);
frameInputStream.read(b);
buffer.wrap(b);
buffer.position(0);
reusableBitmap.copyPixelsFromBuffer(buffer);
frameInputStream.close();
i++;
} catch (Exception e) {
System.out.println("Exception 3: " + e.getMessage());
}
runOnUiThread(new Runnable() {
@Override
public void run() {
imgView.setImageBitmap(reusableBitmap);
}
});
}
}
private ByteBuffer copyToBuffer(Bitmap bitmap) {
int size = bitmap.getHeight() * bitmap.getRowBytes();
ByteBuffer buffer = ByteBuffer.allocateDirect(size);
bitmap.copyPixelsToBuffer(buffer);
return buffer;
}
在上述每个解决方案中,我在 logcat 中收到很多
ERROR/msm8960.hwcomposer(330): prepareBypass: Unable to setup bypass due to non-pmem memory
我不知 Prop 体是什么意思。
我以前没有使用过位图重用,不知道哪个是最好的解决方案。
我在这里添加了我创建的项目:https://www.dropbox.com/sh/3xov369u1bmjpd1/qBQax4t48D还有 2 帧/图像。
对 Neron T 的回答
我试过那个库:
//Option IV:
private AQuery aquery;
private void startAnimation4() {
aquery = new AQuery(this);
aquery.id(R.id.imgView);
TimerTask updateImage = new UpdateImage4();
timer.scheduleAtFixedRate(updateImage, 0, 1000 / FPS);
}
class UpdateImage4 extends TimerTask {
public void run() {
try {
if (i == 29) {
i = 0;
}
runOnUiThread(new Runnable() {
@Override
public void run() {
//load image from file, down sample to target width of 300 pixels
aquery.image(framesFiles[i],300);
}
});
i++;
} catch (Exception e) {
System.out.println("Exception 4: " + e.getMessage());
}
}
}
它没有像我预期的那样工作 - 我在每张照片前都有一个闪烁的效果。我想首先它会清除图片,然后再添加一张新图片:(
最佳答案
请注意,您不能从不是 UIThread(主线程)的线程内部修改 View ,请尝试使用 AsyncTasks。使用图像而无需考虑太多的简单方法是使用像 Android Query 这样的框架,看看 here .
关于android - 加载/显示位图的最快方式;重用位图的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17210524/
我想要显示正在加载的 .gif,直到所有内容都已加载,包括嵌入的 iframe。但是,目前加载 gif 会在除 iframe 之外的所有内容都已加载后消失。我怎样才能让它等到 iframe 也加载完毕
首先,这是我第一次接触 Angular。 我想要实现的是,我有一个通知列表,我必须以某种方式限制 limitTo,因此元素被限制为三个,在我单击按钮后,其余的应该加载。 我不明白该怎么做: 设置“ V
我正在尝试在我的设备上运行这个非常简单的应用程序(使用 map API V2),并且出于某种原因尝试使用 MapView 时: 使用 java 文件: public class MainMap e
我正在使用 Python 2.6、Excel 2007 Professional 和最新版本的 PyXLL。在 PyXLL 中加载具有 import scipy 抛出异常,模块未加载。有没有人能够在
我想做这个: 创建并打包原始游戏。然后我想根据原始游戏中的蓝图创建具有新网格/声音/动画和蓝图的其他 PAK 文件。原始游戏不应该知道有关其他网格/动画/等的任何信息。因此,我需要在原始游戏中使用 A
**摘要:**在java项目中经常会使用到配置文件,这里就介绍几种加载配置文件的方法。 本文分享自华为云社区《【Java】读取/加载 properties配置文件的几种方法》,作者:Copy工程师。
在 Groovy 脚本中是否可以执行条件导入语句? if (test){ import this.package.class } else { import that.package.
我正在使用 NVidia 视觉分析器(来自 CUDA 5.0 beta 版本的基于 eclipse 的版本)和 Fermi 板,我不了解其中两个性能指标: 全局加载/存储效率表示实际内存事务数与请求事
有没有办法在通过 routeProvider 加载特定 View 时清除 Angular JS 存储的历史记录? ? 我正在使用 Angular 创建一个公共(public)安装,并且历史会积累很多,
使用 Xcode 4.2,在我的应用程序中, View 加载由 segue 事件触发。 在 View Controller 中首先调用什么方法? -(void) viewWillAppear:(BOO
我在某些Django模型中使用JSONField,并希望将此数据从Oracle迁移到Postgres。 到目前为止,当使用Django的dumpdata和loaddata命令时,我仍然没有运气来保持J
创建 Nib 时,我需要创建两种类型:WindowNib 或 ViewNib。我看到的区别是,窗口 Nib 有一个窗口和一个 View 。 如何将 View Nib 加载到另一个窗口中?我是否必须创建
我想将多个env.variables转换为静态结构。 我可以手动进行: Env { is_development: env::var("IS_DEVELOPMENT")
正如我从一个测试用例中看到的:https://godbolt.org/z/K477q1 生成的程序集加载/存储原子松弛与普通变量相同:ldr 和 str 那么,宽松的原子变量和普通变量之间有什么区别吗
我有一个重定向到外部网站的按钮/链接,但是外部网站需要一些时间来加载。所以我想添加一个加载屏幕,以便外部页面在显示之前完全加载。我无法控制外部网站,并且外部网站具有同源策略,因此我无法在 iFrame
我正在尝试为我的应用程序开发一个Dockerfile,该文件在初始化后加载大量环境变量。不知何故,当我稍后执行以下命令时,这些变量是不可用的: docker exec -it container_na
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我刚刚遇到一个问题,我有一个带有一些不同选项的选择标签。 现在我想检查用户选择了哪些选项。 然后我想将一个新的 html 文件加载到该网站(取决于用户选中的选项)宽度 javascript,我该怎么做
我知道两种保存/加载应用程序设置的方法: 使用PersistentStore 使用文件系统(存储,因为 SDCard 是可选的) 我想知道您使用应用程序设置的做法是什么? 使用 PersistentS
我开始使用 Vulkan 时偶然发现了我的第一个问题。尝试创建调试报告回调时(验证层和调试扩展在我的英特尔 hd vulkan 驱动程序上可用,至少它是这么说的),它没有告诉我 vkCreateDeb
我是一名优秀的程序员,十分优秀!