(十一)C++自制植物大战僵尸游戏客户端更新实现
植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/cFP3z
更新检查
游戏启动后会下载服务器中的版本号然后与本地版本号进行对比,如果本地版本号小于服务器版本号就会弹出更新提示。让用户选择是否更新客户端。
在弹出的更新对话框中有显示最新版本更新的内容,以及更新按钮等。用户可以选择更新方式或者进行更新。
文件位置
代码文件实现位置在Class\Scenes\MainMenuScene文件夹中。
UpdateClient.h
客户端更新类继承与对话框类(Dialog),因为客户端更新也是一个对话对话框供玩家操作。UpdateClient头文件定义如下。
class UpdateClient :public Dialog
{
public:CREATE_FUNC(UpdateClient);CC_CONSTRUCTOR_ACCESS:UpdateClient();virtual bool init();private:enum class Update_Button{百度网盘下载,腾讯微云下载,直接下载,退出游戏,确定};void createDiglog(); /* 创建对话框 */void createButton(const std::string& name, Vec2& vec2, Update_Button button); /* 创建按钮 */void showText();void addScrollView();void addMouseEvent();void downloadHistoryText();void downloadData();void downloadProgress();void downloadSuccess();void downloadError();private:Sprite* _dialog; /* 对话框 */std::unique_ptr<network::Downloader> _downloader;Label* _remindText;Label* _progressText;Label* _explanText;Label* _historyText;Sprite* _loadBarBackground;ui::LoadingBar* _loadingBar;ui::ScrollView* _textScrollView;bool _isNewDowndload;
};
UpdateClient.cpp
构造函数
在构造函数中对变量进行初始化操作。
UpdateClient::UpdateClient() :_dialog(nullptr), _remindText(nullptr), _progressText(nullptr), _explanText(nullptr), _loadBarBackground(nullptr), _loadingBar(nullptr), _historyText(nullptr), _isNewDowndload(true)
{_downloader.reset(new network::Downloader());
}
init函数
创建游戏更新对话框,首先会调用init函数。在init函数中首先会在场景中创建一个黑色半透明的遮罩层,使用场景变黑,让玩家聚焦到此对话框中。然后调用createShieldLayer(this)函数屏蔽除本层之外的所以事件监听,该函数的实现在自定义对话框教程(教程九)中有介绍,作用是让玩家只能和该对话框进行交互。最后使用createDialog()函数创建更新菜单。
bool UpdateClient::init()
{if (!LayerColor::initWithColor(Color4B(0, 0, 0, 180)))return false;createShieldLayer(this);createDialog();return true;
}
createDialog()函数
在该函数中主要实现整个更新菜单的界面。
void UpdateClient::createDialog()
{_dialog = Sprite::createWithSpriteFrameName("LevelObjiectivesBg.png");_dialog->setPosition(_director->getWinSize() / 2);_dialog->setScale(0.9f);this->addChild(_dialog);/* 创建触摸监听 */createTouchtListener(_dialog);auto PauseAnimation = SkeletonAnimation::createWithData(_global->userInformation->getAnimationData().find("PauseAnimation")->second);PauseAnimation->setAnimation(0, "animation", true);PauseAnimation->setPosition(Vec2(530, 650));_dialog->addChild(PauseAnimation);showText();createButton(_global->userInformation->getGameText().find("百度网盘下载")->second, Vec2(165, 100), Update_Button::百度网盘下载);createButton(_global->userInformation->getGameText().find("腾讯微云下载")->second, Vec2(405, 100), Update_Button::腾讯微云下载);createButton(_global->userInformation->getGameText().find("直接下载")->second, Vec2(645, 100), Update_Button::直接下载);createButton(_global->userInformation->getGameText().find("关闭游戏")->second, Vec2(885, 100), Update_Button::退出游戏);createButton(_global->userInformation->getGameText().find("确定")->second, Vec2(520, 100), Update_Button::确定);}
创建更新菜单背景,设置位置到屏幕中心,缩放0.9倍大小。
_dialog = Sprite::createWithSpriteFrameName("LevelObjiectivesBg.png");
_dialog->setPosition(_director->getWinSize() / 2);
_dialog->setScale(0.9f);
this->addChild(_dialog);
对创建好的背景进行触摸监听,可以实现更新菜单的拖动。
/* 创建触摸监听 */
createTouchtListener(_dialog);
显示文字内容以及创建多个按钮。
showText();createButton(_global->userInformation->getGameText().find("百度网盘下载")->second, Vec2(165, 100), Update_Button::百度网盘下载);
createButton(_global->userInformation->getGameText().find("腾讯微云下载")->second, Vec2(405, 100), Update_Button::腾讯微云下载);
createButton(_global->userInformation->getGameText().find("直接下载")->second, Vec2(645, 100), Update_Button::直接下载);
createButton(_global->userInformation->getGameText().find("关闭游戏")->second, Vec2(885, 100), Update_Button::退出游戏);
createButton(_global->userInformation->getGameText().find("确定")->second, Vec2(520, 100), Update_Button::确定);
downloadData()函数
客户端内文件下载更新函数。创建文件下载进度条以及文字信息。
void UpdateClient::downloadData()
{if (!_loadBarBackground){_loadBarBackground = Sprite::createWithSpriteFrameName("bgFile.png");_loadBarBackground->setPosition(Vec2(_dialog->getContentSize().width / 2.f, _dialog->getContentSize().height / 2.f - 100));_loadBarBackground->setScale(1.5f);_dialog->addChild(_loadBarBackground);}if (!_loadingBar){_loadingBar = ui::LoadingBar::create();_loadingBar->loadTexture("progressFile.png", TextureResType::PLIST);_loadingBar->setDirection(LoadingBar::Direction::LEFT); /* 设置加载方向 */_loadingBar->setPercent(0);_loadingBar->setScale(1.5f);_loadingBar->setPosition(Vec2(_dialog->getContentSize().width / 2.f, _dialog->getContentSize().height / 2.f - 100));_dialog->addChild(_loadingBar);}_explanText->setColor(Color3B::BLACK);_explanText->setString("");const static string sNameList = _global->userInformation->getGameText().find("资源名称")->second + UserInformation::getNewEditionName(true) + ".rar";const static string path = _global->userInformation->getGameText().find("存放路径")->second + sNameList;_downloader->createDownloadFileTask(_global->userInformation->getGameText().find("资源网址")->second, path, sNameList);downloadProgress();downloadSuccess();downloadError();
}
创建下载任务,传入服务器文件地址 、文件路径、文件名称。
_downloader->createDownloadFileTask(_global->userInformation->getGameText().find("资源网址")->second, path, sNameList);
调用下载进度、下载成功、下载失败函数 。下载过程会调用downloadProgress()函数,下载成功调用downloadSuccess()函数,下载失败调用downloadError()函数。
downloadProgress();
downloadSuccess();
downloadError();
downloadProgress()函数
在onTaskProgress lamda函数中,会实时计算下载进度,bytesReceived参数是当前下载的文大小,totalBytesExpected是文件总大小,totalBytesReceived是总下载大小。通过这三个参数可以计算下载完成所需事件。
void UpdateClient::downloadProgress()
{_downloader->onTaskProgress = [=](const network::DownloadTask& task,int64_t bytesReceived,int64_t totalBytesReceived,int64_t totalBytesExpected){_explanText->setString(_global->userInformation->getGameText().find("解释说明_慢")->second);float percent = float(totalBytesReceived * 100) / totalBytesExpected;_loadingBar->setPercent(percent);int hour = (totalBytesExpected - totalBytesReceived) / (bytesReceived * 10) / 3600;int min = ((totalBytesExpected - totalBytesReceived) / (bytesReceived * 10) - hour * 3600) / 60;int second = (totalBytesExpected - totalBytesReceived) / (bytesReceived * 10) - hour * 3600 - min * 60;char buf[128];if (bytesReceived / 1024.f * 10 >= 1000){std::snprintf(buf, 128, "%.1fMB/s %dKB/%dKB %.2f%% time:%02d:%02d:%02d",bytesReceived / 1024.f / 1024.f * 10, int(totalBytesReceived / 1024), int(totalBytesExpected / 1024), percent, hour, min, second);_progressText->setString(buf);}else{std::snprintf(buf, 128, "%.1fKB/s %dKB/%dKB %.2f%% time:%02d:%02d:%02d",bytesReceived / 1024.f * 10, int(totalBytesReceived / 1024), int(totalBytesExpected / 1024), percent, hour, min, second);_progressText->setString(buf);}_remindText->setString(_global->userInformation->getGameText().find("文件正在下载中!请稍等!")->second);};
}
downloadSuccess()函数
成功下载文件后会调用onFileTaskSuccess lamda函数。在函数中显示下载成功文字信息,将按钮隐藏,然后提示用户退出重新启动游戏。
void UpdateClient::downloadSuccess()
{_downloader->onFileTaskSuccess = [this](const cocos2d::network::DownloadTask& task){_progressText->setString(_global->userInformation->getGameText().find("下载成功")->second +_global->userInformation->getGameText().find("存放路径")->second + task.identifier + " ]");_remindText->setString(_global->userInformation->getGameText().find("点击确定退出游戏!")->second);_explanText->setString(_global->userInformation->getGameText().find("下载成功说明")->second);((Button*)_dialog->getChildByName("0"))->setVisible(false);((Button*)_dialog->getChildByName("1"))->setVisible(false);((Button*)_dialog->getChildByName("2"))->setVisible(false);((Button*)_dialog->getChildByName("3"))->setVisible(false);((Button*)_dialog->getChildByName("4"))->setVisible(true);};
}
downloadError()函数
如果下载失败,会调用onTaskError lamda函数,在函数中先错误信息提示用户。errorCode的是错误代码,errorStr是错误信息,errorCodeInternal是内部错误代码。
void UpdateClient::downloadError()
{_downloader->onTaskError = [this](const cocos2d::network::DownloadTask& task,int errorCode,int errorCodeInternal,const std::string& errorStr){_remindText->setString(_global->userInformation->getGameText().find("下载失败")->second);((Button*)_dialog->getChildByName("2"))->setEnabled(true);((Button*)_dialog->getChildByName("3"))->setEnabled(true);char str[256];snprintf(str, 256, "Failed to download : 资源文件, identifier(%s) error code(%d), internal error code(%d) desc(%s) 请检查网络连接是否正常!如果网络连接正常请多试几次!或更换其他方式下载!", task.identifier.c_str(), errorCode, errorCodeInternal, errorStr.c_str());_explanText->setString(str);_explanText->setColor(Color3B::RED);
#ifdef DEBUGlog("Failed to download : %s, identifier(%s) error code(%d), internal error code(%d) desc(%s)", task.requestURL.c_str(), task.identifier.c_str(), errorCode, errorCodeInternal, errorStr.c_str());
#endif // DEBUG};
}
其他函数
showText()、createButton()、addScrollView()、addMouseEvent()等函数不再一一列举,可自行查看。
void UpdateClient::showText()
{addScrollView();_historyText = Label::createWithTTF(_global->userInformation->getGameText().find("更新信息加载中!")->second, GAME_FONT_NAME_1, 50);_historyText->setAnchorPoint(Vec2::ANCHOR_MIDDLE_TOP);_historyText->setColor(Color3B::BLACK);_historyText->setMaxLineWidth(650); _textScrollView->addChild(_historyText);_textScrollView->setInnerContainerSize(_historyText->getContentSize());_historyText->setPosition(Vec2(_dialog->getContentSize().width / 2.f - 150, _textScrollView->getInnerContainerSize().height - 150));downloadHistoryText();/* 标题 */_remindText = Label::createWithTTF(_global->userInformation->getGameText().find("检测到有新版本,请选择更新方式!")->second, GAME_FONT_NAME_1, 50);_remindText->setPosition(Vec2(_dialog->getContentSize().width / 2.f, _dialog->getContentSize().height / 2.f + 200));_remindText->setColor(Color3B::BLACK);_remindText->setMaxLineWidth(900);_remindText->setName("Update");_dialog->addChild(_remindText);/* 进度文字 */_progressText = Label::createWithTTF("", GAME_FONT_NAME_1, 25);_progressText->setMaxLineWidth(900);_progressText->setPosition(Vec2(_dialog->getContentSize().width / 2.f, _dialog->getContentSize().height / 2.f));_dialog->addChild(_progressText);/* 说明文字 */_explanText = Label::createWithTTF("", GAME_FONT_NAME_1, 30);_explanText->setPosition(Vec2(_dialog->getContentSize().width / 2.f, _dialog->getContentSize().height / 2.f + 100));_explanText->setColor(Color3B::BLACK);_explanText->setMaxLineWidth(900);_dialog->addChild(_explanText);
}void UpdateClient::addScrollView()
{_textScrollView = ui::ScrollView::create();_textScrollView->setDirection(ui::ScrollView::Direction::VERTICAL);_textScrollView->setAnchorPoint(Vec2::ANCHOR_MIDDLE);_textScrollView->setContentSize(Size(720.0f, 320.0f));_textScrollView->setPosition(_dialog->getContentSize() / 2.0f);_textScrollView->setBounceEnabled(true);_textScrollView->setScrollBarPositionFromCorner(Vec2(20, 0));_textScrollView->setScrollBarWidth(10);_textScrollView->setScrollBarColor(Color3B::BLACK);_dialog->addChild(_textScrollView);addMouseEvent();
}void UpdateClient::addMouseEvent()
{/* 鼠标滑动监听 */auto mouse = EventListenerMouse::create();mouse->onMouseScroll = [=](Event* event){auto mouseEvent = static_cast<EventMouse*>(event);float movex = mouseEvent->getScrollY() * 5;auto minOffset = 0.f;auto maxOffset = 100.f;auto offset = _textScrollView->getScrolledPercentVertical();offset += movex;if (offset < minOffset){offset = minOffset;}else if (offset > maxOffset){offset = maxOffset;}_textScrollView->scrollToPercentVertical(offset, 0.5f, true);};Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(mouse, _textScrollView);
}void UpdateClient::downloadHistoryText()
{const string sURLList = _global->userInformation->getGameText().find("更新信息网址")->second;_downloader->createDownloadDataTask(sURLList);_downloader->onDataTaskSuccess = [this](const cocos2d::network::DownloadTask& task,std::vector<unsigned char>& data){string historyNetWork;for (auto p : data){historyNetWork += p;}TTFConfig ttfConfig(GAME_FONT_NAME_1, 25, GlyphCollection::DYNAMIC);_historyText->setTTFConfig(ttfConfig);_historyText->setString(historyNetWork);_textScrollView->setInnerContainerSize(_historyText->getContentSize());_historyText->setPosition(Vec2(350, _textScrollView->getInnerContainerSize().height));};_downloader->onTaskError = [this](const cocos2d::network::DownloadTask& task,int errorCode,int errorCodeInternal,const std::string& errorStr){_historyText->setString(_global->userInformation->getGameText().find("更新信息加载失败!")->second);_textScrollView->setInnerContainerSize(_historyText->getContentSize());};
}
相关文章:

(十一)C++自制植物大战僵尸游戏客户端更新实现
植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/cFP3z 更新检查 游戏启动后会下载服务器中的版本号然后与本地版本号进行对比,如果本地版本号小于服务器版本号就会弹出更新提示。让用户选择是否更新客户端。 在弹出的更新对话框中有显示最新版本更新的内容…...

关于Qt主窗口的菜单部件
前言 在介绍主窗口的两大部件之前,我们要先知道关于主窗口的一些知识。 主窗口 一个主窗口可以没有菜单条、工具条、状态条,但必须设置中心部件。在 Q 生成的 C头文件 ui_mainwindow.h 代码中,我们可以看到以下代码: centralWidget new Qwidget(MainWi…...

rabbitmq每小时自动重启
引言 找了半天,最后通过系统日志发现是因为执行 systemctl restart rabbitmq-server 命令无法返回回调 systemctl 导致超时,自动关机。怀疑是 rabbitmq 与 systemctl 冲突,后 mq 升级版本已修复,可参考:https://github…...

【多线程】单例模式 | 饿汉模式 | 懒汉模式 | 指令重排序问题
文章目录 单例模式一、单例模式1.饿汉模式2.懒汉模式(单线程)3.懒汉模式(多线程)改进 4.指令重排序1.概念2.question:3.解决方法4总结: 单例模式 一、单例模式 单例,就是单个实例 在有些场景中,…...

00_Qt概述以及如何创建一个QT新项目
Qt概述 1.Qt概述1.1 什么是Qt1.2 Qt的发展史1.3 支持的平台1.4 Qt版本1.5 Qt的下载与安装1.6 Qt的优点 2.QT新项目创建3.pro文件4.主函数5.代码命名规范和快捷键 1.Qt概述 1.1 什么是Qt Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面…...

git报错
这里写自定义目录标题 git报错Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 有一个原因就是在github上设置对应密钥时,有一个key获取应该设置为…...
【R: mlr3:超参数调优】
本次分享官网教程地址 https://mlr3book.mlr-org.com/chapters/chapter4/hyperparameter_optimization.html 型调优 当你对你的模型表现不满意时,你可能希望调高你的模型表现,可通过超参数调整或者尝试一个更加适合你的模型,本篇将介绍这些操…...

使用Pandas实现股票交易数据可视化
一、折线图:展现股价走势 1.1、简单版-股价走势图 # 简洁版import pandas as pdimport matplotlib.pyplot as plt# 读取CSV文件df pd.read_csv(../数据集/格力电器.csv)data df[[high, close]].plot()plt.show() 首先通过df[[high,close]]从df中获取最高价和收盘…...
蓝桥杯刷题-乌龟棋
312. 乌龟棋 - AcWing题库 /* 状态表示:f[b1,b2,b3,b4]表示所有第 i种卡片使用了 bi张的走法的最大分值。状态计算:将 f[b1,b2,b3,b4]表示的所有走法按最后一步选择哪张卡片分成四类:第 i类为最后一步选择第 i种卡片。比如 i2,则…...

美国纽扣电池认证标准要求16 CFR 第 1700和ANSI C18.3M标准
法规背景 为了纪念瑞茜哈姆史密斯(Reese Hamsmith)美国德州一名于2020年12月因误食遥控器里的纽扣电池而不幸死亡的18个月大的女婴。 美国国会于2022年8月16日颁布了H.R.5313法案(第117-171号公众法)也称为瑞茜法案(Reese’s Law)…...

华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理工具
文章目录 华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理工具1. 介绍2. 下载3. 静音模式、平衡模式、增强模式配置4. 配置电源方案与模式切换绑定5. 启动Ghelper控制面板6. 目前支持的设备型号 华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理…...

【ROS2笔记六】ROS2中自定义接口
6.ROS2中自定义接口 文章目录 6.ROS2中自定义接口6.1接口常用的CLI6.2标准的接口形式6.3接口的数据类型6.4自定义接口Reference 在ROS2中接口interface是一种定义消息、服务或动作的规范,用于描述数据结构、字段和数据类型。ROS2中的接口可以分为以下的几种消息类型…...

设计模式-代理模式(Proxy)
1. 概念 代理模式(Proxy Pattern)是程序设计中的一种结构型设计模式。它为一个对象提供一个代理对象,并由代理对象控制对该对象的访问。 2. 原理结构图 抽象角色(Subject):这是一个接口或抽象类࿰…...

中伟视界:智慧矿山智能化预警平台功能详解
矿山智能预警平台是一种高度集成化的安全监控系统,它能够提供实时的监控和报警功能,帮助企业和机构有效预防和响应潜在的安全威胁。以下是矿山智能预警平台的一些关键特性介绍: 报警短视频生成: 平台能够在检测到报警时自动生成短…...

如何在PPT中获得网页般的互动效果
如何在PPT中获得网页般的互动效果 效果可以看视频 PPT中插入网页有互动效果 当然了,获得网页般的互动效果,最简单的方法就是在 PPT 中插入网页呀。 那么如何插入呢? 接下来为你讲解如何获得(此方法在 PowerPoint中行得通&#…...

HTML段落标签、换行标签、文本格式化标签与水平线标签
目录 HTML段落标签 HTML换行标签 HTML格式化标签 加粗标签 倾斜标签 删除线标签 下划线标签 HTML水平线标签 HTML段落标签 在网页中,要把文字有条理地显示出来,就需要将这些文字分段显示。在 HTML 标签中,<p>标签用于定义段落…...
NVIC简介
NVIC(Nested Vectored Interrupt Controller)是ARM处理器中用于中断管理的一个重要硬件模块。它负责处理来自多个中断源的中断请求,并根据中断的优先级来安排处理器执行相应的中断服务例程(ISR)。NVIC是ARM Cortex-M系…...

LeetCode-924. 尽量减少恶意软件的传播【深度优先搜索 广度优先搜索 并查集 图 哈希表】
LeetCode-924. 尽量减少恶意软件的传播【深度优先搜索 广度优先搜索 并查集 图 哈希表】 题目描述:解题思路一:解题思路二:0解题思路三:0 题目描述: 给出了一个由 n 个节点组成的网络,用 n n 个邻接矩阵图…...

【linux】yum 和 vim
yum 和 vim 1. Linux 软件包管理器 yum1.1 什么是软件包1.2 查看软件包1.3 如何安装软件1.4 如何卸载软件1.5 关于 rzsz 2. Linux编辑器-vim使用2.1 vim的基本概念2.2 vim的基本操作2.3 vim命令模式命令集2.4 vim底行模式命令集2.5 vim操作总结补充:vim下批量化注释…...
excel试题转word格式
序号试题选项答案 格式如上。输出后在做些适当调整就可以。 import pandas as pd from docx import Document from docx.shared import Inches# 读取Excel文件 df pd.read_excel(r"你的excel.xlsx")# 创建一个新的Word文档 doc Document()# 添加标题 doc.add_headi…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...

WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...