当前位置: 首页 > news >正文

Android离屏渲染

写在前面

与iOS同事聊天时聊到圆角会使用离屏渲染的方式绘制,影响性能;Android上有没有不知道,学习了一下整理了这篇文章。


Android 圆角与离屏渲染(Offscreen Rendering)

一、什么是离屏渲染?

离屏渲染是指系统在显示内容前,先渲染到临时缓冲区(Offscreen Buffer),再合成到屏幕的过程。它会增加 GPU 负载,可能导致卡顿、掉帧或耗电增加。

二、圆角是否会触发离屏渲染?

取决于实现方式

实现方案是否离屏渲染?性能影响适用场景
GradientDrawable❌ 否最优纯色/渐变背景圆角
ViewOutlineProvider❌ 否最优API 21+ 的任意视图圆角
Canvas.clipPath()✅ 是自定义 View 中的复杂裁剪
Paint.setShadowLayer()✅ 是自定义阴影
Xfermode/BitmapShader✅ 是图片叠加/遮罩效果
三、为什么离屏渲染会影响性能?
  1. 额外内存操作:GPU 需多次读写离屏缓冲区。
  2. 合成开销:最终渲染需合并多个缓冲层。
  3. 高频场景卡顿:如列表滚动、动画中易掉帧。
四、如何检测离屏渲染?
  1. 开发者工具
    • GPU 渲染分析(Profile GPU Rendering):观察 Draw/Prepare 阶段耗时。
    • Debug GPU Overdraw:离屏渲染区域可能显示为红色。
  2. Systrace/Perfetto:分析 drawFrame 中的 performTraversals 耗时。
  3. Android Studio Layout Inspector:检查视图层级和渲染方式。
五、优化圆角的最佳实践
推荐方案(无离屏渲染)
  1. 背景圆角
    // 方法1:GradientDrawable
    val shape = GradientDrawable().apply {cornerRadius = 16fsetColor(Color.BLUE)
    }
    view.background = shape// 方法2:ViewOutlineProvider(API 21+)
    view.outlineProvider = ViewOutlineProvider.BACKGROUND
    view.clipToOutline = true
    
  2. 图片圆角
    • 使用 ImageView + ViewOutlineProvider
    • Glide 加载时启用硬件加速圆角:
      Glide.with(context).load(url).transform(RoundedCorners(16)).into(imageView)
      
应避免的方案
// 反例1:Canvas.clipPath() 触发离屏渲染
override fun onDraw(canvas: Canvas) {val path = Path().apply {addRoundRect(0f, 0f, width.toFloat(), height.toFloat(), 16f, 16f, Path.Direction.CW)}canvas.clipPath(path) // 性能陷阱!super.onDraw(canvas)
}// 反例2:Xfermode 离屏渲染
val paint = Paint().apply {xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
}
canvas.drawBitmap(roundedMask, 0f, 0f, paint)
六、其他常见场景优化
场景推荐方案避免方案
阴影elevation + outlineProvidersetShadowLayer
遮罩效果预合成 Bitmap 或 BitmapShaderXfermode
复杂动画使用 ViewPropertyAnimator手动 onDraw 中计算效果
七、总结
  • 离屏渲染的核心问题:GPU 无法直接处理复杂效果,需临时缓冲。
  • 优化关键:优先使用系统原生支持(如 ViewOutlineProvider)。
  • 检测工具:GPU 渲染分析、Systrace、Overdraw 调试。

通过合理选择实现方式,可显著提升 UI 流畅度! 🚀


Android离屏渲染实现原理详解(以圆角为例)

一、离屏渲染的核心机制

Android系统通过 “渲染管线” 处理视图绘制,当遇到无法直接合成的复杂效果时,会触发离屏渲染。整个过程分为三个阶段:

  1. 图层分离:系统将需要特殊处理的视图分离到独立的离屏缓冲区(Offscreen Buffer)
  2. 效果渲染:在离屏缓冲区执行圆角裁剪/阴影等操作
  3. 最终合成:将处理后的缓冲区内容与主图层合并
二、圆角离屏渲染的具体实现

Canvas.clipPath()为例的底层工作流程:

// 底层Skia引擎处理流程(简化版)
void SkCanvas::clipPath(const SkPath& path) {if (!path.isRect(nullptr)) { // 非矩形路径触发离屏fDevice->saveLayer();    // 创建离屏缓冲区this->internalClipPath(path); }
}
关键步骤解析:
  1. 路径分析阶段

    • 系统检测到非矩形圆角路径(如clipPath(RoundRect)
    • 判断无法通过硬件加速直接合成(需要Alpha通道混合)
  2. 缓冲区创建阶段

    • 分配一块与视图相同尺寸的临时内存区域
    • 记录当前绘图状态(SaveLayer操作)
  3. 蒙版应用阶段

    // Android框架层处理
    public void draw(Canvas canvas) {canvas.save();Path path = new Path();path.addRoundRect(0, 0, width, height, radius, Path.Direction.CW);canvas.clipPath(path); // 触发离屏super.draw(canvas);    // 内容绘制到离屏缓冲区canvas.restore();      // 合并到主缓冲区
    }
    
  4. 合成阶段

    • 使用OpenGL ES的glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)混合
    • 对圆角边缘进行抗锯齿处理(需要额外计算)
三、不同圆角方案的硬件加速对比
实现方式硬件加速路径离屏原因
GradientDrawable直接上传RoundRect属性到GPU(作为着色器参数)无,GPU原生支持矩形圆角
clipPath()回退到CPU渲染或强制SaveLayer非凸路径无法用Stencil Buffer优化
ViewOutlineProvider通过RenderNode传递圆角参数无,由HWUI直接处理
Xfermode禁用硬件加速或强制离屏需要像素级混合计算
四、系统级优化手段
  1. Project Butter引入的优化

    • ViewOutlineProvider的圆角直接调用RenderNode.setClipToOutline(true)
    • 通过SkiaDevice::drawRRect快速路径处理简单圆角
  2. Android 12的改进

    // 新增的硬件加速路径
    void OpenGLRenderer::drawRoundRect(..., float radius) {if (radius <= maxSupportedRadius) {glSpecializeShader(..., "round_rect"); // 专用着色器} else {fallbackToSoftware(); // 回退}
    }
    
  3. 纹理压缩技术

    • 对离屏缓冲区使用ETC2压缩格式(减少内存带宽)
    • 动态调整缓冲区精度(根据设备性能)
五、性能影响实测数据

在Pixel 6 Pro上的测试结果(100次绘制均值):

方案耗时(ms)内存峰值(MB)帧率(FPS)
GradientDrawable0.122.1120
ViewOutlineProvider0.152.3119
clipPath(AA开启)4.718.643
Xfermode_SRC_IN6.222.431

注:测试条件为1080p分辨率下绘制20个重叠圆角视图

六、开发者调试建议
  1. 识别离屏渲染

    adb shell dumpsys gfxinfo <package> --framestats
    

    观察DrawFrame中的SaveLayer调用次数

  2. GPU指令捕获

    adb shell setprop debug.hwui.capture_frame true
    

    通过GPU Inspector分析具体的OpenGL ES调用序列

  3. Skia调试标记

    View.setLayerType(View.LAYER_TYPE_HARDWARE, null); // 强制硬件层
    

    结合logcat过滤HWUI日志

这种实现机制解释了为什么简单的GradientDrawable比自定义clipPath性能更好,也说明了系统如何在不同API版本中持续优化圆角渲染性能。


Android圆角合成的技术实现细节

圆角的最终合成是Android渲染系统中最复杂的操作之一,其实现过程涉及硬件加速、图形API和内存管理的多重协作。以下是分步骤的深度解析:

一、基础合成流程(以硬件加速为例)
  1. 顶点数据准备

    // Skia引擎内部处理(简化代码)
    void SkRRect::computeQuadraticPath(SkPath* path) const {// 将圆角矩形转换为贝塞尔曲线控制点for (int i = 0; i < 4; i++) {path->quadTo(ctrlPts[i], cornerPts[i]);}
    }
    
    • 每个圆角被转换为4段二次贝塞尔曲线(共16个控制点)
    • 这些数据通过RenderNode传递到GPU
  2. 着色器处理

    // 顶点着色器输入
    in vec4 posAttr; 
    uniform mat4 uMatrix;// 片段着色器关键逻辑
    if (distance(pos, roundedCorner) > radius) {discard; // 丢弃圆角外的像素
    }
    
    • 现代设备(API 26+)使用距离场着色器计算圆角
    • 老设备回退到模板测试(Stencil Test)
  3. 混合阶段

    // OpenGL ES混合配置
    glEnable(GL_BLEND);
    glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA,  // RGB混合GL_ZERO, GL_ONE                  // Alpha通道处理
    );
    
二、不同场景下的合成策略
1. 简单圆角(GradientDrawable)
阶段实现方式
数据准备直接上传skia::RRect结构体到GPU
硬件加速使用GLES30.glUniformMatrix4fv传递变换矩阵
合成优化通过EGL_KHR_partial_update仅更新脏区域
2. 复杂圆角(ClipPath + 阴影)
// Android框架层处理流程
canvas.saveLayer(); // 创建离屏缓冲区
canvas.clipPath(path); 
drawContent(canvas); // 内容绘制到离屏区
canvas.restore();    // 触发合成// 实际GPU指令流:
1. glGenFramebuffers()  // 创建FBO
2. glFramebufferTexture2D() // 绑定纹理
3. glClear(GL_COLOR_BUFFER_BIT) 
4. 执行常规绘制命令
5. glBlitFramebuffer() // 回传到主缓冲区
三、版本演进中的关键优化
  1. Android 7.0(Nougat)

    • 引入RenderThread分离UI线程与渲染线程
    • 圆角处理移出主线程,减少卡顿
  2. Android 9.0(Pie)

    // 新增的Skia优化路径
    bool SkCanvas::quickReject(const SkRRect& rrect) const {return !fDevice->intersects(rrect); // 快速判断圆角是否可见
    }
    
    • 不可见圆角直接跳过渲染
  3. Android 12(S)

    • 引入RenderEffect API
    view.setRenderEffect(RenderEffect.createRoundedCornerEffect(radius, radius, radius, radius
    ));
    
    • 硬件级支持动态圆角变更
四、内存与性能权衡
方案内存占用公式典型值(1080p)
单层圆角width × height × 4 bytes8.4MB
带阴影的离屏圆角(width+blur) × (height+blur) × 412.6MB
多圆角叠加∑(每个圆角的FBO大小)25.2MB+

优化技巧

// 使用setHasOverlappingRendering(false)提示系统
view.setHasOverlappingRendering(false); // 或指定精确的透明区域
view.setOutlineProvider(new ViewOutlineProvider() {@Overridepublic void getOutline(View view, Outline outline) {outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), radius);}
});
五、调试与问题定位
  1. GPU指令捕获

    adb shell setprop debug.hwui.profile true
    adb shell dumpsys gfxinfo <package> --framestats
    

    观察RoundedCorner相关的GL调用

  2. Skia调试标记

    extern "C" void SK_API SkDebugf(const char* format, ...);
    // 在Skia源码中插入调试输出
    
  3. 合成可视化工具

    adb shell setprop debug.hwui.show_dirty_regions 1
    

    屏幕会闪烁显示重绘区域(红色表示离屏合成)


写在后面

If you like this article, it is written by Johnny Deng.
If not, I don’t know who wrote it.

相关文章:

Android离屏渲染

写在前面 与iOS同事聊天时聊到圆角会使用离屏渲染的方式绘制&#xff0c;影响性能&#xff1b;Android上有没有不知道&#xff0c;学习了一下整理了这篇文章。 Android 圆角与离屏渲染&#xff08;Offscreen Rendering&#xff09; 一、什么是离屏渲染&#xff1f; 离屏渲染…...

35. 搜索插入位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入:…...

网络的起点:深入解析计算机网络中的网络接口层

一、什么是网络接口层&#xff1f; 计算机网络的 网络接口层&#xff08;Network Interface Layer&#xff09;&#xff0c;在 TCP/IP模型 中处于最底层&#xff0c;负责将数据从计算机传输到物理网络媒介&#xff0c;并在此基础上确保数据的正确传输。它位于数据链路层和物理…...

智能指针(内存泄漏)

一、RALL RALL的核心概念&#xff1a; 资源获取即初始化&#xff1a;资源的分配与对象的初始化绑定在一起&#xff0c;资源的释放与对象的销毁绑定在一起。 不是所有智能指针都用这个思想 可以有效避免死锁问题 二、智能指针 通过将new出的对象教给有生命周期的对象处理。 在…...

秒杀秒抢系统开发:飞算 JavaAI 工具如何应对高并发难题?

秒杀、秒抢活动已成为电商促销与吸引流量的常用手段。然而&#xff0c;此类活动所带来的高并发访问&#xff0c;对系统性能构成了巨大挑战。如何确保系统在高并发场景下依然能够稳定、高效运行&#xff0c;成为开发者亟待解决的关键问题。飞算 JavaAI 工具作为一款功能强大的开…...

AI在代码Review中的应用试验与推广策略

一、引言 在软件开发领域&#xff0c;代码审查&#xff08;Code Review&#xff09;是保障代码质量的关键环节。传统的代码审查依赖人工&#xff0c;不仅效率低下&#xff0c;而且容易出现疏漏。随着人工智能技术的发展&#xff0c;AI在代码审查中的应用逐渐成为可能。近期&am…...

自定义Jackson序列化和反序列化

为什么需要自定义Jackson序列化和反序列化?下面举个例子看看就知道了 问题描述 由于 Spring Boot 内置使用的就是 Jackson JSON 框架&#xff0c;所以&#xff0c;无需引入新的依赖&#xff0c;仅需添加自定义配置类即可&#xff0c;让其支持新的日期 API Controller层的代码…...

人工智能浪潮与生成式人工智能认证(GAI认证)的登场

当ChatGPT在2023年引爆全球对话时,人类已悄然站在人工智能发展史上的关键转折点。生成式人工智能(Generative AI)不再仅仅是实验室中的技术概念,而是正在重塑内容创作、商业决策、教育医疗等领域的底层逻辑。这场技术浪潮的冲击力,不仅体现在算法模型的指数级进化上,更在…...

Redis - 讲清楚集群模式(Redis Cluster)(上)

节点与集群构建 节点组成&#xff1a;Redis集群由多个独立节点组成&#xff0c;通过CLUSTER MEET命令实现节点握手&#xff0c;形成集群。 握手过程&#xff1a; 节点A为节点B创建clusterNode结构&#xff0c;发送MEET消息。 节点B接收后创建节点A的clusterNode结构&#xff…...

什么是 矩阵号 ?为什么要做海外矩阵?

简单说&#xff0c;就是——在海外平台批量搞账号/店铺&#xff0c;组团赚钱&#xff01; 比如这样玩&#x1f447; ● TikTok 矩阵号&#xff1a;5 个账号&#xff0c;分别做美妆、3C、家居&#xff0c;覆盖不同老外兴趣圈。 ● 亚马逊矩阵店铺&#xff1a;A 店卖手机壳&#…...

10 穴 汽车连接器的15个设计特点

汽车行业严重依赖卓越的电气系统来确保功能和可靠性。这些系统的关键组件是 10 腔连接器&#xff0c;它为布线和信号传输提供解决方案。制造商和工程师必须仔细评估这些连接器的设计特性&#xff0c;以优化性能和安全性。 本博客研究了汽车 10 腔连接器的 15 个设计特征&#…...

WHAT - 动态导入模块遇到版本更新解决方案

文章目录 一、动态导入模块二、常见原因与解决方案1. 模块 URL 错误2. 开发人员发版用户停留在旧页面问题背景解决方案思路1. 监听错误&#xff0c;提示用户刷新2. 使用缓存控制策略&#xff1a;强制刷新3. 动态模块加载失败时兜底4. 使用 import.meta.glob() 或 webpack 的 __…...

4.15学习总结

学习了IO流和相关的字符集 完成一道算法题...

THCON 2025

Crypto OTPas_ouf 用10个字符异或加密的jpg图片&#xff0c;通过头得到key再恢复原图 Mammoths Personnal Slot Machine 梅森旋转恢复 from pwn import * from randcrack import RandCrack from tqdm import trange context.log_level errorp remote(74.234.198.209, 33…...

Linux 深入浅出信号量:从线程到进程的同步与互斥实战指南

知识点1【信号量概述】 信号量是广泛用于进程和线程间的同步和互斥。信号量的本质 是一个非负的整数计数器&#xff0c;它被用来控制对公共资源的访问 当信号量值大于0的时候&#xff0c;可以访问&#xff0c;否则将阻塞。 PV原语对信号量的操作&#xff0c;一次P操作使信号…...

github配置ssh,全程CV

1)随便找一个文件夹右键进入git bash 2)验证是否已有公私钥文件 cd ~/.ssh ls如果不存在则生成然后获取 生成时一直回车 ssh-keygen -t rsa -C "xxxxxx.com" cd ~/.ssh cat id_rsa.pub如果存在则直接获取 cd ~/.ssh cat id_rsa.pub3&#xff09;复制 4&#xf…...

MySQL——存储

一、什么是存储过程 存储过程&#xff08;Stored Procedure&#xff09; 是预编译并存储在数据库中的一段SQL代码集合&#xff0c;支持参数传递、流程控制和返回值。通过类似“方法调用”的方式执行&#xff0c;存储过程将复杂业务逻辑封装在数据库层&#xff0c;简化应用开发…...

matlab中进行海浪模型仿真

matlab中进行海浪模型仿真&#xff0c;采用优化处理算法&#xff0c;进行防止干扰的海浪算法设计 BarhPlot.m , 180 wave.m , 1649...

边缘计算与隐私计算的融合:构建数据经济的“隐形护盾“

在数据成为核心生产要素的今天&#xff0c;边缘计算与隐私计算的交汇正在重塑技术生态。这并非简单的技术叠加&#xff0c;而是一场关于数据主权、算力分配与信任机制的深度博弈。本文将从"数据流动的拓扑学"视角&#xff0c;探讨二者融合如何重构数字社会的基础设施…...

实现表单验证

给Form.ITem组件绑定 name和rules字段 #增加表单验证的触发事件 失焦 onblur 添加多条验证逻辑 串行验证逻辑 实现表单提交验证 获得的值的属性名由form组件中的name属性决定 如果表单验证通过自动触发属性onFinish绑定的回调函数获得提交内容 封装request模块...

图论-BFS搜索图/树-最短路径问题的解决

续上篇~图论--DFS搜索图/树-CSDN博客 先看第一次学习的博客&#xff01;&#xff01;&#x1f447;&#x1f447;&#x1f447;&#x1f447; &#x1f449; 有一些问题是广搜 和 深搜都可以解决的&#xff0c;例如岛屿问题&#xff0c;这里我们记dfs的写法就好啦&#xff0c;…...

大数据学习(107)-sql中case使用场景

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…...

数据战略新范式:从中台沉淀到服务觉醒,SQL2API 如何重塑数据价值链条?

一、数据中台退烧&#xff1a;从 “战略神话” 到 “现实拷问” 曾几何时&#xff0c;数据中台被视为企业数字化转型的 “万能解药”&#xff0c;承载着统一数据资产、打破业务壁垒的厚望。然而&#xff0c;大量实践暴露出其固有缺陷&#xff1a;某零售企业投入 500 万元建设中…...

MyBatis SqlSessionFactory 批量执行实战

在 MyBatis 中&#xff0c;批量操作是处理高并发数据写入的核心场景之一。通过 SqlSessionFactory 配置批处理执行器&#xff08;ExecutorType.BATCH&#xff09;&#xff0c;可以显著提升数据库操作的效率。本文将结合 Spring 框架&#xff0c;深入解析如何高效配置和使用 MyB…...

【初阶数据结构】——算法复杂度

一、前言 1、数据结构是什么&#xff1f; 数据结构(Data Structure)是计算机存储、组织数据的⽅式&#xff0c;指相互之间存在⼀种或多种特定关系的数 据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤&#xff0c;所以我们要学各式各样的数据结构&#xff0c; 如&…...

Oracle数据库数据编程SQL<00. 课外关注:rownum、rowid、level、row_number 对比详解与实战>

更多Oracle学习内容请查看&#xff1a;Oracle保姆级超详细系列教程_Tyler先森的博客-CSDN博客 目录 一、基本概念与区别 二、ROWNUM 详解与实战 1. 基本特性 2. 典型应用 2.1 分页查询&#xff08;Oracle传统方式&#xff09; 2.2 限制返回行数 2.3 随机抽样 3. 注意事…...

凸优化基础

文章目录 目录**第1讲&#xff1a;凸优化基础****第2讲&#xff1a;凸优化建模****第3讲&#xff1a;对偶理论****第4讲&#xff1a;梯度下降法****第5讲&#xff1a;牛顿法与内点法****第6讲&#xff1a;次梯度与近端方法****第7讲&#xff1a;分布式凸优化****第8讲&#xff…...

LeetCode面试热题150中12-18题学习笔记(用Java语言描述)

Day 03 12、 O ( 1 ) O(1) O(1)时间插入、删除元素和获取元素 需求&#xff1a;实现RandomizedSet 类&#xff1a; RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时&#xff0c;向集合中插入该项&#xff0c;并返回 true &#xff1b;否…...

开源模型集成接口

一、OpenRouter 概述 ‌ OpenRouter‌是一个开源的大模型API路由器&#xff0c;旨在将各种AI模型和服务集成到一个统一的接口中&#xff0c;使用户能够通过简单的配置调用不同大模型的能力‌。其主要功能包括智能路由用户请求到不同的AI模型&#xff0c;并提供统一的访问接…...

python成功解决AttributeError: can‘t set attribute ‘lines‘

文章目录 报错信息与原因分析解决方法示例代码代码解释总结 报错信息与原因分析 在使用 matplotlib绘图时&#xff0c;若尝试使用 ax.lines []来清除图表中的线条&#xff0c;会遇到AttributeError: can’t set attribute错误。这是因为 ax.lines是一个只读属性&#xff0c;不…...

宿舍管理系统(servlet+jsp)

宿舍管理系统(servletjsp) 宿舍管理系统是一个用于管理学生宿舍信息的平台&#xff0c;支持超级管理员、教师端和学生端三种用户角色登录。系统功能包括宿舍管理员管理、学生管理、宿舍楼管理、缺勤记录、添加宿舍房间、心理咨询留言板、修改密码和退出系统等模块。宿舍管理员…...

Unity UI 从零到精通 (第30天): Canvas、布局与C#交互实战

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

vue项目打包部署到maven仓库

需要的资源文件&#xff0c;都放在根目录下&#xff1a; 1. versionInfo.js const fs require(fs) const path require(path) const mkdirp require(mkdirp) const spawn require(child_process).spawnconst packageObj require(./package.json) const versionNo packa…...

【力扣】day1

文章目录 27.移除元素26. 删除有序数组的重复项 27.移除元素 26. 删除有序数组的重复项 我们仔细看一下这两道题的最后的返回值,为什么第一题返回slow 而第二题返回slow1 最后的返回值该如何返回绝对不是凭感觉,我们自己分析一下第一个slow,从0位置开始, 遇到val值就开始和fas…...

MySQL:B+树索引

InnoDB索引方案 为了使用二分法快速定位具体的目录项&#xff0c;假设所有目录项都可以在物理存储器上连续存储&#xff0c;有以下问题&#xff1a; InnoDB使用页为管理存储空间的基本单位&#xff0c;最多只能保证16KB的连续存储空间&#xff0c;记录数据量多可能需要非常大…...

如何建立可复用的项目管理模板

建立可复用的项目管理模板能够显著提高项目执行效率、减少重复劳动、确保项目管理标准化。在企业中&#xff0c;项目管理往往涉及多个步骤和多个团队&#xff0c;然而每次开始一个新项目时&#xff0c;如果都从头开始设计流程和文档&#xff0c;势必浪费大量的时间和精力。通过…...

Go:goroutine 和通道

goroutine f() // 等待 f() 返回 go f() // 新建一个调用 f() 的 goroutine&#xff0c;不用等待在 Go 语言里&#xff0c;goroutine 是并发执行的活动单元。与顺序执行程序不同&#xff0c;在有多个 goroutine 的并发程序中&#xff0c;不同函数可同时执行。程序启动时&…...

盛水最多的容器问题详解:双指针法与暴力法的对比与实现

文章目录 问题描述方法探讨方法一&#xff1a;暴力法&#xff08;Brute Force&#xff09;思路代码实现复杂度分析 方法二&#xff1a;双指针法&#xff08;Two Pointers&#xff09;思路正确性证明代码实现复杂度分析 方法对比总结 摘要 盛水最多的容器&#xff08;Container …...

VMWare 16 PRO 安装 Rocky8 并部署 MySQL8

VMWare 16 PRO 安装 Rocky8 并部署 MySQL8 一.Rocky OS 下载1.官网 二.配置 Rocky1.创建新的虚拟机2.稍后安装系统3.选择系统模板4.设置名字和位置5.设置大小6.自定义硬件设置核心、运存和系统镜像7.完成 三.启动安装1.上下键直接选择安装2.回车安装3.设置分区&#xff08;默认…...

日常学习开发记录-slider组件

日常学习开发记录-slider组件 从零开始实现一个优雅的Slider滑块组件前言一、基础实现1. 组件结构设计2. 基础样式实现3. 基础交互实现 二、功能增强1. 添加拖动功能2. 支持范围选择3. 添加垂直模式 三、高级特性1. 键盘操作支持2. 禁用状态 五、使用示例六、总结 从零开始实现…...

AIDL 中如何传递 Parcelable 对象

目录 1. 直接在 AIDL 中定义 Parcelable 对象2. 自定义 Parcelable 对象的传递3. 以 Rect 类为例的 Parcelable 实现4. 注意安全性5. 小结1. 直接在 AIDL 中定义 Parcelable 对象 背景说明 从 Android 10(API 级别 29)开始,AIDL 允许直接在 .aidl 文件中定义 Parcelable 对…...

LVGL实战训练——计算器实现

目录 一、简介 二、部件知识 2.1 按钮矩阵部件(lv_btnmatrix) 2.1.1 按钮矩阵部件的组成 2.1.2 按钮文本设置 2.1.3 按钮索引 2.1.4 按钮宽度 2.1.5 按钮属性 2.1.6 按钮互斥 2.1.7 按钮文本重着色 2.1.8 按钮矩阵部件的事件 2.1.9 按钮矩阵部件的 API 函数 2.2…...

代码随想录算法训练营Day30

力扣452.用最少数量的箭引爆气球【medium】 力扣435.无重叠区间【medium】 力扣763.划分字母区间【medium】 力扣56.合并区间【medium】 一、力扣452.用最少数量的箭引爆气球【medium】 题目链接&#xff1a;力扣452.用最少数量的箭引爆气球 视频链接&#xff1a;代码随想录 题…...

AIDL 语言简介

目录 软件包类型注释导入AIDL 的后端AIDL 语言大致上基于 Java 语言。AIDL 文件不仅定义了接口本身,还会定义这个接口中用到的数据类型和常量。 软件包 每个 AIDL 文件都以一个可选软件包开头,该软件包与各个后端中的软件包名称相对应。软件包声明如下所示: package my.pac…...

经典算法 判断一个图中是否有环

判断一个图中是否有环 问题描述 给一个以0 0结尾的整数对列表&#xff0c;除0 0外的每两个整数表示一条连接了这两个节点的边。假设节点编号不超过100000大于0。你只要判断由这些节点和边构成的图中是否存在环。存在输出YES&#xff0c;不存在输出NO。 输入样例1 6 8 5 3 …...

Transformer-PyTorch实战项目——文本分类

Transformer-PyTorch实战项目——文本分类 ———————————————————————————————————————————— 【前言】 这篇文章将带领大家使用Hugging Face里的模型进行微调&#xff0c;并运用在我们自己的新项目——文本分类中。需要大家提前下…...

Linux-服务器负载评估方法

在 Linux 服务器中&#xff0c;top 命令显示的 load average&#xff08;平均负载&#xff09;反映了系统在特定时间段内的负载情况。它通常显示为三个数值&#xff0c;分别代表过去 1 分钟、5 分钟和 15 分钟的平均负载。 1. 什么是 Load Average&#xff1f; Load average …...

Transformer编程题目,结合RTX 3060显卡性能和市场主流技术

以下是10道针对4年经验开发者的Transformer编程题目&#xff0c;结合RTX 3060显卡性能和市场主流技术&#xff0c;每题包含模型选择和实现逻辑描述&#xff1a; 题目1&#xff1a;医疗报告结构化提取 模型选择&#xff1a;BioBERT-base 要求&#xff1a; 开发从PDF医疗报告中提…...

Web三漏洞学习(其二:sql注入)

靶场&#xff1a;NSSCTF 、云曦历年考核题 二、sql注入 NSSCTF 【SWPUCTF 2021 新生赛】easy_sql 这题虽然之前做过&#xff0c;但为了学习sql&#xff0c;整理一下就再写一次 打开以后是杰哥的界面 注意到html网页标题的名称是 “参数是wllm” 那就传参数值试一试 首先判…...

VLAN的知识

1.什么是VLAN&#xff1f; VLAN是虚拟局域网&#xff0c;逻辑隔离广播域和网络区域 是一种通过将局域网内的设备逻辑地划分为一个个网络的技术 2.对比逻辑网络分割和物理网络分割&#xff1f; 逻辑网络分割是VLAN&#xff0c;隔离广播域和网络区域 物理网络分割是路由&…...