这个曾经在端游时代主导搭建 RTS 游戏《霸三国》框架的技术团队,在转型做 MOBA 手游《王者荣耀》后为游戏提供了巨大的支持,但这个过程也并非一帆风顺。
在今年刚结束的腾讯 TGDC 上,《王者荣耀》技术总监孙勋在技术专场中,对这款游戏进行了一次技术复盘,从技术层面上为听众嘉宾讲解了游戏在引擎、整体网络架构与网络同步方案上的尝试与转变。
孙勋称,目前游戏的服务器架构主要由“游戏大厅”和“PvP”2 个部分组成,而在不断探索中,后来又在架构中加入了 Proxy 中转服务器,也正是这个服务器的加入为《王者荣耀》解决了后来“安卓、iOS”同服等一系列出现的问题。
此外,他还介绍了《王者荣耀》在网络协议以及同步方案上的一些尝试,并一一复盘了这些尝试的优劣势。
为大家解答了为什么,最终游戏会放弃 TCP 协议(传输控制协议)与曾经在《霸三国》中所使用的 Client-Server 结构(C/S结构),并且转而使用了 UDP 协议(用户数据报协议)与帧同步方案。
本文是腾讯王者荣耀项目技术总监孙勋带来的《王者荣耀技术架构》主题演讲内容整理。将分几部分为大家介绍王者后台开发过程中的一些内容和思考:包括《王者荣耀》整个背景介绍、后端架构、上线后的调整,以及网络同步方案和反zuobi方案等。
现在《王者荣耀》后端机器大概有 4600 多台,我们的容量也有一定的扩展,进程数目是 4 万多个。
《王者荣耀》游戏背景
2012 年,我们当时做的端游《霸三国OL》,就是王者的前身。这款产品最开始是偏向 RTS 的游戏,后来我们把它改成了端游 MOBA,再后来做成了手游 MOBA,即现在的《王者荣耀》。
从 2012 年开始做 RTS 游戏到 2013 年,从多控制单位的 RTS 游戏,变成 MOBA 游戏,到 2014 年启动手游 MOBA 的预研,再到 2015 年 2 月份我们把大量人力(大概 100 多号人)投入做《英雄战迹》(《王者荣耀》前身)开发,时间并不长。
《霸三国》的玩法是玩家可以在战前通过排兵布阵构成自己局内的策略,通过控制多个单位,技能释放、兵种特性的释放形成对抗。
我们最开始做《霸三国》的时候客户端引擎是 unreal,但在做《王者荣耀》的时候改用了unity 引擎,3 到 4 个月的研发时间内,产品本身从代码层面没有任何东西是从《霸三国》那里搬过来用的,全部代码都需要重写。
《霸三国OL》的一些启示
做端游《霸三国OL》的这段经历,给我们做王者带来很多相应的启示,比如策划、程序及整个团队对 MOBA 的理解。
另外当时在做端游《霸三国》的时候,我们采用了 Client-Server 的模式,但其实在过程中有借鉴类似帧同步的概念:例如在断线重回对视野的处理这块。
传统的做法是,重回时会发当前的镜像和后续的其他下行通知信息。
这种做法会有一个问题,如果新增其他的场景内模块的时候,根据场景内包含的当前的各种物件、所在状态的各种各样信息,都需要把这些东西打包发下去,在后续开发、维护的时候会显得很麻烦。
我们的做法是,把服务器下发的所有序列包做缓存,并按顺序重发,让客户端做出快进的表现,它的概念和帧同步比较类似。
还有一点,就是预留设计弹性,在最开始的 RTS 中,每个玩家最多可以操作 5-8 个单位进行对抗,到后来改成 MOBA 游戏,只能操作一个英雄,并且加入各种各样的场景,我们本身的技术框架并不需要做出颠覆性的改动。
《王者荣耀》整体架构
目前《王者荣耀》后台的整体架构设计是源自产品的需求。如果大家玩过《王者荣耀》就会知道,PvP 对抗是不分区服的。
微信 1 区的玩家可以和微信 2 区玩家一起对抗,甚至 iOS 平台也可以和 Android 平台的人一起玩,但同时一些共有地方也保留了分区概念,比如战队、排行榜是基于“区”概念的。“区”在游戏里面就是编号,可以理解为打在玩家新建角色上的 Logo。
我们最开始做架构实现的时候,服务器当时做得比较简单,从原型开始只是保留了大厅和 PvP 服务器这两块,两者是分开的。
PvP 服务器使用类似 CGI 调用,可以分配资源的使用,用完之后再回收,不负责其他的东西。需要的东西从大厅拿,用了之后回给大厅,让大厅回写 DB。
我们在大厅和 PvP 之间做直联,后来把直联改成了中间转发,在《王者荣耀》里面我们叫 Proxy,相当于代理服务器,以屏蔽本身后端很多进程分布的细节。因为游戏本身的机器、进程很多,还有不同的路由规则。
某些排行榜或者战队是根据逻辑区的编号来确定哪台机器,或者多台机器进行处理的。有些消息采用随机转发或者多发广播的方式,这些都是由 Proxy 负责路由。之后又加入了房间服务器,它负责的是《王者荣耀》内匹配、排位等相关功能。
怎么样把实力比较接近的人糅合到一块儿玩,是由房间匹配服务器来做相应的负责的,因此会有战队和其他服务器战队匹配到一起。
最后我们在上面加入了一个 Adapter,作用是用本身已经部署的大区资源实现跨服匹配的功能。
游戏的后端架构,除了战队这样的服务器之外,所有其他的模块都可以在线扩容,或者在发现有引起在线下降的故障时,从整个架构里自动屏蔽掉。
因为路由方式会限定比如一区、二区、三区到这台机器处理,如果故障,影响的只是某几个逻辑区玩家请求的处理,降低故障影响范围。
《王者荣耀》目前的机器数量,可能每周都会发现有机器坏掉,至少有一台机器宕掉,在架构里面保证模块自动屏蔽,和在线扩容,是非常重要的事情。
整体结构比较像 MMO 的三层结构,MMO 在腾讯有比较典型的三层级别结构。大厅服务器会根据玩家所在区,登录具体区的大厅服务器。
单个大厅进程可以承载 2 万人,单个 PvP 可以承载 1.2 万,小区登录微信一区还是二区就是角色 Logo,打在玩家身上。
《王者荣耀》现在外网有四个大区,比如 Android 手 Q、Android 微信、iOS 手 Q、iOS 微信,此外还有抢先服。
我们会用程序开关的方式,在大版本发布之前,优先更新抢先服,这时候它不能和正式服玩家匹配在一起,因为他们的版本不一致。当全服发布之后,它的版本更新一致之后,我们会打开开关,抢先服的玩家可以和正式服的玩家一起进行 PvP 的匹配。
除此之外,我们还有专门的体验服,是给策划验证相关设计的,体验服保留可能删档的操作,但在正式环境这是绝对不允许的。
另外,以前的传统手游偏单机,就会做很多协议兼容,客户端版本没有更新可以玩。但是《王者荣耀》里的主要玩法是 PvP,同时结合实现方式,不同版本的玩家不能匹配一起,所以我们没有做多版本协议兼容。
上线后的调整
上线后,《王者荣耀》本身的后台架构,整体上没有做太大的改动,因为我们做端游的时候,对这套结构比较清楚,我们知道哪个地方可能有什么样的问题,所以整个结构一直比较稳定。
但是我们做了相应的微调,做得最多的是网络本身的优化。《王者荣耀》上线的时候,市面上要求网络及时性强的即时 PvP 游戏是比较少的。
我们做了各种各样的尝试,比如在网络做 CPU 方面的性能优化、延迟、丢包等等,网络本身花的时间是最多的。
架构上的微调,像刚才提到的中转模块,我们架构中大厅机器很多,PvP 机器很多,架构中不需要每个进程知道详细信息,比如大厅服务器不需要知道后面有多少房间服务器,只需要知道后面有房间服务器,可以访问就 OK。
怎么划分、平衡负载、怎么屏蔽后端故障节点,都是由 Proxy 路由功能在负责。因为大厅、PvP 机器太多,我们通过 Proxy 将整个架构划分成彼此之间没有交集的“树枝”概念,每组 Proxy 只负责一部分的大厅和PvP服务器。
这两种服务器在《王者荣耀》服务器里面最多,但是后端通联之外,Proxy 之间再建立连接,减少单个 Proxy 通道数的同时,保持整个结构的通联。
Proxy Adapter 是上线后加入的,最开始上线只有四个大区,手 Q、微信、Android、iOS 四个环境,最早 Android 的玩家也不能和 iOS 开黑。
开始 Android 和 iOS 分开也有一定原因,我们之前设想 Android 会先更新,iOS 后更新,以保持版本更新的稳定性。但后来我们希望 Android 和 iOS 的玩家可以因为关系链一起开黑。
所以当 Android、iOS 版本更新频率一致时,我们希望不需要部署太多额外的机器资源和开发,直接利用 Android 和 iOS 已有的 PvP 服务器和大区资源,打通 Android 和 iOS 的 PvP。
当 Android 玩家登录 Android 大区会连接到 Android 大厅,iOS 登录之后连接 iOS 大区的大厅,当他们需要开黑的时候,我们通过 Adapter 把中转模块所有的大区桥接起来,通过一定的算法投递到某个大区。投递的选择和大区资源占比有直接关系。
网络同步方案
之前做《霸三国》的时候采用 Client-Server 的模式,服务器判定客户端表现,那为什么我们在做《王者荣耀》的时候选用帧同步的方式呢?
Client-Server 模式的好处在于:
首先,安全。因为都是服务器计算,客户端只是负责表现层面的功能,不会影响各种判定的结果。
另外,Client-Server 模式因为是基于结果的表现,所以中间可以出现丢包,丢包是可以被接受和处理的,只要最终结果补发一致即可。
帧同步在端游用得比较多,大家比较熟悉的 DotA,还有《星际争霸》,都是用的帧同步技术。
帧同步本身对网络要求更加严苛,下发的执行序列是不允许丢包的,需要严格保证顺序性,包是 12345,就必须是 12345,如果丢包,必须要等到丢的包到达之后才能顺序后续执行。
MOBA 本身的单位比较多,同屏时客户端最多有将近 100 个单位,假如一个 AOE 技能打到 20 个单位,然后种了一个 debuff,Client-Server 状态模式需要发这些信息下去,可能潜在的同步状态信息是比较多的。
另外一个 Client-Server 模式本身开发的方式,客户端表现与服务器的判定,要完美的匹配是比较困难的。
我们之前做端游 MOBA 的时候,一个英雄技能我们开发要两三周的时间。《王者荣耀》当时开发周期是三、四个月,这样的时间压力下,我们用 Client-Server 的方式搞不定,时间不够。
当时团队心里会比较紧张,因为那时候市面上并没有看到用这种方式做强 PvP、高及时性手游的。
帧同步网络抗抖动能力比较弱,因为不能丢包。帧同步的基本原理,大家有兴趣可以下来自己了解一下。
一般会有区分,是网络还是主机模式。该技术的要点在于局内的运算都是基于客户端运算,10 个人中,每个人都会各自算一份,有相同的起始、相同的输入、完全相同的中间运算逻辑,不存在随机过程,这时候运算的结果,理论上应该是一致的。
甚至包括浮点数运算都不应该存在,它有精度的问题。包括很多碰撞,动画,还有基本的数学运算库都是后台自己实现的,要去浮点整形化,避免客户端的本地逻辑,这是最容易犯的错误,这是出现不同步最常见的原因。
如果某个经验不是很足的客户端程序,写程序时候用本地的代码做相应的逻辑,可能跑得越来越远,10 个人都是平行的世界。
整体的网络结构,大体看来分三层:服务器、客户端逻辑层,客户端表现层。
服务器主要负责的功能有两部分:
-
收集所有玩家上行的输入,把它按定时的间隔打包成输入的序列,投放给所有客户端。
-
当客户端出现丢包的时候,服务器进行补发;还有把客户端上行冗余的信息替换掉,比如有新的输入到了,就把老的输入 Drop 或者替换掉。
在《王者荣耀》里,我们的逻辑是 66 毫秒一次,1 秒同步 15 个包,这是不能少的,因为帧同步不能丢包,数据包必须有严格的执行序列。
客户端逻辑层理解为客户端本地的服务,就是所有客户端运行的结果必须强一致,不能有真的随机、不能有本地逻辑、不能有浮点数运算。拿到相同的输入,产生结果必须一致。
客户端表现层会根据逻辑层的数据去做 Copy 或者镜像,然后在表现层进行平滑,帧数不一样,但是不会影响最终的运算结果,只影响动画和动作的表现。
PvP 最开始上线时,我们用的是 TCP 技术。TCP 在局域网的情况下表现还是不错的,没有什么问题,但是当外网出现丢包或者抖动的时候,受限于实现方式。
比如窗口、慢启动各方面的原因,会发现当出现重连的时候游戏非常卡,所以后来我们没有用 TCP,改为了采用 UDP。如果出现丢包,服务器会在应用层做补发。
UDP 受限于 MTU(最大传输单元)的大小,大于 MTU,会出现分包,可能也会出现整包的丢失。
所以我们也会有些比较大的包会在 App 层由服务器做分包,中间出现丢包再由服务器补发,把零碎的包拼成整包再做解包。
比较有价值的是 UDP 包,如果手机因为信号抖动等出现丢包,下发的时候通过冗余方式,是比较有效的解决方法。
帧同步的消息比较小,按照理论 1 秒 15 个驱动帧来算,20 分钟的录像是 10M 左右。但是我们外网统计,正常的 5V5 对局 20 分钟,录像的大小大概是 3M 左右。
服务器会把玩家的操作做纯内存的存储,当出现丢包的时候,服务器会通过编号快速找到缓存信息进行下发。同时根据丢包的情况,我们会计算给这个人发送冗余量的变化量。
最开始发送每个包会冗余前面 3 帧的信息,如果丢包严重,我们会尝试冗余更多信息再下发。客户端拿到之后会尽量压缩逻辑执行的过程。
帧同步有比较麻烦的模式在于,它不像 Client-Server 的模式随进随出,崩溃之后重回必须从一开始运行,中间运算过程不能少掉。
当然,我们也尝试过其他的一些方法。比如客户端上行之后,不需要服务器定时的间隔去做收集然后下发,而是通过染色帧编号直接下发,这样响应更及时,操作反馈更强、更快。
当时我们做出来的结果是,这对手感的提升微乎其微,但是带来的负面问题却很大,因为不再是一秒 15 个包固定的下发,下发包的数量非常多,完全和这个人的操作习惯有关系。
有可能一个人一秒之内产生了十几二十个输入,就需要把这些输入打包之后对客户端下发。客户端因为收包很多,设备也会明显发烫。
我们也有和其他部门合作,做类似于 TCP 的技术,大家直观想到如果丢包就在 IO 层做重发。
但是实际的结果会发现,做的这个技术偏底层,所以对丢包的控制性不那么灵活,而且可能出来的结果还没有 TCP 本身好。
传统的帧同步的方式会做延迟投递,这个我们也有尝试过。如果间隔时间内出现丢包,或者出现包下行时的网络波动,可以通过延迟投递这种方式抹平抖动和丢包的情况。
我们尝试过这个方案但最终没有这样做的原因在于:《王者荣耀》里面一些英雄体验起来感觉偏动作,对反应要求比较快,延迟投递虽然抗抖动和抗丢包的能力确实不错,但是手感上达不到我们的要求。
另外,做 Client-Server 方式的实现,一般都会有一个套路,客户端提前表现,根据服务器的表现做平滑或者拉扯。
这个方案我们也尝试过,但最终还是放弃了,因为这个技术会让角色本身的表现有点发飘。
客户端本地动,马上客户端表现就跟着动,但根据服务器的下行,其实会做一些偏移或者修正。当网络抖动出现的时候,角色会有一点发飘,所以这个方案我们放弃掉了。
帧同步方案,所有客户端进行运算,期望产生一致的结果,但如果因为 Bug 或者某个人使用修改器,跑出来的结果会和其他人不一样,当不一样出现,我们的说法是不同步了。
我们会定时把一些关键信息提取出来做 Hash,不同步的人的 Hash 和其他人会不一样。
《王者荣耀》不同步率上线时大概是 2%,也就是 100 局可能有 2 局出现一个人或者多个人结果和其他人不一样。我们现在把不同步率做到了万分之三,一万局里面只有三局出现这个情况。
这是怎么提升的呢?如果你用帧同步一定会遇到不同步的问题,客户端写错了,用了本地逻辑,可能浮点数的运算误差达到那样的临界点,它就会产生运算结果不一致。
我们的方法有很多:自动化测试,用机器人不断跑,比如上新英雄之前,有脚本测试不断跑,看会不会产生不同步的结果;有专门的体验服、抢先服大区,发布到正式网络之前先测试,先暴露问题,再解决问题。
另外,当不同步的时候,我们会把这局整个录像和客户端间的 Log 上传和保存下来,这样可以根据录像和中间执行的日志序列快速的定位是哪个地方出现问题。
我们对延迟和单局质量也有相应的监控,这一局有没有卡或者卡多少次,有没有出现丢包,丢包多少,最大的延迟、最大的抖动是多少,我们都是有相应的记录和统计。
运营部的同学给我们提供了很多帮助,我们会有相关的网络测速、问题分析的 SDK 的合入。
按照我们自己的统计,游戏卡顿主要的原因有几个:
-
小区的带宽比较繁忙,很多小区其实都是公用带宽出口,比如有人在下电影、看直播,占用了很高带宽,你玩游戏就可能会卡。
-
Wi-Fi 路由器延迟比较高,家里的 Wi-Fi 路由器长期没有重启,就会存在终端过多、信道干扰、其他大流量的应用下载情况,这也会影响你玩《王者荣耀》。
-
手机信号差、信号抖动,Wi-Fi、4G 空口丢包等。
我们在网络优化上做了很多的尝试,例如根据丢包情况加大冗余,然后优化我们各方面执行的效率,去减少 CPU 的占用。
《王者荣耀》后台方面,有两个点是我们一直努力在做的,网络优化和匹配机制,我们尝试用各种各样的方法,甚至后面也会尝试用 AI 深度学习的方法,来更加精准的定位玩家本身的真实水平,让他能够匹配到更加真实的同等水平的对手和队友。
相关推荐
病人跟踪治疗信息管理系统采用B/S模式,促进了病人跟踪治疗信息管理系统的安全、快捷、高效的发展。传统的管理模式还处于手工处理阶段,管理效率极低,随着病人的不断增多,传统基于手工管理模式已经无法满足当前病人需求,随着信息化时代的到来,使得病人跟踪治疗信息管理系统的开发成了必然。 本网站系统使用动态网页开发SSM框架,Java作为系统的开发语言,MySQL作为后台数据库。设计开发了具有管理员;首页、个人中心、病人管理、病例采集管理、预约管理、医生管理、上传核酸检测报告管理、上传行动轨迹管理、分类管理、病人治疗状况管理、留言板管理、系统管理,病人;首页、个人中心、病例采集管理、预约管理、医生管理、上传核酸检测报告管理、上传行动轨迹管理、病人治疗状况管理,前台首页;首页、医生、医疗资讯、留言反馈、个人中心、后台管理、在线咨询等功能的病人跟踪治疗信息管理系统。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。
liunx project 5
分享课程——PostgreSQL DBA实战视频教程(完整10门课程合集)
计算机科学基础期末考试试题
练习与巩固《C语言程序设计》理论知识,通过实践检验和提高实际能力,进一步培养自己综合分析问题和解决问题的能力。掌握运用C语言独立地编写调试应用程序和进行其它相关设计的技能。
1. 数据集资源 公开低光照数据集:用于模型训练的低光照图像数据集,这些数据集包含了多种低光照条件下的图像,并附有增强后的高质量图像。 合成数据:在不足数据的情况下,可以通过对高亮度图像进行暗化处理生成低光图像对,以增强数据量。 自建数据集:对于特定场景,如安防、医疗等,可以拍摄或收集特定条件下的低光照图像来创建数据集,满足特定应用需求。 2. 硬件资源 GPU:大规模模型训练需要高性能计算,以支持大规模图像处理和神经网络训练。 数据存储:由于图像数据较大,需要大容量的存储设备如HDD或SSD来存储数据集及中间结果。 3. 深度学习框架及工具 PyTorch:支持构建和训练神经网络模型,尤其适合卷积神经网络(CNN)和生成对抗网络(GAN)的实现。 CUDA和cuDNN:为GPU加速库,在模型训练时可显著提升运行效率。
双哥微服务
fb000f5e-12c5-a46b-102a-f08bdfa015f1.json
ASP.NET跑腿服务网站源码 开发环境 :Asp.net + VS2010 + C# + ACCESS 网站介绍: 适合人群:跑腿服务行业公司,服务资讯公司或者其他行业企业、 做服务行业建站的技术人员、技术人员学习参考都行。 技术特点:非常清爽大气的网站,界面华丽,工整,采用全div布局, 含flash图片切换功能,强大的后台信息管理功能。 功能介绍: 后台功能:系统参数设置(网站标题,关键字,内容,站长联系方式等)、系统栏目频道设置、新闻管 理、服务项目管理、公司介绍内容管、系统模版管理(可管理前台页面模版内容,具体到头部页面,底 部页面,首页,内容页,新网页等)、系统日志管理、系统管理员管理、频道管理(频道类型、频道内 容、内容发布以及编辑)。 后台地址:网址/admin/login.aspx 账户:admin 密码:admin888
c语言
环境说明: 开发语言:Java/php JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea 小程序框架:uniapp/原生小程序 开发工具:HBuilder X/微信开发者
人工智能(Artificial Intelligence,缩写为AI)是一种通过计算机程序模拟人类智能与行为的技术和理论。它可以用于各种领域,例如:自动驾驶、机器翻译、语音识别、图像识别、医疗诊断等。近年来,人工智能逐渐成为了技术界和商业领域的热门话题。
c语言
基于JAVA实现的离散数学题库管理系统
Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
# 基于C++的MiniSQL数据库系统 ## 项目简介 MiniSQL是一个轻量级的关系型数据库管理系统,旨在提供基本的SQL解析和执行功能。该项目参考了CMU15445 BusTub框架,并在其基础上进行了修改和扩展,以兼容原MiniSQL实验指导的要求。MiniSQL支持缓冲池管理、索引管理、记录管理等核心功能,并提供了简单的交互式SQL解析和执行引擎。 ## 项目的主要特性和功能 1. 缓冲池管理实现了一个高效的缓冲池管理器,用于缓存磁盘上的数据页,以提高数据访问速度。 2. 索引管理支持B+树索引,提供高效的插入、删除和查找操作。 3. 记录管理实现了记录的插入、删除、更新和查询功能,支持持久化存储。 4. 元数据管理提供了表和索引的元数据管理功能,支持持久化存储和检索。 5. 并发控制实现了基本的锁管理器,支持事务的并发控制。 6. 查询执行提供了简单的查询执行引擎,支持基本的SQL语句解析和执行。 ## 安装使用步骤
社会科学研究Top 10,000 Papers数据解析被引次数下载次数等 一、数据背景与来源 该数据集来源于SSRN(Social Science Research Network)的社会科学研究Top 10,000 Papers,是根据多种学术影响力指标统计得出的,在其平台上最受关注的前10,000篇学术论文的汇总。这些数据反映了国际研究领域的热点话题和发展趋势,对于国内学者研究者来说,是了解社科领域研究进展的重要窗口。 二、数据内容概览 样本数量:数据集包含10,000条记录,每条记录代表一篇在SSRN平台上具有高影响力的学术论文。 论文范围:涵盖社会科学研究的各个领域,包括但不限于经济学、政治学、社会学、心理学、教育学等。 关键指标: 数据下载次数:反映了论文的受欢迎程度和研究者对其内容的关注度。 引用次数:体现了论文在学术界的认可度和影响力,是评估论文质量的重要指标之一。 Rank Paper Total New Downloads Total # of Downloads Total # of Citations # of Authors
行业研究报告、行业调查报告、研报
【作品名称】:基于 Java+Mysql 实现的企业人事管理系统【课程设计/毕业设计】(源码+设计报告) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: [1]管理员可以对员工的基本信息的增删改查,普通员工仅可查看; [2]对公司里所有员工进行分配工号,并进行基本信息的录入; [3]对新聘用的员工,将其信息加入到员工档案记录中; [4]对于解聘的员工,将其信息从员工档案记录中删除。 [5]当员工信息发生变动时,修改员工档案记录中相应的属性。 (三)员工岗位信息管理 [1]对公司里所有员工的职务及岗位信息(岗位职责)进行记录; [2]记录员工调动前后的具体职务,以及调动时间。 (四)考勤管理 [1]对员工上班刷卡的记录进行统一编号;登记员工上班时间(准时、迟到)。 [2]对员工下班刷卡的记录进行统一编号;登记员工下班时间(准时、早 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。
# 基于Arduino编程的冰箱警报系统 ## 项目简介 这是一个基于Arduino编程的项目,通过连接到冰箱门开关的警报系统来提醒用户冰箱门开启时间过长。用户可以在设定的时间内关闭冰箱门,否则警报会响起。项目使用LCD控制器面板来设置和配置警报延迟时间。 ## 项目的主要特性和功能 1. 警报功能在冰箱门开启后,系统会开始计时,如果用户在设定的时间内未关闭冰箱门,警报会响起。 2. LCD配置面板使用LCD控制器面板设置和配置警报延迟时间。 3. 可配置警报时间用户可以根据需要调整警报延迟时间。 4. 状态显示LCD面板显示冰箱门的状态(开启关闭)。 ## 安装使用步骤 1. 下载并解压项目文件。 2. 准备硬件部件根据提供的物料清单(Bill of Materials)准备所需的硬件部件。 3. 连接硬件部件按照项目文档中的连接表(Connection Table)将硬件部件连接到Arduino主板和LCD控制器面板。