jjzjj

java - Bitmap.Config.HARDWARE 与 Bitmap.Config.RGB_565

coder 2023-05-15 原文

API 26 adds new option Bitmap.Config.HARDWARE:

Special configuration, when bitmap is stored only in graphic memory. Bitmaps in this configuration are always immutable. It is optimal for cases, when the only operation with the bitmap is to draw it on a screen.

文档中未解释的问题:

  1. 我们是否应该总是更喜欢 Bitmap.Config.HARDWARE Bitmap.Config.RGB_565 当速度是重中之重和质量时 和可变性不是(例如缩略图等)?
  2. 使用此选项解码后的像素数据实际上是不是 消耗任何堆内存并仅驻留在 GPU 内存中?如果是这样,这似乎 终于可以缓解 OutOfMemoryException 的担忧了 处理图像。
  3. 与 RGB_565、RGBA_F16 或 ARGB_8888 相比,我们应该期待什么质量 从这个选项?
  4. 解码本身的速度与 用 RGB_565 解码?
  5. (感谢@CommonsWare 在评论中指出) 如果我们在使用它解码图像时超出 GPU 内存,就会发生这种情况 选项?是否会抛出一些异常(可能是相同的 OutOfMemoryException :)?

最佳答案

文档和公共(public)源代码尚未推送到 Google's git .因此,我的研究仅基于部分信息、一些实验以及我自己将 JVM 移植到各种设备的经验。

我的测试创建了大型可变位图,并通过单击按钮将其复制到新的硬件位图中,并将其添加到位图列表中。在它崩溃之前,我设法创建了几个大型位图实例。

我可以在 android-o-preview-4 中找到它git 推送:

+struct AHardwareBuffer;
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLClientBuffer eglGetNativeClientBufferANDROID (const struct AHardwareBuffer *buffer);
+#else
+typedef EGLClientBuffer (EGLAPIENTRYP PFNEGLGETNATIVECLIENTBUFFERANDROID) (const struct AHardwareBuffer *buffer);

寻找 documentation of AHardwareBuffer ,在后台它正在创建一个由 ANativeWindowBuffer 支持的 EGLClientBuffer Android 共享内存(“ashmem”)中的( native 图形缓冲区)。但实际实现可能因硬件而异。

关于问题:

  1. Should we ALWAYS prefer now Bitmap.Config.HARDWARE over Bitmap.Config.RGB_565...?

对于 SDK >= 26,HARDWARE 配置可以通过防止每次相同的位图返回屏幕时都需要将像素数据复制到 GPU 来改进低级位图绘制。我想它可以防止在将位图添加到屏幕时丢失一些帧。

内存不计入您的应用程序,我的测试证实了这一点。

native 库文档说如果内存分配不成功,它将返回 null。 如果没有源代码,则不清楚 Java 实现(API 实现者)在这种情况下会做什么——它可能决定抛出 OutOfMemoryException 或回退到不同类型的分配。

更新:实验表明没有抛出 OutOfMemoryException。虽然分配成功 - 一切正常。分配失败后 - 模拟器崩溃(刚刚消失)。在其他情况下,我在应用内存中分配位图时遇到了一个奇怪的 NullPointerException

由于不可预测的稳定性,我目前不建议在生产中使用这个新 API。至少没有经过广泛的测试。

  1. Does pixel data after decoding using this option actually NOT consume ANY heap memory and resides in GPU memory only? If so, this seems to finally be a relief for OutOfMemoryException concern when working with images.

像素数据将在共享内存中(可能是纹理内存),但在 Java 中仍有一个小的 Bitmap 对象引用它(因此“ANY”不准确)。

每个供应商都可以决定以不同的方式实现实际分配,这不是他们所绑定(bind)的公共(public) API。 所以 OutOfMemoryException 可能仍然是一个问题。我不确定如何正确处理。

  1. What quality compared to RGB_565/ARGB_8888?

HARDWARE 标志不是关于质量,而是关于像素存储位置。由于配置标志不能是 OR-ed,我想默认 (ARGB_8888) 用于解码。

(实际上,HARDWARE 枚举对我来说似乎是一个 hack)。

  1. Is speed of decoding itself the same/better/worse...?

HARDWARE 标志似乎与解码无关,因此与 ARGB_8888 相同。

  1. What would happen if we exceed GPU memory?

当内存耗尽时,我的测试结果非常糟糕。 模拟器有时会严重崩溃,在其他情况下我会遇到意想不到的不相关的 NPE。没有发生 OutOfMemoryException,也无法判断 GPU 内存何时耗尽,因此无法预见这一点。

关于java - Bitmap.Config.HARDWARE 与 Bitmap.Config.RGB_565,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45511017/

有关java - Bitmap.Config.HARDWARE 与 Bitmap.Config.RGB_565的更多相关文章

  1. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  2. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

  3. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  4. ruby - Rails 3 的 RGB 颜色选择器 - 2

    状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基

  5. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  6. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  7. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  8. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  9. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  10. java - 为什么 ruby​​ modulo 与 java/other lang 不同? - 2

    我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.

随机推荐