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

bilibili 哔哩哔哩小游戏SDK接入

小游戏的文档 简介 · bilibili小游戏bilibili小游戏具有便捷、轻量、免安装的特点。游戏包由云端托管,在哔哩哔哩APP内投放和运行,体验流畅,安全可靠。icon-default.png?t=O83Ahttps://miniapp.bilibili.com/small-game-doc/guide/intro/

没想过接入这个sdk比ios还难,ios不让用插屏广告与原生广告,被打回来了一次,去掉就行,还有截图必须是当前游戏的,不要糊弄。

哔哩哔哩官方目前的api还是有点乱的,官方自己都还在整合中。

必接项目如下:

1.检查并添加游戏启动埋点,否则可能无法通过审核。

上报小游戏启动成功埋点。 需要在游戏首页成功渲染时调用。不是每个版本都需要调用这个接口

laya 从 v2.6 - v2.13 版本,可以通过 layaIDE 支持直接导出 bilibili 小游戏,无需其他修改。

其他的引擎不同版本还是根据官方API修改。

2.小游戏配置 game.json 分包也在这里,后面还有那个实名认证。

{"version": "1.0.0","appId": "biligameccxxxxxxxxxxxxxxa4","deviceOrientation": "portrait","networkTimeout": {"request": 5000,"connectSocket": 5000,"uploadFile": 5000,"downloadFile": 5000},"subpackages": [{"name": "Scene","root": "res/Scene/"}]
}

3.音频必须做适配 切换前后台 音频的中断与恢复,被打回过

//背景音乐脚本
export default class GameSoundManager {//播放static playMusic(musicName) {if (window.bl) {if (!GameSoundManager.bgm) { GameSoundManager.bgm = bl.createInnerAudioContext();}// GameSoundManager.bgm.stop();GameSoundManager.bgm.src = "Sound/" + musicName + ".mp3";GameSoundManager.bgm.autoplay = true;GameSoundManager.bgm.loop = true;GameSoundManager.bgm.play();} else { Laya.SoundManager.playMusic("Sound/" + musicName + ".mp3", 0);}}//暂停static pauseMusic() { if (window.bl) {if (!GameSoundManager.bgm) { GameSoundManager.bgm = bl.createInnerAudioContext();}GameSoundManager.bgm.pause();}}
}

 音效没必要的,主要针对背景音乐。在合适的地方调用,cocos的话,放在常驻节点上。

if (window.bl) {bl.onShow(res => {GameSoundManager.playMusic("BGM");});bl.onHide(res => {GameSoundManager.pauseMusic();});
}

4.侧边栏 必接

侧边栏礼包必须每天都可领取,同游戏内签到礼包。

 先看看官方的API,侧边栏、桌面快捷方式等都会用到场景值。

小游戏开发者可以在 bl.getLaunchOptionsSync 和 bl.onShow 中获取上述场景值

场景值

类型

含义

10001

string

我的(首页Tab)-小游戏中心

10002

string

手机设备桌面快捷入口

10003

string

各分享渠道

021036

string

从侧边栏进入小游戏

侧边栏的步骤:

步骤

解释

步骤一:

启动监听,判断是否展示奖励入口

1. 游戏启动时通过bl.onShow监听启动信息;​

【请确保在游戏启动时机(game.js运行时机)同步监听bl.onShow,若时机太晚收不到回调,会导致用户按操作从侧边栏返回游戏后,无法领取到奖励,造成用户客诉!

2. 通过bl.checkScene判断当前宿主是否支持跳转侧边栏:​

  • 返回字段isExist=true时,展示奖励入口,进入步骤二​
  • 返回字段isExist=false时,不展示奖励入口​

步骤二:

奖励展示

1. 用户点击奖励入口时,通过获取bl.onShow最新启动状态,判断当前用户是否从侧边栏启动:​

  • 侧边栏启动:奖励按钮显示「领取奖励」​
  • 非侧边栏启动:奖励按钮显示未完成,进入第2步​

【判断是否从侧边栏启动时,应使用bl.onShow的最新返回值,否则用户从侧边栏热启动小游戏时,会由于返回值未更新而无法领取到奖励,造成用户客诉!

2. 自动跳转侧边栏:可增加一个跳转按钮,按钮点击回调事件设置为:关闭当前奖励界面并调用bl.navigateToScene(能力已全量开放,无需配置白名单)。用户点击按钮时会自动跳转到侧边栏。​

平台强烈建议接入「自动跳转侧边栏」能力,可大幅度降低用户跳出小游戏后的流失率。】​

步骤三:

测试,上线

开发者需在测试环境下完整跑通从侧边栏启动后领取奖励的链路,测试通过确认无误后发布上线。

第一步:监听是否可以显示桌面侧边栏按钮,这个与抖音api差不多
bl.onShow(res => {//兼容 与基础版本做对比 CompareVersion()这个方法就不写了,以前文章应该有的if (SdkUtil.CompareVersion(bl.getSystemInfoSync().SDKVersion, '3.99.5') >= 0) {console.log("检测版本号");bl.checkScene({scene: "sidebar",success: (res) => {if (res.isExist) {//显示入口有奖按钮this.goldButton.visible = true;} else {//隐藏入口有奖按钮this.goldButton.visible = false;}},fail: (res) => {//隐藏入口有奖按钮this.goldButton.visible = false;}});} else {//隐藏入口有奖按钮this.goldButton.visible = false;}
});
第二步:监听场景值是否从侧边栏进入。getUserData这个是我的读取本地存储的方法。
bl.onShow(res => {const scene = res.scene;if (scene == '021036' || bl.getLaunchOptionsSync().scene === "021036") {// 记住,合适的地方移除这个本地存储.// Laya.LocalStorage.removeItem("sidebar");// 从侧边栏进入,显示侧边栏奖励界面的领奖按钮Laya.LocalStorage.setItem("sidebar", "sidebar");if (this.enterPanel.visible) {//侧边栏奖励领取时间,在这里初始化一下,方便在其他地方调用到this.offlineSliderTime = PlayerData.getUserData("rewardSliderDate");this.offlineSliderTime = Date.now() - this.offlineSliderTime;this.offlineSliderTime = this.offlineSliderTime / 1000;const sidebar = Laya.LocalStorage.getItem("sidebar");if (sidebar) {this.getBtn.visible = true;//领奖按钮this.enterBtn.visible = false;//侧边栏跳转按钮} else {this.getBtn.visible = false;//领奖按钮this.enterBtn.visible = true;//侧边栏跳转按钮}}}
});
//当打开侧边栏界面的时候,打开侧边栏按钮事件。
openSiderBarPanel(){this.enterPanel.visible = true;//侧边栏奖励领取时间,在这里初始化一下,方便在其他地方调用到this.offlineSliderTime = PlayerData.getUserData("rewardSliderDate");this.offlineSliderTime = Date.now() - this.offlineSliderTime;this.offlineSliderTime = this.offlineSliderTime / 1000;const sidebar = Laya.LocalStorage.getItem("sidebar");if (sidebar) {this.getBtn.visible = true;//领奖按钮this.enterBtn.visible = false;//侧边栏跳转按钮} else {this.getBtn.visible = false;//领奖按钮this.enterBtn.visible = true;//侧边栏跳转按钮}
}
第二步:跳转侧边栏,按钮事件
navigateToScene() {if (window.bl) {bl.navigateToScene({scene: "sidebar",success: (res) => { },fail: (res) => { },});}
}
第三步:领取奖励,按钮事件
getReward(){if (this.offlineSliderTime < 60 * 60 * 24) {SdkUtil.ShowToast("今日奖励已经领取");return;}//保存领取奖励时间var offlineSliderTime = this.getDayZeroTime();PlayerData.setUserData("rewardSliderDate", offlineSliderTime);//保存用户领取的奖励PlayerData.setUserData("gold", PlayerData.getUserData("gold") + 2000);PlayerData.saveData();//弹窗提示SdkUtil.ShowToast("获取金币 +200");this.enterPanel.visible = false;//刷新你的奖励this.refreshXXX();//刷新界面
}
//13位时间戳,用于对比领奖时间
getDayZeroTime() {var nowDay = new Date();nowDay.setHours(0);nowDay.setMinutes(0);nowDay.setSeconds(0);nowDay.setMilliseconds(0);var nowDayTime = nowDay.getTime();return nowDayTime;
}

 至于实名认证与桌面快捷方式的每日领奖,可以按着上面来写。

5.分包 哔哩哔哩工具上传的是zip的压缩包

整个小游戏所有分包大小不超过 20M

单个分包/主包大小不能超过 4M

也就是不压缩的实际包体吗,一般情况下,不用考虑远程问题。

6.实名认证 必接 只支持安卓

根据规定,所有游戏用户必须完成实名认证才能继续访问和参与游戏。

属性

类型

默认值

必填

说明

title

string

提示的标题

content

string

提示的内容

giftImgUrl

string

提示的礼包图片(支持gif)

cancelText

string

'取消'

取消按钮的文字,最多 5 个字符

confirmText

string

'确定'

确认按钮的文字,最多 5 个字符

giftImgUrl我使用的站内图片地址,后台会配置好的,官方也给了远程的API,本地的不知道能用不,没尝试。

7.激励视频埋点上报,官方没说是否必须,放置万一吧。

// 用户点击观看视频广告时上报

bl.reportScene({sceneId:1007});

rewardedVideoAd.load().then(() => {

  return rewardedVideoAd.show();

});

8.添加到桌面礼包「必接」。      侧边栏打开礼包「必接」上方写过了

按钮事件调用,主要是针对ios的,被打回过。

if (window.bl) {if (SdkUtil.CompareVersion(bl.getSystemInfoSync().SDKVersion, '3.99.4') >= 0) {//bl.checkShortcut接口只支持android平台if (bl.getSystemInfoSync().platform.toLowerCase().indexOf("android") != -1) {//检测桌面快捷方式是否存在bl.checkShortcut({success(res) {console.log("检查快捷方式"), console.log(res.status);if (res.status.exist) {//弹窗桌面礼包奖励界面UIManager.ShowUIPanel("Desk", false);} else {bl.addShortcut({success() {console.log("添加桌面成功");}, fail(err) {SdkUtil.ShowToast("从桌面ICON进入领取每日奖励");console.log("添加桌面失败", err.errMsg);},});}},fail(res) {SdkUtil.ShowToast("从桌面ICON进入领取每日奖励");console.log("检查快捷方式失败", res.errMsg);},});} else {//从手机设备桌面快捷入口启动的场景值if (bl.getLaunchOptionsSync().scene === "10002" || this.open_desk === true) {//弹出桌面礼包奖励页面UIManager.ShowUIPanel("Desk", false);} else {bl.addShortcut({success() {SdkUtil.ShowToast("从桌面ICON进入领取每日奖励");console.log("添加桌面成功");}, fail(err) {SdkUtil.ShowToast("从桌面ICON进入领取每日奖励");console.log("添加桌面失败", err.errMsg);},});}}} else {SdkUtil.ShowToast("请升级最新版本");}
}
//场景值吗,在两个地方可以拿到,最好还是判断一下
bl.onShow(res => {if (scene == '10002') {this.open_desk = true;}
});

9.埋点上报【主要防止万一】

bl.reportScene({});

sceneId

说明

7

游戏可玩,比如进入游戏大厅

10

游戏新手教程完成

1007

激励视频广告,用户点击看广告

 10.首屏渲染 index.js中,这个只正对哔哩哔哩小游戏,其它小游戏不要用【API中看到的】

var testRender = function () {var GameConfig = {};GameConfig.width = 640;GameConfig.height = 1136;GameConfig.scaleMode = "fixedwidth";GameConfig.screenMode = "none";GameConfig.alignV = "top";GameConfig.alignH = "left";Laya3D.init(GameConfig.width, GameConfig.height);Laya["Physics"] && Laya["Physics"].enable();Laya["DebugPanel"] && Laya["DebugPanel"].enable();Laya.stage.scaleMode = GameConfig.scaleMode;Laya.stage.screenMode = GameConfig.screenMode;Laya.stage.alignV = GameConfig.alignV;Laya.stage.alignH = GameConfig.alignH;var logoSprite = new Laya.Sprite();Laya.stage.addChild(logoSprite);logoSprite.y = 300;var handler = Laya.Handler.create(null, function () {logoSprite.removeSelf();});logoSprite.loadImage("First/logo.png", handler);var tTestText = new Laya.Text();tTestText.autoSize = true;tTestText.text = "正在努力加载中 ...";tTestText.bold = true;tTestText.font = "Microsoft YaHei";tTestText.color = "#FFFFFF";tTestText.fontSize = 20;tTestText.x = 300;tTestText.y = 700;Laya.stage.addChild(tTestText);//合理时间移除setTimeout(() => {tTestText.removeSelf();}, 2000);
};testRender();

11.分享功能

自定义图片路径,支持 PNG 及 JPG。建议图片分辨率 750*750
1、小游戏包内相对路径
2、blfile:// 协议路径
3、https:// 网络图片路径(暂不支持非 bilibili 图片服务器资源地址)
//SDK初始化时候调用
bundleShareActive() {if (window.bl) {bl.onShareAppMessage(() => {return {title: '啊啊啊啊',subTitle: '啊啊啊啊啊',imageUrl: 'XXXX'};});}
}
//分享按钮点击时候调用
bl.shareAppMessage({title: '啊啊啊啊',subTitle: '啊啊啊啊啊',imageUrl: 'xxxxxxxxxxxxx',biliContent: '一款超好玩得小游戏,快来和我一起玩吧!',success() {console.log('分享视频成功');if (callback != null) {callback(1);callback = null;}},fail(e) {console.log('分享视频失败' + JSON.stringify(e));if (callback != null) {callback(0);callback = null;}}
}

12.录制视频,暂时不需要接入,存在问题,也非必须。被打回过。

不用接入,视频分享存在问题,以后可能会必须接入,像抖音一样。

13.如果存在输入 需要敏感词检测

bl.sensitiveWordCheck(Object object)

14.震动

bl.vibrateShort({})

15.版权是必要的

16.隐私协议等,非必须。

其他一些api

bl.showLoading({title: '加载中',
})
setTimeout(function () {bl.hideLoading()
}, 2000)bl.showModal({title: '提示',content: '这是一个模态弹窗',success(res) {if (res.confirm) {console.log('用户点击确定')} else if (res.cancel) {console.log('用户点击取消')}}
})bl.exitMiniProgram({})
bl.getSystemInfoSync() 异步bl.getAppBaseInfo
0	哔哩哔哩	 
1	高能通	 
2	哔哩哔哩漫画	

相关文章:

bilibili 哔哩哔哩小游戏SDK接入

小游戏的文档 简介 bilibili小游戏bilibili小游戏具有便捷、轻量、免安装的特点。游戏包由云端托管&#xff0c;在哔哩哔哩APP内投放和运行&#xff0c;体验流畅&#xff0c;安全可靠。https://miniapp.bilibili.com/small-game-doc/guide/intro/ 没想过接入这个sdk比ios还难…...

springboot523基于Spring Boot的大学校园生活信息平台的设计与实现(论文+源码)_kaic

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本大学校园生活信息平台就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…...

【YOLO算法改进】ALSS-YOLO:无人机热红外图像|野生动物小目标检测

目录 论文信息 论文创新点 1.自适应轻量通道分割和洗牌&#xff08;ALSS&#xff09;模块 2.轻量坐标注意力&#xff08;LCA&#xff09;模块 3.单通道聚焦模块 4.FineSIOU损失函数 摘要 架构设计 轻量高效网络架构 - ALSS模块 LCA模块 单通道聚焦模块 损失函数优…...

XML解析

一&#xff0c;XML概述 1.什么是XML XML即为可扩展的标记语言&#xff08;eXtensible Markup Language&#xff09; XML是一套定义语义标记的规则&#xff0c;这些标记将文档分成许多部件并对这些部件加以标识 2.XML和HTML不同之处 XML主要用于说明文档的主题&#xff0c;而…...

PlasmidFinder:质粒复制子的鉴定和分型

质粒&#xff08;Plasmid&#xff09;是一种细菌染色体外的线性或环状DNA分子&#xff0c;也是一种重要的遗传元素&#xff0c;它们具有自主复制能力&#xff0c;可以在细菌之间传播&#xff0c;并携带多种重要的基因(如耐药基因与毒力基因等)功能。根据质粒传播的特性&#xf…...

PTA数据结构作业一

6-1 链表的插入算法 本题要求实现一个插入函数&#xff0c;实现在链表llist中的元素x之后插入一个元素y的操作。 函数接口定义&#xff1a; int InsertPost_link(LinkList llist, DataType x, DataType y); 其中 llist是操作的链表&#xff0c;x是待插入元素y的前驱节点元素…...

2024年总结【第五年了】

2024年总结 北国绕院扫雪&#xff0c;南方围炉烹茶&#xff0c;且饮一杯无? 执笔温暖不曾起舞日子里的点点滴滴&#xff0c;誊写一段回忆&#xff0c;还以光阴一段副本。 那么你要听一支新故事吗&#xff1f;第五年总结的片碎。 衣单天寒&#xff0c;走趟流星孤骑&#xf…...

java实现一个kmp算法

1、什么是KMP算法 Kmp 算法是由D.E.Knuth&#xff0c;J.H.Morris和V.R.Pratt提出的&#xff0c;改进字符串匹配的算法&#xff1b; Kmp 算法的核心是利用匹配失败的信息&#xff0c;尽量减少模式串与主串的匹配次数&#xff0c;以达到 快速匹配的目的&#xff1b; Kmp 算法的时…...

强化学习方法分类详解

强化学习方法分类详解 引言 强化学习&#xff08;Reinforcement Learning, RL&#xff09;是一种通过智能体与环境互动来学习如何做出最佳决策的方法。根据不同的优化中心、策略特性、环境模型、奖励函数、动作空间类型以及行为策略和目标策略的一致性&#xff0c;RL可以分为…...

雅思真题短语(二十八)

真题短语收录在合辑。 541法律官员 work as a solicitor 542前卫 a radical and expensive scheme 543反对者们 objectors 544破坏 demolishing buildings 545蒸汽机车 steam locomotives 546冷凝 steam could be condensed 547烟雾 smoke and fumes 548通风井 ventilation sh…...

在Linux系统中使用字符图案和VNC运行Qt Widgets程序

大部分服务器并没有GUI&#xff0c;运行的是基础的Linux系统&#xff0c;甚至是容器。如果我们需要在这些系统中运行带有GUI功能的Qt程序&#xff0c;一般情况下就会报错&#xff0c;比如&#xff1a; $ ./collidingmice qt.qpa.xcb: could not connect to display qt.qpa.plu…...

Python基于EasyOCR进行路灯控制箱图像文本识别项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 随着城市化进程的加快&#xff0c;智能城市建设成为了现代社会发展的重要方向。路灯作为城市基础设…...

Github 2024-12-28 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2024-12-28统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10TypeScript项目1Python项目1egui: 一个简单、快速且高度可移植的 Rust GUI 库 创建周期:1903 天开发语言:Rust协议类型:Apache Li…...

提升生产力工具

VSCODE插件 干货&#xff1a;用好这13款VSCode插件&#xff0c;工作效率提升10倍 - 程序员柠檬 - 博客园 Sourcetrail Sourcetrail 是一个开源且免费的源码阅读工具&#xff0c;以其强大的代码导航、可视化及跨平台支持特性&#xff0c;成为开发者理解复杂代码库的得力助手。…...

【蓝桥杯——物联网设计与开发】系列前言

前言 本系列博客是博主为准备2024年第十五届蓝桥杯大赛物联网设计与开发赛道而写&#xff0c;经过4个月学习备战&#xff0c;最终获得全国一等奖。 从第十六届蓝桥杯大赛开始&#xff0c;物联网赛道更换竞赛实训平台。之前的博客&#xff0c;可以借鉴代码思想&#xff0c;但引脚…...

【Java基础】02.Java数据类型

目录 Java 数据类型 3.1 java程序中 “” 号的使用 3.2 java中的数据类型 3.2.1 基本数据类型&#xff1a;数值型 &#xff08;1&#xff09;整数类型 &#xff08;2&#xff09;浮点&#xff08;小数&#xff09;类型 3.2.2 基本数据类型&#xff1a;字符型 3.2.3 基本…...

Python爬虫(一)- Requests 安装与基本使用教程

文章目录 前言一、简介及安装1. 简介2. 安装 Requests2.1 安装2.2 检查安装是否成功 二、使用 Requests 发送 HTTP 请求1. 发送 GET 请求2. 发送 POST 请求3. 发送 PUT 请求4. 发送 DELETE 请求5. 发送 HEAD 请求6. 发送 OPTIONS 请求 三、传递参数1. GET 请求传递 URL 参数1.1…...

线段树保姆级教程

买水果 Description 水果姐今天心情不错&#xff0c;来到了水果街。 水果街有n家水果店&#xff0c;呈直线结构&#xff0c;编号为1~n&#xff0c;每家店能买水果也能卖水果&#xff0c;并且同一家店卖与买的价格一样。 学过oi的水果姐迅速发现了一个赚钱的方法&#xff1a…...

logback之自定义过滤器

logback有两种过滤器&#xff0c;一种是context中的过滤器叫TurboFilter&#xff0c;是一个全局的过滤器&#xff0c;会影响所有的日志记录。另一种是Appender中的过滤器&#xff0c;只对所在的append有效。两者大同小异&#xff0c;这里我们以Appender的过滤器为例。 &#x…...

如何用CSS3创建圆角矩形并居中显示?

在网页设计中&#xff0c;圆角矩形因其美观和现代感而被广泛使用&#xff0c;居中显示元素也是一个常见的需求。今天&#xff0c;我们将学习如何使用CSS3的border-radius属性来创建圆角矩形&#xff0c;并将其居中显示在页面上。 如果你正在学习CSS&#xff0c;那么这个实例将非…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...