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

Android的SurfaceView和TextureView介绍

文章目录

  • 前言
  • 一、什么是SurfaceView ?
    • 1.1 SurfaceView 使用示例
    • 1.2 SurfaceView 源码概述
    • 1.3 SurfaceView 的构造与初始化
    • 1.4 SurfaceHolder.Callback 回调接口
    • 1.5 SurfaceView 渲染机制
  • 二、什么是TextureView?
    • 2.1 TextureView 使用示例
    • 2.2 TextureView 源码概述
    • 2.3 TextureView 的构造与初始化
    • 2.4 SurfaceTextureListener 回调
    • 2.5 TextureView渲染流程
  • 三、SurfaceView和TextureView区别


前言

一、什么是SurfaceView ?

SurfaceView 是一种用于直接将图形绘制到屏幕的Android组件。与常规的 View 不同,SurfaceView 通过使用一个独立的 Surface 来进行渲染,它不直接依赖于主 UI 线程,而是利用单独的硬件加速的线程进行渲染

1.1 SurfaceView 使用示例

SurfaceView 的常见用法通常是在视频播放、相机预览或实时图形渲染等场景中。以下是一个简单的 SurfaceView 使用示例,它展示了如何在 Android 应用中创建并使用 SurfaceView:

布局 XML 文件 (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><android.view.SurfaceViewandroid:id="@+id/surfaceView"android:layout_width="match_parent"android:layout_height="match_parent" />
</LinearLayout>
import android.os.Bundle;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {private SurfaceView surfaceView;private SurfaceHolder surfaceHolder;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);surfaceView = findViewById(R.id.surfaceView);surfaceHolder = surfaceView.getHolder();surfaceHolder.addCallback(this);  // 注册回调}@Overridepublic void surfaceCreated(SurfaceHolder holder) {// 在 Surface 创建时调用,可以在此开始渲染Surface surface = holder.getSurface();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {// 当 Surface 大小或格式改变时调用// 更新渲染内容或调整显示内容}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// 在 Surface 销毁时调用// 停止渲染操作并释放资源}
}

在上述示例中,我们首先在布局中定义了一个 SurfaceView,然后通过 surfaceView.getHolder() 获取 SurfaceHolder,并注册了 SurfaceHolder.Callback 接口来处理 Surface 的生命周期。

1.2 SurfaceView 源码概述

SurfaceView 主要用于处理需要高效、实时渲染的场景,例如视频播放、游戏渲染、相机预览等。它的渲染操作由后台线程执行,避免了与主 UI 线程的竞争,提升了性能。

主要类及源码文件
SurfaceView 类位于 frameworks/base/core/java/android/view/SurfaceView.java。
通过 getHolder() 获取与 SurfaceView 关联的 SurfaceHolder。
SurfaceHolder 是一个接口,通过它可以获取与 SurfaceView 关联的 Surface 对象并进行渲染。

1.3 SurfaceView 的构造与初始化

SurfaceView 在初始化时,首先通过 getHolder() 获取 SurfaceHolder,然后注册回调接口来处理 Surface 的生命周期。具体代码如下:

public SurfaceView(Context context) {super(context);mSurfaceHolder = getHolder(); // 获取 SurfaceHoldermSurfaceHolder.addCallback(this); // 注册回调
}

在此过程中,getHolder() 返回一个 SurfaceHolder 对象,该对象用于管理与 SurfaceView 关联的 Surface。SurfaceHolder.Callback 回调接口的实现帮助我们在 Surface 创建、改变和销毁时执行相应的操作。

1.4 SurfaceHolder.Callback 回调接口

SurfaceHolder.Callback 是一个关键接口,SurfaceView 使用它来处理与 Surface 相关的生命周期事件。它包括三个主要回调方法:

  • surfaceCreated(SurfaceHolder holder)
    surfaceCreated() 方法在 Surface 被创建时调用。此时,SurfaceView 可以开始渲染图形内容。
@Override
public void surfaceCreated(SurfaceHolder holder) {// 此时 Surface 创建成功,可以开始渲染Surface surface = holder.getSurface();// 进行图形渲染,通常启动渲染线程
}
  • surfaceChanged(SurfaceHolder holder, int format, int width, int height)
    当 Surface 的格式或尺寸发生变化时,surfaceChanged() 会被调用。此时,应用程序可以根据新的尺寸调整渲染内容。
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {// 处理 Surface 格式或尺寸变化
}
  • surfaceDestroyed(SurfaceHolder holder)
    当 Surface 被销毁时,surfaceDestroyed() 会被调用。此时,应用程序应停止渲染操作并释放资源。
@Override
public void surfaceDestroyed(SurfaceHolder holder) {// 停止渲染线程并释放资源
}

1.5 SurfaceView 渲染机制

SurfaceView 的渲染由后台线程处理,渲染过程包括锁定 Canvas、进行绘制并提交结果。

后台线程Surface
SurfaceView 的渲染并不在主 UI 线程中进行,而是通过后台线程来完成的。这是为了避免 UI 线程的阻塞,确保 UI 能够流畅运行。

SurfaceView 在后台线程中会使用 SurfaceHolder.lockCanvas() 获取 Canvas 对象,然后进行图形绘制。绘制完成后,通过 SurfaceHolder.unlockCanvasAndPost() 提交更新。

public void render(Surface surface) {Canvas canvas = null;try {canvas = holder.lockCanvas(null); // 锁定 Canvasif (canvas != null) {// 在 Canvas 上绘制图形内容canvas.drawColor(Color.BLACK);  // 清屏// 绘制其他内容}} finally {if (canvas != null) {holder.unlockCanvasAndPost(canvas); // 提交绘制结果}}
}

二、什么是TextureView?

TextureView 用于显示一个内容的纹理。它和 SurfaceView 的功能类似,但实现方式有所不同。
TextureView 允许将 OpenGL 渲染的内容、视频帧或其他图像直接作用在 UI 线程上,并且能够在任何地方进行动画、旋转或缩放,而不仅限于一个固定的 Surface。
相较于 SurfaceView,TextureView 在灵活性和控制方面有更多的优势。

2.1 TextureView 使用示例

下面是一个简单的 TextureView 使用示例。

public class MyActivity extends AppCompatActivity {private TextureView textureView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textureView = findViewById(R.id.textureView);textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {@Overridepublic void onSurfaceCreated(SurfaceTexture surface, int width, int height) {// Surface 创建时,初始化 SurfaceSurface newSurface = new Surface(surface);// 可以在这里执行渲染操作}@Overridepublic void onSurfaceChanged(SurfaceTexture surface, int width, int height) {// Surface 改变大小时}@Overridepublic void onSurfaceDestroyed(SurfaceTexture surface) {// Surface 销毁时}@Overridepublic void onSurfaceUpdated(SurfaceTexture surface) {// 每次 Surface 更新时调用}});}
}

2.2 TextureView 源码概述

以下是 TextureView 源码概述的核心内容,详细分析其结构和工作原理。

1、关键类和接口
TextureView 类:TextureView 是整个视图系统的核心,它继承自 View 类。它的主要职责是通过 SurfaceTexture 渲染图像内容,并通过 Surface 显示。

SurfaceTexture:SurfaceTexture 是与 OpenGL 渲染绑定的对象,用于显示图像流。它为 TextureView 提供了一个接口,通过它可以将渲染内容传输到 SurfaceView 或 TextureView。

Surface:Surface 是 Android 用于图形渲染的基本容器。SurfaceTexture 通过 Surface 输出图形数据,TextureView 通过此 Surface 显示内容。

SurfaceTextureListener 接口:该接口提供了与 SurfaceTexture 生命周期相关的回调方法,开发者可以通过实现该接口来响应 Surface 创建、更新和销毁的事件。

2.3 TextureView 的构造与初始化

1、构造函数
TextureView 提供了多个构造函数,可以通过不同的方式初始化对象。最常见的构造函数是:

public TextureView(Context context) {super(context);init();
}

在构造函数中,TextureView 被初始化并配置了所需的 SurfaceTexture。通过调用 init() 方法,SurfaceTexture 和 Surface 将被创建,并为后续的图像渲染做好准备。

private void init() {// 创建 SurfaceTexture 对象mSurfaceTexture = new SurfaceTexture(false);// 创建 Surface 对象mSurface = new Surface(mSurfaceTexture);// 设置视图的缓冲区和其他默认参数setOpaque(true);  // 设置是否为不透明mSurfaceTextureListener = null;
}

2. SurfaceTexture 和 Surface 的创建
TextureView 的核心是通过 SurfaceTexture 来获取渲染的数据流,并通过 Surface 来显示这些图像内容。创建 SurfaceTexture 和 Surface 的代码如下:

mSurfaceTexture = new SurfaceTexture(false);  // 创建 SurfaceTexture 实例
mSurface = new Surface(mSurfaceTexture);     // 使用 

SurfaceTexture 创建 Surface
SurfaceTexture 是渲染内容的承载者,它接收渲染引擎(如 OpenGL)的输出,并将其传递给 Surface。
Surface 是渲染结果的显示容器,TextureView 通过该 Surface 来显示图像。
SurfaceTexture 的参数 false 表示它是一个非透明的纹理。在大多数情况下,使用非透明纹理可以获得更好的渲染性能。

2.4 SurfaceTextureListener 回调

TextureView 还提供了一个接口 SurfaceTextureListener,用于接收 SurfaceTexture 生命周期的回调事件。这个回调接口包含了多个方法,可以在 SurfaceTexture 创建、更新或销毁时进行处理。

  • onSurfaceCreated(SurfaceTexture surface, int width, int height):当 SurfaceTexture 创建时调用。此时可以开始渲染内容。
  • onSurfaceChanged(SurfaceTexture surface, int width, int height):当 SurfaceTexture 尺寸发生变化时调用。可以用来更新渲染内容或调整显示尺寸。
  • onSurfaceDestroyed(SurfaceTexture surface):当 SurfaceTexture 销毁时调用,可以在此时释放资源。
  • onSurfaceUpdated(SurfaceTexture surface):每次 SurfaceTexture 更新时调用,用于通知渲染更新。

2.5 TextureView渲染流程

TextureView 的渲染流程主要依赖于 SurfaceTexture 和 Surface 来将图像渲染到屏幕上。以下是该渲染流程的关键步骤:

  1. 初始化 SurfaceTexture 和 Surface:

TextureView 在初始化时创建一个 SurfaceTexture 对象,该对象用于接收图形数据。
然后将 SurfaceTexture 封装为 Surface,Surface 用于显示图像内容。

  1. 图像数据传递到 SurfaceTexture:

图形引擎(如 OpenGL)将渲染结果传递给 SurfaceTexture,这些数据会被存储在 SurfaceTexture 中。

3.SurfaceTexture 更新:

一旦 SurfaceTexture 中的图像数据更新,TextureView 会收到通知,并准备将新图像内容显示出来。
SurfaceTexture 会将最新的图像数据传递给关联的 Surface。

  1. 显示图像内容:

Surface 在 TextureView 上渲染和显示图像内容。此时,TextureView 会将图像数据呈现到屏幕上。

三、SurfaceView和TextureView区别

特性SurfaceViewTextureView
渲染方式渲染内容直接通过硬件层输出,不经过 UI 层,绕过屏幕缓冲区通过 SurfaceTexture 渲染内容,经过 UI 层(即视图层)显示
性能高性能,适合要求低延迟、高帧率的应用,如视频播放、实时游戏等性能相对较低,适用于对 UI 层交互、动画有要求的应用
渲染效率渲染在独立的硬件层,减少 UI 线程负担,图形处理独立渲染经过 UI 层,渲染性能相对较低,可能会受到 UI 层操作影响
硬件加速支持直接使用硬件加速,不依赖 UI 线程,适合高效图形渲染使用硬件加速,但图形渲染受 UI 线程限制
变换与动画支持不支持内建的图像变换,若需动画或变换需要依赖外部图形库如 OpenGL支持矩阵变换(旋转、缩放、平移等),支持视图动画和动态效果
视图层级与嵌套渲染层与 UI 层分离,不能与其他视图进行直接交互或嵌套渲染内容在 UI 层,可以和其他视图层级交互、嵌套和变换
生命周期管理通过 SurfaceHolder.Callback 回调接口管理 Surface 的生命周期通过 SurfaceTextureListener 回调接口管理 SurfaceTexture 生命周期
适用场景适用于视频播放、实时游戏渲染等对性能要求高的应用适用于动态变换、动画和需要与 UI 层交互的场景(如视频展示、图像旋转)
支持的 UI 操作不支持直接与 UI 层进行交互(例如点击、动画、视图更新等)支持与 UI 层的交互,支持视图动画(例如 setTransform() 变换)
硬件渲染与UI渲染渲染直接在硬件层进行,不依赖 UI 线程渲染通过 UI 层进行,UI 线程参与渲染处理,可能有性能开销
透明背景支持不直接支持透明背景支持透明背景,适合需要透明或部分透明效果的应用
支持多层显示支持多层显示,但通常是通过 Surface 进行不同图层显示支持多图层显示,允许将多个 TextureView 嵌套并渲染不同内容
显示内容更新渲染内容更新较为简单,依赖 lockCanvas、unlockCanvasAndPost显示内容更新通过 SurfaceTexture 更新,内容刷新通过 updateTexImage()
硬件解码视频非常适合硬件解码视频,视频数据直接渲染到硬件层不如 SurfaceView 高效,视频数据需要通过 SurfaceTexture 渲染
UI 线程影响不会受到 UI 线程影响,独立的渲染线程渲染依赖 UI 线程,可能会影响 UI 线程的流畅性,特别是在高负荷情况下
可嵌入到布局中不可以直接与其他视图一起进行布局可以像普通视图一样嵌入布局,支持与其他视图交互和变换
旋转与缩放不支持内建旋转、缩放等变换,需使用外部图形库支持内建旋转、缩放和其他变换,支持多种变换方式
API 支持支持大部分 Android 设备,并且对硬件解码支持较好支持大部分 Android 设备,适合需要在视图层做渲染处理的场景
渲染线程在独立线程中进行渲染,UI 线程与渲染分离渲染在 UI 线程中进行,UI 操作与渲染共用一个线程

相关文章:

Android的SurfaceView和TextureView介绍

文章目录 前言一、什么是SurfaceView &#xff1f;1.1 SurfaceView 使用示例1.2 SurfaceView 源码概述1.3 SurfaceView 的构造与初始化1.4 SurfaceHolder.Callback 回调接口1.5 SurfaceView 渲染机制 二、什么是TextureView&#xff1f;2.1 TextureView 使用示例2.2 TextureVie…...

Scala的集合

1 集合简介 1&#xff09;Scala 的集合有三大类&#xff1a;序列 Seq、集 Set、映射 Map&#xff0c;所有的集合都扩展自 Iterable 特质。 2&#xff09;对于几乎所有的集合类&#xff0c;Scala 都同时提供了可变和不可变的版本&#xff0c;分别位于以下两 个包 不可变集合&am…...

1. Flink自定义Source

一. Source 简介 DataStream是Flink的低级API&#xff0c;用于进行数据的实时处理&#xff0c;Flink编程模型分为Source、Transformation、Sink三个部分&#xff0c;如下图所示。 默认Flink提供了大量的内置Source&#xff0c;常见的Source如下&#xff1a; 基于文件的Sour…...

关于LinuxWindows双系统在八月更新后出现的问题

问题描述类似于&#xff1a;Verifying shim SBAT data failed: If you are, this is caused by a reported problem in the August update if you can get into Windows, either uninstall the August update, or open Command Prompt as administrator and run this command,…...

VMware:如何在CentOS7上开启22端口

打开虚拟机&#xff1a;【编辑】【虚拟机网络设置】 其中填入的虚拟机IP地址是虚拟机中centos的IP地址&#xff0c;虚拟机端口为需要映射的centos端口 配置好之后保存&#xff0c;打开宿主机 win cmd telnet 192.168.1.26 22 如果出现上述窗口&#xff0c;则说明已经成功开放…...

ubuntu远程桌面开启opengl渲染权限

背景 最近用windows的【远程桌面连接】登录ubuntu后&#xff08;xrdp协议&#xff09;&#xff0c;发现gl环境是集显的&#xff0c;但是本地登录ubuntu桌面后是独显&#xff08;英伟达&#xff09;&#xff0c;想要在远程桌面上也用独显渲染环境。 一、查看是独显还是集显环境…...

从小学题到技术选型哲学:以智能客服系统为例,解读相关AI技术栈20241211

&#x1f9e0;&#x1f4a1;从小学题到技术选型哲学&#xff1a;以智能客服系统为例&#xff0c;解读相关AI技术栈 引言&#xff1a;从小学数学题到技术智慧 &#x1f4da;✨ 在小学数学题中&#xff0c;有这样一道问题&#xff1a; “一个长方形变成平行四边形后&#xff0c…...

【C语言练习(5)—回文数判断】

C语言练习&#xff08;5&#xff09; 文章目录 C语言练习&#xff08;5&#xff09;前言问题问题解析结果总结 前言 通过回文数练习&#xff0c;巩固数字取余和取商如何写代码 问题 输入一个五位数判断是否为回文数&#xff1f; 问题解析 回文数是指正读反读都一样的整数。…...

【Rust 学习笔记】Rust 基础数据类型介绍——数组、向量和切片

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 博客内容主要围绕&#xff1a; 5G/6G协议讲解 高级C语言讲解 Rust语言讲解 文章目录 Rust 基础数据类型介绍——数组、向量和切片一、数组、向量和…...

2024年特别报告,「十大生活方式」研究数据报告

“一朵花成轻奢品、一只玩偶掀抢购狂潮、一片荒地变文旅圣地…” 近年爆火的野兽派、Jellycat、阿那亚等诸多品牌&#xff0c;与消费者选择的生活方式息息相关。 今年小红书的内容种草、直播电商&#xff0c;也都依循着“生活方式”的轨迹。生活方式的价值所向&#xff0c;可…...

R中单细胞RNA-seq分析教程 (5)

引言 本系列开启R中单细胞RNA-seq数据分析教程[1]&#xff0c;持续更新&#xff0c;欢迎关注&#xff0c;转发&#xff01; 10. 伪时间细胞排序 如前所述&#xff0c;在 UMAP 嵌入中看到的背侧端脑细胞形成的类似轨迹的结构&#xff0c;很可能代表了背侧端脑兴奋性神经元的分化…...

openpnp - Too many misdetects - retry and verify fiducial/nozzle tip detection

文章目录 openpnp - Too many misdetects - retry and verify fiducial/nozzle tip detection概述笔记环境光最好弱一些在设备标定时&#xff0c;吸嘴上不要装绿色屏蔽片如果吸嘴不在底部相机中间&#xff0c;先检查设置底部相机坐标调整底部相机坐标 吸嘴校验的细节底部相机坐…...

不与最大数相同的数字之和

不与最大数相同的数字之和 C语言代码C 语言代码Java语言代码Python语言代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 输出一个整数数列中不与最大数相同的数字之和。 输入 输入分为两行&#xff1a; 第一行为N(N为接下来数的个数&…...

CSS学习记录11

CSS布局 - display属性 display属性是用于控制布局的最终要的CSS属性。display 属性规定是否/如何显示元素。每个HTML元素都有一个默认的display值&#xff0c;具体取决于它的元素类型。大多数元素的默认display值为block 或 inline。 块级元素&#xff08;block element&…...

D95【python 接口自动化学习】- pytest进阶之fixture用法

day95 pytest的fixture详解&#xff08;二&#xff09; 学习日期&#xff1a;20241210 学习目标&#xff1a;pytest基础用法 -- pytest的fixture详解&#xff08;二&#xff09; 学习笔记&#xff1a; fixture(autouseTrue) func的autouse是TRUE时&#xff0c;所有函数方法…...

Abaqus断层扫描三维重建插件CT2Model 3D V1.1版本更新

更新说明 Abaqus AbyssFish CT2Model3D V1.1版本更新新增对TIF、TIFF图像文件格式的支持。本插件用户可免费获取升级服务。 插件介绍 插件说明&#xff1a; Abaqus基于CT断层扫描的三维重建插件CT2Model 3D 应用案例&#xff1a; ABAQUS基于CT断层扫描的细观混凝土三维重建…...

隐式对象和泛型

implicit object 作用&#xff1a; case class DatabaseConfig(driver:String,url:String)//作为函数的隐士参数的默认值implicit object MySqlDefault extends DatabaseConfig("mysql","localhost:443")def getConn(implicit config: DatabaseConfig):Uni…...

CSS的颜色表示方式

以下介绍几种常见的CSS颜色表示方式&#xff1a; 颜色名称 html和css规范中定义了147种可用的颜色名用的相对较少 16进制表示 css三原色&#xff1a;红、绿、蓝16进制的颜色值&#xff1a; #rrggbb16进制整数规定颜色成分&#xff0c;所有的值均介于 00 - ff 之间&#xff…...

单链表常见面试题 —— LeetCode

一.删除链表中与val相等的所有节点 1.题目描述 ----- 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 列表中的节点数目在范…...

Pydantic中的discriminator:优雅地处理联合类型详解

Pydantic中的discriminator&#xff1a;优雅地处理联合类型详解 引言1. 什么是discriminator&#xff1f;2. 基本使用示例3. discriminator的工作原理4. 更复杂的实际应用场景5. 使用建议6. 潜在陷阱和注意事项结论最佳实践 引言 在Python的类型系统中&#xff0c;有时我们需要…...

百度网盘直链解析技术深度解析:突破限速壁垒的工程实践

百度网盘直链解析技术深度解析&#xff1a;突破限速壁垒的工程实践 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 在当今数字化时代&#xff0c;百度网盘作为国内主流云存储服…...

C语言中的数据类型存储

1、二进制和进制转换我们经常能听到 2 进制、 8 进制、 10 进制、 16 进制 这样的讲法&#xff0c;那是什么意思呢&#xff1f;其实2进制、8进制、10进制、16进制是数值的不同表⽰形式⽽已。⽐如&#xff1a;数值15的各种进制的表⽰形式(十六进制的数值之前写&#xff1a;0x &a…...

GodSVG:基于Godot引擎的结构化SVG编辑器,实现代码与图形双向实时同步

1. 项目概述&#xff1a;一个为开发者而生的结构化SVG编辑器 如果你和我一样&#xff0c;经常需要和SVG&#xff08;可缩放矢量图形&#xff09;打交道&#xff0c;无论是为网页设计图标、为游戏引擎制作矢量资源&#xff0c;还是进行数据可视化&#xff0c;那你一定体会过在传…...

AI编程新范式:基于.cursorrules的角色扮演开发环境实战指南

1. 项目概述&#xff1a;当AI助手有了“人设”&#xff0c;开发会变成一场情景喜剧吗&#xff1f;最近在折腾Cursor这个AI编程工具&#xff0c;发现了一个特别有意思的玩意儿&#xff1a;.cursorrules文件。简单来说&#xff0c;这玩意儿就像是你给Cursor这位“AI程序员”设定的…...

开源代理解决 DeepSeek V4 与 Claude Code 的三个兼容性陷阱解决方案

在使用 Claude Code 的过程中&#xff0c;Anthropic 官方 API 的调用成本和网络问题一直是个痛点。DeepSeek V4 提供了兼容 Anthropic 格式的 API&#xff0c;价格优势明显&#xff0c;但实际对接时存在若干协议层面的差异&#xff0c;直接使用的话在进行 Agent spawn 工具调用…...

Error response from daemon: client version 1.52 is too new. Maximum supported API version is 1.43

按照习惯&#xff0c;输入“docker ps”查看一下容器&#xff0c;结果给我来个这个错误&#xff1a;Error response from daemon: client version 1.52 is too new. Maximum supported API version is 1.43查了一下原因&#xff1a;这是因为使用云构建安装的默认 Docker 守护程…...

RT-Thread开发实战(8)— 基于SPI驱动TFTLCD实现动态数据可视化

1. 从零开始玩转SPI驱动TFTLCD 第一次用RT-Thread驱动TFTLCD屏幕时&#xff0c;我盯着那堆密密麻麻的引脚直发懵。后来才发现&#xff0c;只要搞明白SPI通信和屏幕驱动芯片的关系&#xff0c;这事儿其实比想象中简单多了。我们这次要对付的是ST7789V2这款驱动芯片&#xff0c;它…...

CANN/asc-devkit向量最小值函数

asc_min 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地址: https://gitcode.com/ca…...

别再只用Matplotlib画图了!用Python这3个库(SciPy, NumPy, Scikit-learn)给你的数据曲线做个‘美容’

Python数据平滑三剑客&#xff1a;用Savitzky-Golay、插值与滑动平均打造专业级图表 当你面对满是噪点的折线图时&#xff0c;是否想过这些锯齿状的波动正在掩盖数据的真实故事&#xff1f;就像摄影师不会直接发布未经修饰的RAW格式照片&#xff0c;数据科学家也需要掌握图表美…...

工程师必读:六大情感触发器,破解技术产品市场转化难题

1. 项目概述&#xff1a;当工程师遇上商业&#xff0c;一场关于“情感”的必修课最近有个工程师朋友跟我抱怨&#xff0c;说他团队花了两年心血打磨的产品&#xff0c;技术指标全面领先&#xff0c;结果推向市场后反响平平&#xff0c;远不如隔壁一个技术平平但“会讲故事”的竞…...