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

【安卓】安卓xTS之Media模块 学习笔记(3) VTS测试

1. 背景

接下来进行正式的VTS测试。本章节还是以Media模块相关进行介绍。
VTS主要测的是内核和HAL层,media的hal层是以openMax(即将废弃,今日2023.12) 和 Codec2 (后续主流) 接口为主。
这里我们只看Codec2的要求,CDD里也只要求了这个。

2. 参考文档

  • 供应商测试套件 (VTS) 和基础架构 | Android 开源项目 | Android Open Source Project

3. 测试步骤

3.1 VTS测试包获取

3.1.1 自行编译

谷歌官网没有提供测试包,需要自行编译

. build/envsetup.sh
lunch aosp_arm64-userdebug
make vts -j32

生成的文件在: \out\host\linux-x86\vts
在这里插入图片描述
把zip包拷贝到 X86宿主机上,解压即可使用。
(如果是windows主机的话,要改下 vts-tradefed 里的环境识别,具体改法参照第2章节)

3.2 VTS测试包文件结构

  • 初次解压的android-vts.zip包中只有testcases 和 tools 两个文件夹,其他文件夹都是后续运行生成的
  • 解压后的android-vts文件夹名称不能修改,但可以放在别的文件夹路径下运行。
android-vts| ---- jdk : 包含一些运行所需要的软件| ---- logs :每次测试抓取的日志文件| ---- latest : 一个快捷方式,指向最新结果| ---- 2023.11.17_22.46.43| ---- 2023.11.17_22.10.44| ---- ……| ---- results : 每次测试生成的结果报告,有时间戳可以分辨| ---- latest : 一个快捷方式,指向最新结果| ---- 2023.11.17_22.46.43| ---- 2023.11.17_22.10.44| ---- ……| ---- subplans:生成的测试计划| ---- testcases:测试用例,每个文件夹对应VTS里的一个module| ---- android.hardware.tests.msgq@1.0-service-test| ---- arm| ---- arm64| ---- ApkVerityTest| ---- ……| ---- VtsHalMediaC2V1_0TargetVideoDecTest| ---- VtsHalMediaC2V1_0TargetVideoDecTest.config:功能模块的配置文件| ---- arm| ---- arm64 : 64位系统的测试进程| ---- VtsHalMediaC2V1_0TargetVideoEncTest| ---- tools:测试工具,一些jar,以及VTS的测试入口 | ---- vts-tradefed : 测试入口| ---- ……

3.3 测试命令

优先敲 vts-tradefed 进入concoles之后,再执行命令

cd tools
./vts-tradefed
XXXXX

如果这样运行有异常(windows HOST 有时候运行有问题),也可以直接1条命令运行,

cd tools
./vts-tradefed run commandAndExit vts --abi arm64-v8a --module VtsHalMediaC2V1_0TargetVideoDecTest --disable-reboot --skip-device-info --skip-all-system-status-check --skip-preconditions

3.3.1 常见命令

  • 直接运行, 跑 VtsHalMediaC2V1_0TargetVideoDecTest 模块
./vts-tradefed run commandAndExit vts --abi arm64-v8a --module VtsHalMediaC2V1_0TargetVideoDecTest --disable-reboot 
  • 建立测试subplan
./vts-tradefed l r    查看刚才测试结果的session号,注意是小写字母L不是数字1, l r 意思是 list results
./vts-tradefed add subplan  --session 158 --name VtsHalMediaC2V1_0TargetVideoDecTest_20230915-10 --result-type  not_executed
./vts-tradefed run commandAndExit vts --abi arm64-v8a --module VtsHalMediaC2V1_0TargetVideoDecTest --disable-reboot  -o --subplan VtsHalMediaC2V1_0TargetVideoDecTest_20230915-10

3.3.2 一些常见的option:

  • –abi arm64-v8a :只测试arm64 的case, FPGA android 固件只支持64位。 如果在参考平台(Inception 平板)
  • –disable-reboot:防止Android系统重启.FPGA 版本Android 不支持reboot 功能,需要在运行XTS 测试时
  • –skip-device-info --skip-all-system-status-check --skip-preconditions:跳过检测 ,FPGA 版本Android 系统检测较慢
    如果运行完整的vts测试,需要加上以下参数 跳过fastboot 测试 **–exclude-filter FastbootGetvarUserspaceTest --exclude-filter FastbootVerifyUserspaceTest

4. 测试结果说明

4.1 结果result

测试结果位于\android-vts\results\对应时间戳子文件夹下。
打开 test_result.html 文件。

请添加图片描述
请添加图片描述

整个测试结果显示我分为4个区。
区域1, Summary,整体记录这次测试的一些信息
区域2,测试结果,记录一共跑了哪些模块,通过多少,失败多少,Assumption Failure多少,忽略多少,是否完成了整个测试。
这里介绍下 Assumption Failure, 和 Done。
Assumption Failure 是指这个case,VTS判断就是应该失败的,比如设备不是TV类的,没有TV相关的系统进程,但是VTS跑了TV类的模块测试,这些就都是 Assumption Failure。所以这类case不计入失败率的。
Done 标志 这个模块的测试有没有完成(可能中间检测到一些系统级别的异常,比如设备断开,响应超时等等,导致这个模块里的case没有测试完)。
区域3,失败case,这里会单独把所有的失败用例列出来,并抓取失败时的报错信息进行显示(比区域4的details更详细一点)
区域4,所有case,模块里的所有case测试结果都在这里有显示,包含所有的成功和失败。

4.2 日志log

测试日志位于android-vts\log\对应时间戳子文件夹下。

5. 测试用例说明

5.1 VTS 用例介绍

VTS的case用例类型分为好几种

  • Gtest:绝大多数都是Gtest,C++编写,也是谷歌强烈建议的方式
  • Linux内核测试
  • Junit
  • python3
    具体的区别可以参见谷歌文档:
    请添加图片描述

5.2 VTS media 相关模块

media 中 VTS 相关的模块有
VtsHalMediaC2V1_0TargetComponentTest
VtsHalMediaC2V1_0TargetMasterTest
VtsHalMediaC2V1_0TargetVideoDecTest
VtsHalMediaC2V1_0TargetVideoEncTest
VtsHalMediaOmxV1_0TargetComponentTest
VtsHalMediaOmxV1_0TargetStoreTest
VtsHalMediaOmxV1_0TargetVideoDecTest
VtsHalMediaOmxV1_0TargetVideoEncTest
vts_mediaCodecs_validate_test
vts_mediaProfiles_validate_test

看名字能看出来,前面4个都是codec2接口的测试,后面4个是OpenMax接口的测试。
这里我们主要关注codec2接口相关的验证。

5.3 VTS测试流程

先看一下 tools文件夹下的 vts-tradefed,这是整个测试的入口。
VTS也是基于谷歌的 Trade Federation 测试框架进行的。
vts-tradefed文件比较简单,自己丢到文心一言里按行分析一下,就可以得到具体的结果。
前面就是check一些环境变量和行为之类的,没什么好说的。
重点关注最下面的2句话

VTS_TESTCASES=${VTS_ROOT}/android-vts/testcases/
VTS_TESTCASES=${VTS_TESTCASES} ${JAVA_BINARY} $RDBG_FLAG -Xmx4096m -XX:+HeapDumpOnOutOfMemoryError -cp ${JAR_PATH} -DVTS_ROOT=${VTS_ROOT} com.android.compatibility.common.tradefed.command.CompatibilityConsole "$@"

就是使用java虚拟机启动 com.android.compatibility.common.tradefed.command.CompatibilityConsole, 把所有入参都传过去。($@)

com.android.compatibility.common.tradefed.command.CompatibilityConsole 进程通常在运行 CTS 测试时启动。它提供了一个控制台界面,用于显示测试结果、日志和其他相关信息。开发者可以使用这个界面来监视和调试 CTS 测试的执行过程,以确保他们的应用程序在各种 Android 设备上都能够正常运行。这个进程通常只在运行 CTS 测试时出现,并且只会在特定情况下启动。在常规使用 Android 设备时,这个进程通常不会运行。

以 VtsHalMediaC2V1_0TargetVideoDecTest 测试为例,
使用的测试资源是 \android-vts\testcases\VtsHalMediaC2V1_0TargetVideoDecTest\
请添加图片描述

可以看到有2个文件夹,arm 和 arm64 ,分别针对32位和64位系统。
VtsHalMediaC2V1_0TargetVideoDecTest.config 是测试使用的资源,包括媒体资源(码流文件,视频文件),测试进程 vts_media_c2_v1_0_video_dec_test。

请添加图片描述

可以看出,文件除了 视频文件(.vp9/.vp8/.m2v……)之外,还有 .info 和 .md5 两类。
看了下,info里应该放的是每一帧的时间戳,.md5放的是文件的校验码
去代码看一下。
每个case里依赖的文件对应关系。
请添加图片描述

然后在getFileNames中,根据index可以对应拿到每个case的 inputFile(输入文件),infoFile(时间戳文件),CheckSumFile(校验文件)

请添加图片描述

然后mChksumFile在DecodeTest中会用到。
if (!mChksumFile.compare(sResourceDir)) mMd5Enable = false; 说明这个case在gCompToFiles数组中没有对应的md5文件,因此不进行Md5检测。
请添加图片描述

把md5这个文件按二进制读取到mRefMd5这块内存中
然后在这里
void compareMd5Chksm(std::unique_ptr<C2Work>& work)中,分YUV平面去计算独立的md5,然后进行memcpy
原理是啥??
为什么解码结果可以按bit来compare,不同的解码器,参数会不会不一样?

VtsHalMediaC2V1_0TargetVideoDecTest.config 记录的是 需要push的文件,push的位置,测试的用例option。

在这里插入图片描述

测试进程会解析这个config文件,进行case配置。
基本可以看出流程是:
先cleanup测试环境,
然后adb push 测试用例 vts_media_c2_v1_0_video_dec_test 到 /data/local/tmp/vts_media_c2_v1_0_video_dec_test
在这里插入图片描述

然后把一堆依赖的资源文件 push进去 /data/local/tmp/media/
最后运行
vts_media_c2_v1_0_video_dec_test -P /data/local/tmp/media/
在这里插入图片描述

那究竟 VtsHalMediaC2V1_0TargetVideoDecTest 这个进程做了什么呢,
这就需要去framework代码里看一下了。
VtsHalMediaC2V1_0TargetVideoDecTest 位于 frameworks/av/media/codec2/hal/hidl/1.0/vts/functional/video/
在这里插入图片描述
打开 frameworks/av/media/codec2/hal/hidl/1.0/vts/functional/video/VtsHalMediaC2V1_0TargetVideoDecTest.cpp 文件,
在线代码链接
可以发现有很多 TEST_P 开头的函数,这都是GTEST框架,
比如

TEST_P(Codec2VideoDecHidlTest, validateCompName)
TEST_P(Codec2VideoDecHidlTest, configureTunnel)
TEST_P(Codec2VideoDecDecodeTest, DecodeTest)
TEST_P(Codec2VideoDecHidlTest, AdaptiveDecodeTest)
TEST_P(Codec2VideoDecHidlTest, ThumbnailTest)
TEST_P(Codec2VideoDecHidlTest, EOSTest) 
TEST_P(Codec2VideoDecHidlTest, FlushTest)
TEST_P(Codec2VideoDecHidlTest, DecodeTestEmptyBuffersInserted)
TEST_P(Codec2VideoDecCsdInputTests, CSDFlushTest)

这些对应的就是 测试结果中的一个个部分,
截了个图,能看到,
TEST_P(Codec2VideoDecHidlTest, validateCompName) 对应就有很多 PerInstance/Codec2VideoDecHidlTest#validateCompName/software_c2_XXXX 的 测试用例,
整体来说,
每个TEST_P的入口上都有很多测试。
测试会去遍历所有的解码用的C2 component进行测试。

在这里插入图片描述

5.4 VtsHalMediaC2V1_0TargetVideoDecTest

主要模块

Media的codec2在vts这边主要就是Dec和Enc两个模块,其中,
VtsHalMediaC2V1_0TargetVideoDecTest 主要包含了以下几个模块:

  • PerInstance/Codec2VideoDecHidlTest#validateCompName:验证注册的有效解码器名字是否合规(包含软解和硬解)
  • PerInstance/Codec2VideoDecHidlTest#configureTunnel:验证Tunnel配置是否正常,验证bufferQ相关。确保数据能正确传输,对应代码
  • PerInstance/Codec2VideoDecHidlTest.AdaptiveDecodeTest: 自适应测试,不同比特率不同分辨率不同帧率,对应代码
  • PerInstance/Codec2VideoDecHidlTest.ThumbnailTest:多个流发送,对应代码
  • PerInstance/Codec2VideoDecHidlTest.EOSTest:直接发EOS来测试?
  • PerInstance/Codec2VideoDecHidlTest.FlushTest
  • PerInstance/Codec2VideoDecHidlTest.DecodeTestEmptyBuffersInserted: 插入空的一帧,测丢帧等等
  • StreamIndexAndEOS/Codec2VideoDecDecodeTest.DecodeTest:解码测试
  • CsdInputs/Codec2VideoDecCsdInputTests.CSDFlushTest:EOS01,结束符 SPS PPS

我们也可以通过 gtest_list_tests 查支持的测试用例
./vts_media_c2_v1_0_video_dec_test --gtest_list_tests

在这里插入图片描述

依赖的资源

不需要单独提供资源包,VTS这两个模块需要的资源包都在VTS的包里了,会自动push到/data/local/tmp下去运行。

5.5 VtsHalMediaC2V1_0TargetVideoEncTest

主要模块

  • PerInstance/Codec2VideoEncHidlTest/validateCompName
  • PerInstance/Codec2VideoEncHidlTest/EOSTest
  • PerInstance/Codec2VideoEncHidlTest/FlushTest
  • InvalidBufferTest
  • AdaptiveBitrateTest
  • EncodeTestwithEOS/Codec2VideoEncEncodeTest/EncodeTest
  • NonStdSizes/Codec2VideoEncResolutionTest/ResolutionTest

Case命名原则

看result的时候,发现大量的case命名为 XXXXX_数字A_数字B_数字C_数字D 的格式
比如
在这里插入图片描述

那这些数字是代表什么意思的呢?
看VtsHalMediaC2V1_0TargetVideoEncTest.cpp的main。
在这里插入图片描述

从0(000)~7(111)进行循环,生成 000, 001,010,011,100,101,110,111 共8种参数配置,连上原有的参数0和参数1,凑成5个参数进行测试。
后面在resolution测试中插入了一些固定的参数测试,
在这里插入图片描述

对应结果中的这些测试用例
在这里插入图片描述

在模块中每个组件测试中,
会拿到这些参数,进行单独测试使用。
比如EncodeTest,参数2就是代表发不发EOS,参数3代表第一帧是不是空帧,参数4代表有没有B帧等等。
在这里插入图片描述

5.6 单用例调试方法

在vts出问题进行程序调试的时候,我们需要运行指定用例。

  • TF测试套件
    如果使用tf测试套件,

  • 手动执行单个case
    从调试方便的角度,还是直接运行GTEST用例更方便。
    如果使用手动运行Gtest,可以使用GTEST支持的filter来指定,如我想跑:
    可以运行
    ./vts_media_c2_v1_0_video_dec_test --gtest_filter=*.validateCompName/default_c2_mtk_av1_decoder_0
    注意的是,如果缺少一些库,
    需要自己export路径,比如
    export LD_LIBRARY_PATH=/apex/com.android.art/lib64/:/vendor/lib64:/system/lib64;等等

5.7 一些常见报错

环境问题

  • Wrong java version.
    在这里插入图片描述

A:TF框架依赖的安卓版本不对。按照使用的CTS测试包中建议,重新安装对应的JDK模拟器版本即可。我这边,安卓13用的11,安卓14用的17。

  • 外部存储无法mounted
    在这里插入图片描述
    查看/sdcard路径挂载了没有

  • 运行vts-tradefed 无法进入
    在这里插入图片描述

有时候windows上运行有问题,可以直接跑命令

./vts-tradefed run commandAndExit vts --abi arm64-v8a --module VtsHalGraphicsMapperV4_0TargetTest --disable-reboot --skip-device-info --skip-all-system-status-check --skip-preconditions

运行问题

  • vts程序挂死、卡住,无法打印帮助信息等?
    A:基本上都是因为没有启动c2服务器进程,手动启动c2服务进程后,vts进程可以恢复正常;

  • went over its timeout for outputing a response
    在这里插入图片描述

怀疑是这里的超时参数设置的太小,因为FPGA上case运行的非常慢,导致获取结果超时。
在这里插入图片描述

在线代码:NativeDeviceStateMonitor | Android Open Source Project

相关文章:

【安卓】安卓xTS之Media模块 学习笔记(3) VTS测试

1. 背景 接下来进行正式的VTS测试。本章节还是以Media模块相关进行介绍。 VTS主要测的是内核和HAL层&#xff0c;media的hal层是以openMax&#xff08;即将废弃&#xff0c;今日2023.12&#xff09; 和 Codec2 (后续主流) 接口为主。 这里我们只看Codec2的要求&#xff0c;CDD…...

Go实现http同步文件操作 - 增删改查

http同步文件操作 - 增删改查 http同步文件操作 - 增删改查1. 前置要求1.1. 构建结构体 文件名 文件内容1.1.1. 页面结构体1.1.2. 为Page结构体绑定方法&#xff1a;Save1.1.3. 对Page结构体支持页面内容查看方法&#xff0c;同时提供页面文件是否存在的方法 1.2. 简单验证上面…...

Spring Boot整合 Spring Security

Spring Boot整合 1、RBAC 权限模型 RBAC模型&#xff08;Role-Based Access Control&#xff1a;基于角色的访问控制&#xff09; 在RBAC模型里面&#xff0c;有3个基础组成部分&#xff0c;分别是&#xff1a;用户、角色和权限&#xff0c;它们之间的关系如下图所示 SELECT…...

浅谈低代码

低代码开发是近年来迅速崛起的软件开发方法&#xff0c;让编写应用程序变得更快、更简单。有人说它是美味的膳食&#xff0c;让开发过程高效而满足&#xff0c;但也有人质疑它是垃圾食品&#xff0c;缺乏定制性与深度。你认为低代码到底是美以下方向仅供参考。味的膳食还是垃圾…...

Innodb-ruby深入探索Innodb存储结构

达在之前已经分享过Innodb数据存储结构知识&#xff0c;但是都是基于理论原理知识理解&#xff0c;今天利用Innodb文件解析工具ruby进行探索Innodb真实的存储结构。 索引原理过程&#xff1a;【Mysql】 InnoDB引擎深入 - 数据页 | 聚集索引_innodb的聚集索引的数据插入_Surviv…...

Echarts的使用 笔记

1.数据可视化前言 1.1.什么是数据可视化 数据可视化&#xff1a; 就是把数据以更加直观的方式进行呈现. 1.2.数据可视化的好处 清晰有效地传达与沟通信息更容易洞察隐藏在数据中的信息 2.ECharts的基本使用 2.1.ECharts官网 ECharts是百度公司开源的一个使用 JavaScript 实…...

信息系统工程的基本概念

系统是由相互作用和相互依赖的若干部分&#xff0c;按一定规律结合成的、具有特定功能的有机整体。系统有下述特性&#xff1a; &#xff08;1&#xff09;集合性。系统是由许多元素有机地组成的整体。每个元素服从整体&#xff0c;追求全局最优。 &#xff08;2&#xff09;相…...

SAP UI5 walkthrough step10 Descriptor for Applications

在这一步&#xff0c;我们将会把所有的应用相关的描述性的文件独立放到manifest.json 新建一个manifest.json文件 webapp/manifest.json (New) {"_version": "1.58.0","sap.app": {"id": "ui5.walkthrough","i18n&q…...

打造专属小程序,乔拓云模板平台助力商家抢占先机

打造专属小程序&#xff0c;乔拓云模板平台助力商家抢占先机&#xff01;该平台涵盖全行业小程序模板&#xff0c;一键复制即可上线。 想要快速创建高效实用的小程序&#xff0c;乔拓云小程序模板开发平台为您提供了解决方案&#xff01;我们为您提供一系列精心设计的小程序模板…...

Vue2学习(组件的使用)

Vue中使用组件的三个步骤&#xff1a; 一、定义组件(或者叫创建组件) 使用Vue.extend(options)创建&#xff0c;其中options和new Vue(options)时传入的那个options几乎一样&#xff0c;但也有点区别&#xff1b; 区别如下&#xff1a; 1.el不要写&#xff0c;为什么&#x…...

基于Spring、SpringMVC、MyBatis开发的游乐场管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring、SpringMVC、MyBatis开发的游…...

数据清洗、特征工程和数据可视化、数据挖掘与建模的应用场景

1.5 数据清洗、特征工程和数据可视化、挖掘建模的应用场景 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解1.5节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学应…...

Qt简介、工程文件分离、创建Qt工程、Qt的帮助文档

QT 简介 core&#xff1a;核心模块&#xff0c;非图形的接口类&#xff0c;为其它模块提供支持 gui&#xff1a;图形用户接口&#xff0c;qt5之前 widgets&#xff1a;图形界面相关的类模块 qt5之后的 database&#xff1a;数据库模块 network&#xff1a;网络模块 QT 特性 开…...

机器学习与低代码开发:创新驱动的双剑合璧

引言 随着科技的日新月异&#xff0c;机器学习和低代码开发已经成为引领技术行业变革的两大重要趋势。机器学习通过模拟人类的学习方式&#xff0c;让计算机具备了自我学习和预测的能力&#xff0c;打破了传统计算机程序的局限性。而低代码开发则以简化软件开发过程为目标&…...

企业博客SEO:优化SOP,助您提升搜索引擎可见性

企业博客是互联网时代企业与用户沟通的重要渠道之一&#xff0c;引流成本也比较低。然而&#xff0c;依然有企业会处在3种状态&#xff1a; 1. 有博客&#xff0c;但内容更新不积极或搁置 2. 有博客&#xff0c;但内容散乱 3. 根本就没有博客 如果是这几种状态&#xff0c;…...

[HITCON 2017]SSRFme perl语言的 GET open file 造成rce

这里记录学习一下 perl的open缺陷 这里首先本地测试一下 发现这里使用open打开 的时候 如果通过管道符 就会实现命令执行 然后这里注意的是 perl 中的get 调用了 open的参数 所以其实我们可以通过管道符实现命令执行 然后这里如果file可控那么就继续可以实现命令执行 这里就…...

华为配置Smart Link主备备份示例

定义 Smart Link&#xff0c;又叫做备份链路。一个Smart Link由两个接口组成&#xff0c;其中一个接口作为另一个的备份。Smart Link常用于双上行组网&#xff0c;提供可靠高效的备份和快速的切换机制。 Monitor Link是一种接口联动方案&#xff0c;它通过监控设备的上行接口…...

harmonyOS开发技巧(一)——封装hilog日志

1. 创建sharedLibrary共享hsp包commonLib&#xff1a;功能工具类。 import hilog from ohos.hilog;class Logger {private DOMAIN: number 0x0000;private APP_NAME: string Myapplication;public info(tag: string, ...args: string[]) {hilog.info(this.DOMAIN, [${this.A…...

npm、yarn常用命令

1、设置npm路径 #全局安装路径 npm config set prefix "D:\Program Files\nodejs\node_global" #缓存路径 npm config set cache "D:\Program Files\nodejs\node_cache"2、设置镜像 #1,淘宝镜像源 npm config set registry https://registry.npmmirror.…...

编译和使用WPS-ghrsst-to-intermediate生成SST

一、下载 V1.0 https://github.com/bbrashers/WPS-ghrsst-to-intermediate/tree/masterV1.5&#xff08;使用过程报错&#xff0c;原因不详&#xff0c;能正常使用的麻烦告知一下方法&#xff09; https://github.com/dmitryale/WPS-ghrsst-to-intermediate二、修改makefile…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...