谨慎使用android.view.SurfaceView.setVisibility方法

谨慎使用android.view.SurfaceView.setVisibility方法

why?

原因就是此方法会导致native的内存暴增,前提条件你使用surfaceview去绘制一些复杂的3D图形,绘制复杂、业务复杂的场景;
setVisibility方法会调用surfaceView的updateSurface,而此方法内部就可能会分配大量的native内存

分析

查看 updateSurface源码:

 /** @hide */
protected void updateSurface() {final boolean formatChanged = mFormat != mRequestedFormat;final boolean visibleChanged = mVisible != mRequestedVisible;final boolean creating = (mSurfaceControl == null || formatChanged || visibleChanged)&& mRequestedVisible;.....if (creating) {viewRoot.createBoundsSurface(mSubLayer);mSurfaceSession = new SurfaceSession();mDeferredDestroySurfaceControl = mSurfaceControl;updateOpaqueFlag();final String name = "SurfaceView - " + viewRoot.getTitle().toString();mSurfaceControl = new SurfaceControl.Builder(mSurfaceSession).setName(name).setOpaque((mSurfaceFlags & SurfaceControl.OPAQUE) != 0).setBufferSize(mSurfaceWidth, mSurfaceHeight).setFormat(mFormat).setParent(viewRoot.getSurfaceControl()).setFlags(mSurfaceFlags).build();mBackgroundControl = new SurfaceControl.Builder(mSurfaceSession).setName("Background for -" + name).setOpaque(true).setColorLayer().setParent(mSurfaceControl).build();} else if (mSurfaceControl == null) {return;}.....
}

如上函数,重点在于满足creating为true的情况下new SurfaceControl.Builder,在这个builder里面,会直接创建SurfaceControl对象,在SurfaceControl构造方法中有一个:

private SurfaceControl(SurfaceSession session, String name, int w, int h, int format, int flags,SurfaceControl parent, SparseIntArray metadata){mNativeObject = nativeCreate(session, name, w, h, format, flags,parent != null ? parent.mNativeObject : 0, metaParcel);
}

nativeCreate是一个native方法,在native层的代码如下:

static jlong nativeCreate(JNIEnv* env, jclass clazz, jobject sessionObj,jstring nameStr, jint w, jint h, jint format, jint flags, jlong parentObject,jobject metadataParcel) {....SurfaceControl *parent = reinterpret_cast<SurfaceControl*>(parentObject);sp<SurfaceControl> surface;......status_t err = client->createSurfaceChecked(String8(name.c_str()), w, h, format, &surface, flags, parent, std::move(metadata));.....return reinterpret_cast<jlong>(surface.get());
}status_t SurfaceComposerClient::createSurfaceChecked(const String8& name, uint32_t w, uint32_t h,PixelFormat format,sp<SurfaceControl>* outSurface, uint32_t flags,SurfaceControl* parent,LayerMetadata metadata) {sp<SurfaceControl> sur;status_t err = mStatus;if (mStatus == NO_ERROR) {sp<IBinder> handle;sp<IBinder> parentHandle;sp<IGraphicBufferProducer> gbp;if (parent != nullptr) {parentHandle = parent->getHandle();}err = mClient->createSurface(name, w, h, format, flags, parentHandle, std::move(metadata),&handle, &gbp);.....}return err;
}

到这里就不继续往下分析,不过也不难看出就是要重新创建一个surface,上面的createSurfaceChecked方法中的“IGraphicBufferProducer”代码就是分配对应的图像内存的例证;所以从上surfaceView的setVisibility方法很有可能就在native层分配内存,如果频繁调用setVisibility方法,而又没做好回收工作,就极有可能使内存暴增,系统和应用奔溃,出现android.view.Surface$OutOfResourcesException异常

如果频繁setVisiviblity方法分配内存,系统会将当前surface对象之前分配的内存回收掉吗?

看了SurfaceView的updateSurface函数,里面有将之前创建的SurfaceControl回收掉,但是回收掉有一些列条件,比较复杂,我也没去深入的研究,有兴趣的可以自行去分析;

总结:在项目中如果没有存在内存泄露,而内存暴增又来源于native,可以参考是否来源于surfaceview;当然native也不仅限于此,还有其他的共享内存、自己代码的业务内存等,要多方面综合考虑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/199955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python自动化——driver.switch_to的用法

driver.switch_to的用法 from selenium import webdriver driver webdriver.Chrome(/path/to/chromedriver) # Chrome driver.get(https://www.example.com) # 打开网页 element driver.find_element_by_id(element_id) # 查找元素记得在不需要使用 driver 时&#xff0c…

Android 使用aapt工具获取apk信息

aapt 工具的官网说明 https://developer.android.google.cn/studio/command-line/aapt2?hlzh_cn 功能有很多&#xff0c;本篇记录怎么使用aapt工具获取apk信息。 在 Aosp 源码下&#xff0c; 执行 source 、lunch 后&#xff0c;直接输入 aapt 就可以使用了。 不执行 sour…

CAPL接口

浮点和整形之间转换 interpretAsDword()//float转dword interpretAsFloat()//dword转float interpretAsQword()//double转qword interpretAsDouble()//gword转double常用字符串函数 strlen()//字符串长度 elCount()//数组的定义长度 strncat()//将源字符串拼接到到目的字符串…

日志JavaAgent-NoClassDefFoundError

一、引言 组内最近做了一个日志公共组件&#xff0c;用的是javaagent的方式&#xff0c;之前搞的maven jar包每次都要把所有系统都发一遍&#xff0c;太麻烦。 javaagent通过Java虚拟机&#xff08;JVM&#xff09;的Instrumentation API来实现代码的侵入。通过Instrumentation…

GNN Maximum Flow Problem (From Shusen Wang)

Maximum Flow Problem ShusenWang 图数据结构和算法课程笔记 Slides Maximum Flow Problem Description Naive Algorithm Residual Capacity - FlowLeft: Original GraphRight: Residual Graph - Bottleneck capacity 2- Iteration 2:- Find an augmenting path: s -&g…

HTTP会话技术---Cookie、Session和Token介绍及它们在JavaWeb中的使用

当涉及到Web应用程序的身份验证和状态管理时&#xff0c;我们通常会使用到Cookie、Session和Token这些会话技术。下面是对它们的介绍&#xff0c;并在JavaWeb中的示例 Cookie&#xff08;HTTP Cookie&#xff09; Cookie是一种存储在用户浏览器中的小型文本文件&#xff0c;由…

python import 顺序以及自动实现import 顺序更改

核心风格: import 语句的模块顺序 我们推荐所有的模块在 Python 模块的开头部分导入。 而且最好按照这样的顺序: 1. Python 标准库模块 2. Python 第三方模块 3. 应用程序自定义模块 Isort 自动整理 import 的超实用工具教程-CSDN博客 使用isort实现import的自动排序 1.安装…

基于Springboot的在线问卷调查系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的在线问卷调查系统(有报告)。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring…

1-4节电池升降压充电IC解决方案

描述 MP2760是一款集成窄电压DC&#xff08;NVDC&#xff09;电源路径管理功能和USB On-the-Go(OTG)功能的升降压充电IC&#xff0c;兼容USB PD&#xff0c;适用于单节至4节串联的电池包应用。该芯片的充电输入电压范围广&#xff0c;可支持最高22V。 当启用电池放电模式&…

深入学习Synchronized各种使用方法

文章目录 前言一、synchronized关键字通用在下面四个地方&#xff1a;1.1synchronized修饰实例方法1.2synchronized修饰静态方法&#xff1a;1.3synchronized修饰实例方法的代码块1.4synchronized修饰静态方法的代码块2.读入数据 二.Sychronized关键特性2.1互斥2.2 刷新内存2.3…

CentOS 7 虚拟机java项目部署tomcat

首先安装java环境 下载安装包:jdk-19_linux-x64_bin.tar.gz_免费高速下载|百度网盘-分享无限制 (baidu.com) 将安装包上传到虚拟机 解压 tar zxvf jdk-19_linux-x64_bin.tar.gz 移动文件到 mv jdk-19.0.1 /usr/jdk-19.0.1 编辑配置文件 vim /etc/profile export JAVA…

selenium原理

selenium执行条件 1、测试脚本。可以是python、java等语言编写的测试脚本&#xff1b; 2、浏览器驱动&#xff08;webdriver&#xff09;。不同的版本、不同的浏览器都需要对应的驱动&#xff1b; 3、浏览器 测试脚本 执行原理 1、cmd命令&#xff0c;启动chromedriver.exe…

SAP-PP:PP顾问管理系统的相关建议

本博客将探讨生产计划领域的控制要点。这将有助于减少仓库库存不准确情况&#xff0c;因为库存不准确会导致实物库存、发货、成本核算和计划方面出现许多效率低下的问题。 在物料主数据关键字段中&#xff0c;必须配置计划交货时间、GR处理时间、内部生产时间、计划交货时间&a…

解决cad找不到msvcr100.dll的有效方法,完美修复dll问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是由于找不到msvcr100.dll文件而导致CAD软件无法正常运行的情况&#xff0c;系统无法找到所需的动态链接库文件。但是通过一些简单的解决方法&#xff0c;我们可以快速解决这个问题并继续我们的…

【动态规划】LeetCode-62.不同路径

&#x1f388;算法那些事专栏说明&#xff1a;这是一个记录刷题日常的专栏&#xff0c;每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目&#xff0c;在这立下Flag&#x1f6a9; &#x1f3e0;个人主页&#xff1a;Jammingpro &#x1f4d5;专栏链接&…

java -jar后台启动jar包

Linux系统启动&#xff08;后台&#xff09; nohup java -jar springboot-0.0.1-SNAPSHOT.jar & 查看日志 tail -500f nohup.out 查看进程号 ps -ef | grep java 关闭 kill -9 [进程号] Windows系统 java -jar springboot-0.0.1-SNAPSHOT.jar & Ctrlc或者关…

Flink之复杂事件处理CEP

复杂事件处理CEP Flink CEP基本使用添加依赖定义匹配模式定义匹配结果验证 模式Pattern API单个模式量词条件 组合模式跳过策略模式组匹配结果 应用示例自定义消息事件自定义Pattern测试 Flink CEP Flink的CEP (Complex Event Processing) 是指Flink提供的一种用于处理复杂事件…

ubuntu1804安装jupyter中的js环境

参考&#xff1a; https://github.com/n-riesco/ijavascript http://n-riesco.github.io/ijavascript/#installation https://github.com/n-riesco/ijavascript/issues/241 https://www.tomche.space/post/using-javascript-kernel-in-vscode-jupyter-notebooks/ https://w…

淘宝商品详情接口在电商运营中的应用实例

一、背景 某电商企业A在运营过程中&#xff0c;发现手动更新商品信息效率低下&#xff0c;且容易出现信息不一致的情况。为了解决这个问题&#xff0c;企业A决定采用淘宝商品详情接口&#xff0c;实现商品信息的自动获取和更新。 二、目标 通过集成淘宝商品详情接口&#xf…

HNU-计算机网络-讨论课2

第二次 有关网络智能、安全以及未来网络的讨论 一、必选问题&#xff08;每组自由选择N个&#xff0c;保证组内每人负责1个&#xff09; 网络的发展促进信息的传播&#xff0c;极大提高了人类的感知能力&#xff0c;整个世界都被纳入人类的感知范围。但人们对信息系统以及数据…