迅为RK3576开发板Android 多屏显示
迅为iTOP-3576开发板采用瑞芯微RK3576高性能、低功耗的应用处理芯片,集成了4个Cortex-A72和4个Cortex-A53核心,以及独立的NEON协处理器。它适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品。
1.1 Android 多屏同显
iTOP-RK3576 开发板支持以下屏幕
迅为 MIPI 7 寸屏幕
标准 HDMI 屏幕(通过 HDMI 线连接)
迅为 LVDS 7 寸屏幕
迅为 LVDS 10.1 寸 1024*600 屏幕
迅为 LVDS 10.1 寸 1280*800 屏幕
然后修改 Android 源码 kernel-6.1/arch/arm64/boot/dts/rockchip/topeet-screen-lcds.dtsi 中的
设备树文件,如下图所示。LVDS 屏幕是 MIPI 通过转接板连接显示的,RK3576 不支持 LVDS
显示接口。
我们可以根据自己的需求来修改 topeet-screen-lcds.dtsi 文件。总之,修改
topeet_screen_choose.dtsi 的规律是:打开所连接的屏幕对应的宏定义,rk3576 有三个显示通
道 vp0 vp1 vp2,所打开的宏定义对应的 vp 通道不能重复。默认打开对应的宏定义为多屏同显。
如果打开的宏定义是#define LCD_TYPE_LVDS_10_1_1280x800_GT9271, 需要将
kernel-6.1/arch/arm64/configs/rockchip_defconfig 文件中的
CONFIG_TOUCHSCREEN_GT9271=y 宏定义使能,然后再编译源码。
如果打开的宏定义是#define LCD_TYPE_LVDS_10_1_1024x600_GT911,需要将
kernel-6.1/arch/arm64/configs/rockchip_defconfig 文件中的 CONFIG_TOUCHSCREEN_GT9XX
宏定义使能,然后再编译源码。
1.2 Android 多屏异显
如果要支持多屏异显,首先要调试好双屏或多屏都可以正常显示,并且分别挂载在不同的
vp 上,可以参考上一个小节根据自己的需求打开 topeet-screen-lcds.dtsi 设备树中的宏定义。默
认开启后,多屏显示的是同一个画面(如果要支持双屏或者多屏异显,需要应用支持异显,才会显示不同的内容)。查看当前的屏幕显示状态输入以下命令
cat /sys/kernel/debug/dri/0/summary
如果双屏或者多屏的显示器分辨率比例不同,比如说主屏是 16:9,副屏是 4:3,那么副
屏显示的画面会拉伸或者缩小,原因是副屏的画面是主屏映射过去的,所以副屏上显示的是
主屏的分辨率。如果同样的屏幕情况下,应用支持异显,那么副屏会显示实际正常的分辨率。
所以如果要支持双屏或者多屏同显并要求显示正常,双屏或者多屏的屏幕的分辨率比要一致。
1.2.1 指定主副屏
多屏异显的实际应用中,需要指定哪个是主屏,哪个是副屏。修改 Android14 源码目录下
rk3576_android14/device/rockchip/rk3576/topeet_rk3576/topeet_rk3576.mk 文件,添加如下内容:
如果要指定 MIPI 屏幕为主屏,HDMI 屏幕为副屏,如下设置:
PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.primary=DSI
PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.extend=HDMI-A
如果要指定 MIPI 屏幕为主屏,EDP 屏幕为副屏,如下设置:
PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.primary=DSI
PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.extend=eDP
如果需要定义多个主副屏时,需要用逗号隔开,比如指定 MIPI eDP 为主屏,HDMI-A 为副屏,
设置如下:
PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.primary=DSI,eDP
PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.extend=HDMI-A
1.2.2 异显方案介绍
目前有两种异显方案分别是 Android Presentation 和 Andorid Activity 指定屏幕启动 。
Android Presentation,需要 APP 应用开发中调用相应接口使指定的 view (Presentation
view 是一个特殊的 dialog 类型 view)在副屏中显示。
Android Activity 指定屏幕启动,APP 在启动 activity 时可以使用 display id 参数在对应
的屏幕上直接显示。
两者主要区别在:
1 前者的 acitivity 需要独立开发,把需要显示的内容投到副屏,后者可以不需要源码,调用命令行或者系统接口把第三方 app 的 acitivity 投送到副屏;
2 .前者只有一个 activity 在顶层,通过特殊的 dialog 将指定内容显示在副屏,后者是两
个 activity 分别显示在主副屏。
接下来我们详细讲述这俩种方法。
1.2.3 Android Presentation
本小节讲解 Android Presentation 异显方案,瑞芯微和迅为提供了使用 Android Presentation
编写好的 APP 例程,接下来进行测试。
1.2.3.1 ApiDemos APP
在 Android12 源码中瑞芯微已经提供了使用 Presentation 接口的测试 APP,在源码
development/samples/ApiDemos 目录下,需要使用 mm 命令编译 APP。迅为提供了编译好的
测试 APP 在网盘资料“iTOP-RK3576 开发板/02_【iTOP-RK3576 开发板】/07_多屏显示配套
资料/Android/ApiDemosAPK”目录下。
此 APP 源码在 Android 源码 rk3576_android14/development/samples/ApiDemos 目录下,进
入此目录,输入“mm”命令进行编译,如下图所示:
然后使用 adb 命令安装 APP,依次点击 App->Activity->Presentation 选项,即可进入
Presentation 调用界面。如下图所示:
在该界面需点击如下副屏的 checkbox 选项,即可在副屏显示相应图片。如下所示:
副屏 HDMi 屏幕显示图片,如下所示:
1.2.3.2 Presentation sampleAPP
此 APP 在网盘资料“iTOP-RK3576 开发板/02_【iTOP-RK3576 开发板】/07_多屏显示配
套资料/Android/Presentation-sample”目录下,下载此 APP 工程,然后用 Androidstudio 打开,
并编译 apk。编译成功之后,安装 APP,APP 安装成功之后如下图所示:
打开 APP 如下图所示:
点击“显示副屏”按钮,会在副屏显示,如下图所示:
APP 重要知识点讲解:
随着用户的需求增多,特别是对于一些 Android 平板电脑以及其他的一些 Android 智能设
备可能有多个屏幕,用户不仅想要在主屏幕上显示内容,同样在第二屏幕上也要显示想要的
内容,这样可以达到更好的体验效果。Google 也是不负众望在 Android4.2 版本以后提供了
Presentation 类,可以轻松实现在两块屏幕上同时显示不同的内容。Presentation 是一个特殊的
dialog,它的目的是显示内容到第二屏幕。在 Presentation 创建的时候关联一个目标设备,确
定 Presentation 要显示在那个设备上,根据这个设备的信息来配置 Presentation 的 context 和
resources 信息。目前系统提供了两种方式来与目标显示屏进行绑定。
1 通过 MediaRouter 接口获取并绑定:
选择显示 presentation 的设备最简单的方法就是使用 Media Router,media router 服务持续
追踪在系统中哪个音频、视频线路是可用的,当 routes 被选择或者不被选择,或者更好的显
示 presentation display 的线路发生改变后 media router 就会发送消息。所以一些应用程序可以
自动监视这些消息来在首选设备上显示或取消 presentation。
首选显示 presentation 的设备是 Media Router 进行推荐的,如果应用想要显示内容在第二
屏幕上就该使用该设备。下面将给出如何使用 media router 在主屏的设备创建和显示
presentation。
MediaRouter mediaRouter =(MediaRouter)
context.getSystemService(Context.MEDIA_ROUTER_SERVICE); MediaRouter.RouteInfo route =
mediaRouter.getSelectedRoute();
if(route !=null){
Display presentationDisplay = route.getPresentationDisplay();
if(presentationDisplay !=null){
Presentation presentation =newMyPresentation(context, presentationDisplay);
presentation.show();
}
}
根据上面代码可以看出通过系统服务 Media Router 来选择一个合适的 route,从 route 中来
获取首选的 display,如果 display 不为空就会创建该 presentation,创建完成后调用 presentation
的 show 方法将该 presentation 显示出来。
2 通过 DisplayManager 接口获取并绑定
另外一个获取首选 display 的方法是直接使用 display Manager 来获取。display manager 服
务提供方法枚举和描述系统中所有的设备,包括可以显示 presentation 的设备。display manager
持续追踪系统中所有的设备,然而,并不是所有的设备都适合显示 presentation,例如,如果
一个 Activity 试图在主屏幕上显示一个 presentation,它可能会掩盖自己的内容,这就像在
Activity 上打开一个 dialog 一样。
DisplayManager displayManager =(DisplayManager)
context.getSystemService(Context.DISPLAY_SERVICE); Display[] presentationDisplays
=displayManager.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION);
if(presentationDisplays.length >0){
// If there is more than one suitable presentation display, then we could consider
// giving the user a choice. For this example, we simply choose the first display
// which is the one the system recommends as the preferred presentation display.
Display display = presentationDisplays[1]; // displays[1]是副屏
Presentation presentation =new MyPresentation(context, presentationDisplay);
presentation.show();
}
根据上面代码可以看出通过系统服务 Display Manager 来获取所有适合显示 presentation 的
display 列表,如果获取到了多个适合 display 对象,我们选择副屏的 display。最后显示
presentation。
1.2.4 Android Activity 指定屏幕启动
本小节讲解 Android Activity 指定屏幕启动异显方案,瑞芯微提供了使用 Android Activity
指定屏幕启动编写好的 APP 例程,接下来进行测试。
1.2.4.1 dualscreendemo APP
RK DualScreen 主要区别与 android presentation,在于它实现了应用的派发,允许厂商快
速根据现有的 app 功能,进行模块的集成,减少开发周期和研发成本。示例代码为
DualScreenDemo.zip 工程,在网盘资料“iTOP-RK3576 开发板/02_【iTOP-RK3576 开发板】/07_
多屏显示配套资料/Android/DualScreenDemo”目录下下载。
使用 Androidstudio 打开此工程代码,编译安装 APP,安装完成后如下所示:
打开此 APP,如下所示,有三个按钮。
第三个按钮使用了 Android Activity 指定屏幕启动,关键代码如下所示,第一个和第二个
按钮使用了 Presentation。
private void showSecondByActivity(Context context){
ActivityOptions options = ActivityOptions.makeBasic();
MediaRouter mediaRouter = (MediaRouter)
context.getSystemService(Context.MEDIA_ROUTER_SERVICE);
MediaRouter.RouteInfo route =
mediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_VIDEO);
if (route != null) {
Display presentationDisplay = route.getPresentationDisplay();
options.setLaunchDisplayId(presentationDisplay.getDisplayId());
Intent intent = new Intent("android.intent.action.MUSIC_PLAYER");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent, options.toBundle());
}
}
在 startActivity 接口参数中设置指定屏幕的 display id,Activity 将在指定屏幕上直接启
动显示。
Activity 的多显示器支持需要设备支持<feature
name="android.software.activities_on_secondary_displays" />。
同时 application 或者 activity 需要支持分屏属性即<application>或者<activity>标签下设
置新的属性 android:resizeableActivity="true",这个属性在你 target 到 Android N 后
android:resizeableActivity 的默认值就是 true。
ActivityOptions 提供两个新函数以支持多个显示器,分别是 setLaunchDisplayId()和
getLaunchDisplayId()。
setLaunchDisplayId() 指定 Activity 在启动后应显示在哪个显示器上。
getLaunchDisplayId() 返回操作组件的当前启动显示器。
在上述代码中使用 MediaRouter 接口获取副屏的 display id,同理也可以使用
DisplayManager 接口获取响应的 display id。
1.2.5 支持输入法在副屏显示
修改 Android14 源码下的 device/rockchip/common/display_settings.xml 文件,如下所示:
将设置相应屏幕 shouldShowIme 为 true,如上配置支持输入法在 local:1 的副屏上显示。
1.2.6 副屏 DPI 设置
修改 Android14 源码下的 device/rockchip/common/display_settings.xml 文件,如下所示:
修改 forcedDensity 的值可以修改副屏的屏幕密度。
1.2.7 主屏幕可以触摸,副屏不触摸
如果想要实现主屏可以触摸,副屏不用触摸的功能。有两种解决方式:第一种是在 App
应用代码中实现。第二种需要修改 framework 层的源码。
第一种方式:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
第二种方式:
修改 Android14 源码 frameworks/native/services/inputflinger/reader/EventHub.cpp 文件,屏蔽掉 device->classes |= InputDeviceClass::EXTERNAL;属性,如下图所示:
1.2.8 多屏异触
多屏异触需要指定主副屏。这里使用修改 Android 源码的方式实现绑定副屏触摸芯片。这
样设置以后,系统开机会自动将 ft5x06 触摸绑定到副屏上面去。修改文件:
frameworks/native/services/inputflinger/reader/EventHub.cpp,添加如下加红的代码。通过修改
EventHub.cpp 文件,在 isExternalDeviceLocked 函数中判断设备名称为指定的副屏设备(比如
副屏的设备名称是 generic ft5x06 (79)),则返回 true。
bool EventHub::Device::isExternalDeviceLocked() {
const char *I2C_DEVICE_NAME = "generic ft5x06 (79)";
ALOGE("input deviceis '%s' ",device->identifier.name.c_str());
if (strcmp(device->identifier.name.c_str(), I2C_DEVICE_NAME) == 0) {
return true;
}
if (configuration) {
std::optional<bool> isInternal = configuration->getBool("device.internal");
if (isInternal.has_value()) {
return !isInternal.value();
}
}
return identifier.bus == BUS_USB || identifier.bus == BUS_BLUETOOTH;
}
这里的 I2C_DEVICE_NAME 需要根据实际情况添加,用户可根据 ALOGE 打印信息在
logcat 中寻找识别到的芯片实际的名字。下面是添加了 ALOGE 打印信息后在 logcat 中得到的
设备名字的截图:
上图中的 goodix-ts 和 generic ft5x06 (79)即为这里使用的触摸 IC 芯片的名字,将这个复制
到代码中即可。修改完毕,重新编译Android镜像,用户测试的时候可以直接使用ApiDemo APP
进行测试。
1.2.9 鼠标异屏切换
在多屏异显情况下,修改以下代码使鼠标箭头可以移动到需要的副屏上去进行操作。
我们需要修改 Android14 源码中
frameworks/native/services/inputflinger/reader/mapper/CursorInputMapper.cpp 文件
搜索"sys.mouse.presentation",然后将下面的代码中 0 改为 1。
//-----rk-code----
char mMousePresentation[PROPERTY_VALUE_MAX] = {1};
property_get("sys.mouse.presentation", mMousePresentation, "1");
if (strcmp(mMousePresentation, "1") == 0) {
if (std::optional<FloatRect> rect = mPointerController->getBounds();
rect.has_value()) {
if(xCursorPosition==rect->left||xCursorPosition==rect->right||yCursorPosition==rect->top||yCursor
Position==rect->bottom){
mDisplayId=getPolicy()->notifyDisplayIdChanged();
}
}
}else{
mDisplayId = mPointerController->getDisplayId();
}
然后重新编译 Android 源码,然后烧写镜像。
1.2.10 副屏显示配置
1.2.10.1 副屏全屏显示
设置副屏(副屏 1、副屏 2 等)是否全屏显示可通过修改 persist.sys.rotation.efull-n(n=1、
2、3、….)参数的取值进行配置,若配置为 true 则会进行全屏显示。
现以 MIPI 主屏、 HDMI 副 屏 为 例 ,修改如下:
在 device/rockchip/rk3576/topeet_rk3576/topeet_rk3576.mk 文件中添加如下内容,使得
HDMI 副屏可以全屏显示(由于副屏图像参考主屏宽高比进行缩放,若宽高比不一致,则出
现黑边,所以默认 HDMI 副屏显示会有黑边):
PRODUCT_PROPERTY_OVERRIDES += persist.sys.rotation.efull-1=true
修改完成后,保存退出,重新编译烧写镜像即可。
注:由于 mipi 竖屏显示与 HDMI 宽高比相差较大,HDMI 设置全屏显示后拉伸较明显!
1.2.10.2 副屏显示方向
副屏的旋转角度可通过 persist.sys.rotation.einit-n(n=1、2、3、….)属性控制,该属性用
于设置副屏(副屏 1、副屏 2 等)的显示方向,可取值为 0/1/2/3,分别表示将副屏显示方
向旋转(顺时针)0 度、90 度、180 度、270 度。
现以 MIPI 主屏、 HDMI 副 屏 为 例 ,修改如下:
在 device/rockchip/rk3576/topeet_rk3576/topeet_rk3576.mk 文件中添加如下内容,使得
HDMI 副屏的显示方向旋转 90 度:
PRODUCT_PROPERTY_OVERRIDES += persist.sys.rotation.einit-1=1
PRODUCT_PROPERTY_OVERRIDES += persist.sys.rotation.efull-1=false
修改完成后,保存退出,重新编译烧写镜像即可,HDMI 会旋转 90°竖屏显示。
相关文章:

迅为RK3576开发板Android 多屏显示
迅为iTOP-3576开发板采用瑞芯微RK3576高性能、低功耗的应用处理芯片,集成了4个Cortex-A72和4个Cortex-A53核心,以及独立的NEON协处理器。它适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品。 1.1 Android 多屏同显 iTOP-RK3576 开发板支持…...

cmake + vscode + mingw 开发环境配置
1.软件准备 准备如下软件: mingw64(安装完成之后检测是否有环境变量,如果没有需要配置) cmake(安装完成之后检测是否有环境变量,如果没有需要配置) vscode(安装CMake插件࿰…...

nginx 配置代理,根据 不同的请求头进行转发至不同的代理
解决场景:下载发票的版式文件,第三方返回的是url链接地址,但是服务是部署在内网环境,无法访问互联网进行下载。此时需要进行走反向代理出去,如果按照已有套路,就是根据不同的访问前缀,跳转不同的…...
类模板的使用方法
目录 类模板的使用方法 1.类模板语法 2.类模板和函数模板区别 3.类模板中成员函数创建时机 4.类函数对象做函数参数 5.类模板和继承 6.类模板成员函数类外实现 7.类模板分文件编写 person.hpp 实现cpp文件: 8.类模板与友元 9.类模板案例 MyArray.hpp …...
高级Python Web开发:FastAPI的前后端集成与API性能优化
高级Python Web开发:FastAPI的前后端集成与API性能优化 目录 🛠️ 前后端集成的基本原理与实践🚀 FastAPI的API设计与实现📈 API性能测试与负载测试 📊 使用Locust进行API性能测试💥 使用Apache JMeter进…...

期权懂|期权的溢价率和杠杆率有什么区别?
锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 期权的溢价率和杠杆率有什么区别? 一、定义篇 期权溢价率:这是一个细腻地描绘了期权价格与其内在价值之间微妙差异的指标。想象一下,期权价格就…...

分布式ID的实现方案
1. 什么是分布式ID 对于低访问量的系统来说,无需对数据库进行分库分表,单库单表完全可以应对,但是随着系统访问量的上升,单表单库的访问压力逐渐增大,这时候就需要采用分库分表的方案,来缓解压力。 …...
Py之cv2:cv2(OpenCV,opencv-python)库的简介、安装、使用方法(常见函数、图像基本运算等)
1. OpenCV简介 1.1 OpenCV定义与功能 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它为计算机视觉应用程序提供了一个通用的基础设施,并加速了在商业产品中使用机器感知。作为BSD许可的产品&…...

如何学习网络安全?有哪些小窍门?
学好网络安全其实没有所谓的捷径,也没有什么小窍门。 入门网络安全首先要有浓厚的学习兴趣,不然很容易就变成了从入门到放弃了。 其次要能静下心,踏踏实实的打好基础。如果你是零基础,建议从Web安全入手,课程难度相对…...
Dart语言的数据结构
Dart语言中的数据结构探讨 引言 Dart是一种现代化的编程语言,主要用于构建移动应用、Web应用和服务端应用。随着应用程序的复杂性日益增加,选择合适的数据结构显得尤为重要。数据结构不仅影响程序的性能,也影响程序的可维护性和可扩展性。本…...
TabPFN - 表格数据基础模型
文章目录 一、关于 TabPFN🌐TabPFN生态系统 二、快速入门🏁1、安装2、基本用法 三、使用技巧💡四、开发🛠️1、设置环境2、在提交之前3、运行测试 一、关于 TabPFN TabPFN是表格数据的基础模型,它优于传统方法&#x…...
AOF日志:宕机了Redis如何避免数据丢失?
文章目录 AOF 日志是如何实现的?三种写回策略日志文件太大了怎么办?AOF 重写会阻塞吗?小结每课一问 更多redis相关知识 如果有人问你:“你会把 Redis 用在什么业务场景下?”我想你大概率会说:“我会把它当作缓存使用&…...

MAC上安装Octave
1. 当前最新版Octave是9.3版本,需要把mac os系统升级到14版本(本人之前的版本是10版本) https://wiki.octave.org/Octave_for_macOS octave的历史版本参考此文档:Octave for macOS (outdated) - Octavehttps://wiki.octave.org/Oc…...
C 语言中二维数组的退化
目录 1. 一维数组的退化 2.字符串数组的退化 3. 二维数组的退化 3.1 为什么退化为 int (*)[4] 而不是 int **? 3.2举例说明 3.3 .总结 在 C 语言中,数组名在大多数情况下会退化为指向其第一个元素的指针,这种机制称为数组退化…...

Notion 推出捏脸应用 | Deving Weekly #15
CEF-Detector-X 现在 Chromium 占据了桌面应用的大壁江山,典型的有 Electron 框架,底层就是基于 Chromium 内核,上百 M 的臃肿包体积一直别人诟病。 CEF-Detector-X 可以检测你电脑有多少个 基于 Chromium 应用,并且会生成一份「…...
C# Linq 查询
1.Linq 查询表达式基础 Linq 查询应用程序始终将源数据视为 IEnumerable<T> 或 IQueryable<T> 集合。 LINQ查询表达式包含8个基本子句,分别为from、select、group、where、orderby、join、let和into。 子 句备注from指定数据源和范围变量select指定当执行查询…...
ES7【2016】、ES8【2017】新增特性
ES7【2016】新增特性 幂指数操作符 在ES7【2016】中新增了幂指数操作,幂指数操作符是**。它用于指数计算 基本语法:baseValue ** exponent 参数说明:baseValue是基数,exponent是指数。 let base 2; let exponent 4; let resul…...

64细分步进电机驱动器TMC2209
封装和丝印 典型电路1 典型电路2 应用 兼容设计升级 3D 打印机 打印机、POS 办公和家庭自动化 纺织、缝纫机 闭路电视, 安保 ATM, 现金回收机 暖 通 空调 电池供电设备 特点和优势 2 相步进电机,线圈电流(峰值)高达…...

C# 获取PDF文档中的字体信息(字体名、大小、颜色、样式等
在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响。然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文档。获取PDF中的字体信息可以解决这个问题,让我们能够更好地处理这些文件。…...
linux 安装PrometheusAlert配置钉钉告警
在 Linux 上安装 PrometheusAlert 并配置钉钉告警的步骤如下: 1. 准备工作 钉钉机器人: 在钉钉群中创建一个机器人,获取 Webhook URL。示例 Webhook URL:https://oapi.dingtalk.com/robot/send?access_token=your_dingtalk_token。PrometheusAlert 安装包: 从 Prometheus…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...