- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这在一小部分是一个问题(因为我不明白为什么它会有所不同),在很大程度上是一篇希望能帮助其他一些可怜的程序员的帖子。
我有一个代码库,是我大约 5-7 年前第一次开始 Android 编程时编写的,它具有将文件读入内存(用于很多事情)的功能,以及加载功能来自 .png 文件的位图。后一个函数使用“读取文件”函数将文件中的字节读入字节数组,然后从中创建位图。我知道这不是真正干净的代码,也可能不是最好的方法,但它有效,为什么要搞砸一些有效的东西?
除了... Android(尤其是 Oreo)的最后几个版本导致我的应用程序中的绘图(来自位图)真的变慢了 WAYYYYYY。我挣扎了好几天,试图弄清楚发生了什么,最后偶然发现了一个修复程序……我不明白。
这是“将 .png 文件加载到位图中”功能的核心(原样)。请注意,整个“if-for-for”透明度内容可能会被完全忽略,这是将一种或两种颜色的像素转换为透明像素的特殊情况。在此 block 的入口处,.png 文件已被读入“位”。
BitmapFactory.Options bfo = new BitmapFactory.Options();
bfo.inPreferredConfig = Bitmap.Config.valueOf("ARGB_8888");
Bitmap imbm = BitmapFactory.decodeByteArray(bits, 0, flen, bfo);// this makes an IMmutable bitmap
bits = null;
System.gc();
Bitmap bm = imbm.copy(Bitmap.Config.valueOf("ARGB_8888"), true);// convert it to a MUTABLE bitmap
imbm.recycle();
imbm = null;
w = bm.getWidth();
h = bm.getHeight();
// do transparency stuff
if (transX1 >= 0 && transX1 < w && transY1 >= 0 && transY1 < h) {
clr1 = bm.getPixel(transX1, transY1);
clr2 = bm.getPixel(transX2, transY2);
for (y = 0; y < h; y++) {
for (x = 0; x < w; x++) {
clr = bm.getPixel(x, y);
// convert any 0x00818181 (middle-gray) pixels to 0x00808080
// so that 0x00818181 is guaranteed to never be used in customer-created bitmaps
if (clr1 != 0xFF818181 && clr == 0xFF818181) bm.setPixel(x, y, 0xFF808080);
else if (clr == clr1 || clr == clr2) bm.setPixel(x, y, clr & 0x00000000);
}
}
}
System.gc(); // request garbage-collection to try to avoid out-of-memory when loading/creating bitmap
return bm;
返回的位图随后被用作使用 dC.drawBitmap(bm, sRect, dRect, kPaint) 将点点滴滴绘制到上下文中的源。但是,Android 的变化导致速度减慢。修复结果是用这段代码替换上面最后的“return bm”:
Bitmap tBM = Bitmap.createBitmap(w, h, Bitmap.Config.valueOf("ARGB_8888"));
Rect sRect = new Rect();
Rect dRect = new Rect();
sRect.set(0, 0, w, h);
dRect.set(0, 0, w, h);
Canvas dC = new Canvas(tBM);
dC.drawBitmap(bm, sRect, dRect, kPaint);
dC = null;
bm = null;
return tBM;
换句话说,它只是采用先前版本生成的“bm”位图,创建另一个相同大小的位图,将“bm”绘制到新位图中,然后返回新位图而不是先前版本。
关于以前构建位图的方法似乎使它处于“错误的形式”,这使得从中绘制非常慢,同时对它执行 createBitmap() 和 drawBitmap() 会生成一个位图,您可以绘制速度非常快。
知道为什么会这样吗? (是的,我尝试了所有常见的 RGB_565 东西,等等)这很有效。但是,如果我了解为什么会发生这种情况,那就太好了,就像我说的那样,我的努力可能对将来的某些人有用。
最佳答案
我的怀疑是正确的,减速是由 decodeByteArray()(某种程度上)引起的。
首先,随着更多的研究(以及高龄和知识),我意识到通过设置 BitmapFactory.Options.inMutable=true 可以更容易地解决不可变/可变问题。
但是,问题的真正解决方案是将代码的“核心”更改为:
BitmapFactory.Options bfo = new BitmapFactory.Options();
bfo.inPreferredConfig = Bitmap.Config.valueOf("ARGB_8888");
bfo.inMutable = true; // this makes an mutable bitmap
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
bfo.inPreferredColorSpace = ColorSpace.get(ColorSpace.Named.SRGB);
}
Bitmap bm = BitmapFactory.decodeByteArray(bits, 0, flen, bfo);
bits = null;
换句话说,我摆脱了上面提到的不可变/可变位图副本,然后我测试在 Oreo 或更高版本上运行,如果是,则设置 inPreferredColorSpace 成员。这是在 Oreo (API 26) 中添加的。当他们添加类似的东西时,我会认为它会被设置为一个合理的默认值,我想它是,但显然不能很好地将位图绘制到显示器上。默认值为“null”,但将其更改为 SRGB 足以使我从生成的位图闪电般快速地绘制到显示器上,所以我假设(总是危险的)这个色彩空间问题是由 kludge 解决的我在原始帖子中所做的位图的副本。
关于android - 位图创建和绘制速度慢...快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48835147/
我想填充 3D 等高线图 (contour3(X,Y,Z)),就像 2D 等高线填充图 (contourf(X,Y,Z))。但我无法弄清楚如何实现这一目标。 contour3 和 surf 的组合不是
我有一个 c3.js 折线图,表示 2 个值的演变。我需要折线图的工具提示是饼图(工具提示 = 另一个 c3.js 图形)。 这是我成功的: http://jsfiddle.net/owhxgaqm/
我有具有结构的 Pandas 数据框: A B 0 1 1 1 2 1 2 3 4 3 3 7 4 6 8 如何生成 Seaborn Violin 图,每列作为其自己的单独
我正在使用 D3DXSPRITE 方法将我的 map 图 block 绘制到屏幕上,我刚刚添加了一个缩放功能,当您按住向上箭头时会放大,但注意到您现在可以看到图 block 之间的间隙,这是一些屏幕截
1、系统环境如下图: 2、为该系统添加一块新的虚拟硬盘,添加后需重启虚拟机,否则系统不识别;如下图,/dev/sdc 是新添加的硬盘; 3、fdisk /dev/sdc为新硬盘创建分区:
1、nagios简介 nagios是一款开源的电脑系统和网络监视工具,能有效监控windows、linux和unix的主机状态,交换机路由器等网络设置,打印机等。在系统或服务状态异常时发
越来越多人开始习惯用手机上网,浏览网页、查看邮件···移动化已经成为互联网发展必然趋势,包括facebook在内的很多互联网公司都将移动广告作为下一个淘金地
1.图片处理 1.圆角图片 复制代码 代码如下: /** * 转换成圆角 * &n
Microsoft SQL Server Management Studio是SQL SERVER的客户端工具,相信大家都知道。我不知道大伙使用导入数据的情况怎么样,反正我最近是遇到过。主要是因为没
debian6系统: 首先先安装mysql吧: 打开终端(root)用户登入 apt-get purge mysql-server-5.5 安装完成后: 默认情况下Mysql只允许本地登录
fedora16英文环境下支持中文输入法的方法 fedora16英文环境下支持FCITX的中文输入法: $ im-chooser 就会出现选择界面,选择第二个就行了。
Net预编译命令 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe -? 显示说明 我们需要选择的命令为&n
有的时候电脑出现一些故障有的时候通过将其修改bios设置的方法来解决故障,那么在bios上设置能不能将电脑恢复出厂设置呢?其实也是可以的。方法也很简单的,只要会进入电脑的bios懂的上面英文的意思就
笔者曾介绍过Deepin 将对龙芯进行全面支持,打造最优美龙芯电脑桌面。现在Deepin团队移植工作取得了突破性的成果,Deepin桌面已经在龙芯3A和龙芯3B电脑上成功运行起来了。 以下为龙芯3
在安装一些软件之后,我们的电脑总是会发生一点小变化,不是桌面上多了几个网址图标,就是IE浏览器的默认主页被篡改成乱七八糟的网址。最可气的是,在IE设置中将默认主页改回来后,下次启动Win7后又变了回
“注册表编辑器怎么打开”虽说不是很难的问题,但是对于对电脑常识不是很擅长的网民来说,当电脑出现问题或需要更改设置时,着实还是件头疼的问题。因为需要打开注册表进行操作解决。那么如何打开注册表编辑器呢?
这篇文章重点介绍10个重要的WordPress安全插件和技巧,用来保护WordPress网站或者博客。 1. WP Security 人工帮助你修复被黑客入侵的网站,只要按照他们网站上的联系电话
其实运用object和javascript调用外部文件,也能实现不同栏目调用不同友情链接,即相当于调用不同栏目友情链接文件, {dede:field.typeid/}来获取当前栏目的ID。
我有一个复值矩阵。 如果我发出命令: plot(myMatrix) 然后它在图形设备上显示一种散点图,X 轴标记为 Re(myMatrix),Y 轴标记为 Im(myMatrix)。这显示了我正在寻找
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
我是一名优秀的程序员,十分优秀!