【unity之IMGUI实践】单例模式管理数据存储【二】
👨💻个人主页:@元宇宙-秩沅
👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
👨💻 本文由 秩沅 原创
👨💻 收录于专栏:unityUI专题篇
⭐单例模式管理面板对象⭐
文章目录
- ⭐单例模式管理面板对象⭐
- 🎶前言
- 🎶(==A==)常用关键API
- 🎶(==B==)需求分析
- 🎶(==C==)逻辑封装——游戏音乐数据存储
- 😶🌫️:步骤实现
- 实现音乐数据的同步更新——最终代码
- 🎶(==D==)逻辑封装——游戏排行榜数据存储
- 😶🌫️:**步骤实现**
- 总UML图
- 🎶(==E==)逻辑封装——音乐数据管理类
- 😶🌫️步骤:
- 结论:
- 👌结论:
🎶前言
🅰️
🎶(A)常用关键API
🎶(B)需求分析
🎶(C)逻辑封装——游戏音乐数据存储
😶🌫️:步骤实现
1.首先将音乐数据封装在类中,不采用单例模式
2. 而后封装一个游戏数据类为单例模式:功能:利用Playerfabs进行数据存储音乐数据
3.读取存盘中的数据更新游戏数据
1.首先将音乐数据封装在类中,不采用单例模式
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________脚本名: 音乐相关数据存储类
//___________功能: 记录音乐相关的数据
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class MusicData
{//记录音乐,音效的开关状态和拖动条public bool musicSwitch;public bool soundSwitch;public float musicRoll;public float soundRoll;public bool isFirst;
}
2. 而后封装一个游戏数据类为单例模式:功能:利用Playerfabs进行数据存储音乐数据
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________脚本名: 游戏数据类
//___________功能: 记录游戏的数据并用PlayerFabs存储
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------public class GameData
{static private GameData dataContorl = new GameData ();static public GameData DataContorl => dataContorl ;public MusicData musicData ;private GameData(){musicData = new MusicData();musicData = PlayerfabsClass.Chats.GetDataMess(typeof(MusicData), "Music") as MusicData ;if ( !musicData.isFirst ) //如果是第一次进入游戏{musicData.musicSwitch = true;musicData.soundSwitch = true;musicData.musicRoll = 0.5f;musicData.soundRoll = 0.5f;PlayerfabsClass.Chats.SaveDataMess(musicData, "Music"); //设置为自定义的默认值后进行存储 }}}
3.读取存盘中的数据更新游戏数据
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目: ______________
//___________功能: 设置面板功能
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class SetPlane : BeginFather<SetPlane>
{//将功能控件拖拽对应的成员变量中public Button closeButt;public Slider sliderMusic;public Slider sliderSound;public ToggleM toggleMusic;public ToggleM toggleSound;private float toggle1;private float toggle2;private void Start(){//按钮中事件的添加closeButt.triggerEvent += () => {this.gameObject.SetActive(false);BeginPlane.SingleInstance.Show();};//滑条中事件的添加sliderMusic.triggerEvent += (value) =>{};sliderSound.triggerEvent += (value) =>{};//多选框中事件的添加toggleMusic.triggerEvent += (value) =>{};toggleSound .triggerEvent += (value) =>{};this.Hidden();}private void MusicDataUpdate(){MusicData data = GameData.DataContorl.musicData;sliderMusic.NowValue = data.musicRoll;sliderSound.NowValue = data.soundRoll;toggleMusic.IsSwitch = data.musicSwitch;toggleSound.IsSwitch = data.soundSwitch;}public override void Show(){base.Show(); //保留父类的封装逻辑MusicDataUpdate();}
}
实现音乐数据的同步更新——最终代码
目的: 将游戏游戏数据保存至硬盘,下次开启游戏实现数据同步
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________脚本名: 游戏数据类
//___________功能: 记录游戏的数据并用PlayerFabs存储
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------public class GameData
{static private GameData dataContorl = new GameData ();static public GameData DataContorl => dataContorl ;public MusicData musicData ;private GameData(){musicData = PlayerPrefsDataMgr.Instance.LoadData(typeof(MusicData), "Music") as MusicData ;if ( !musicData.isFirst ) //如果是第一次进入游戏(表示注册表中第一次存该类型数据时){musicData.isFirst = true;musicData.musicSwitch = true;musicData.soundSwitch = true;musicData.musicRoll = 1f;musicData.soundRoll = 1f;PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music"); }}//音乐开关数据的更新存储public void ChangeMusicS( bool value){musicData.musicSwitch = value;PlayerPrefsDataMgr.Instance.SaveData(musicData,"Music");}//音效开关数据的更新存储public void ChangeSoundS(bool value){musicData.soundSwitch = value;PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");}//音乐滑条数据的更新存储public void ChangeMusicR(float value){musicData.musicRoll = value;PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");}//音效滑条数据的更新存储public void ChangeSoundR(float value){musicData.soundRoll = value;PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目: ______________
//___________功能: 设置面板功能
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class SetPlane : BeginFather<SetPlane>
{//将功能控件拖拽对应的成员变量中public Button closeButt;public Slider sliderMusic;public Slider sliderSound;public ToggleM toggleMusic;public ToggleM toggleSound;private float toggle1;private float toggle2;private MusicData musicData;private void Start(){//按钮中事件的添加closeButt.triggerEvent += () => {Hidden();BeginPlane.SingleInstance.Show();};//多选框中事件的添加toggleMusic.triggerEvent += (value) => GameData.DataContorl.ChangeMusicS(value);toggleSound.triggerEvent += (value) => GameData.DataContorl.ChangeSoundS(value);//滑条中事件的添加sliderMusic.triggerEvent += (value) => GameData.DataContorl.ChangeMusicR(value);sliderSound.triggerEvent += (value) => GameData.DataContorl.ChangeSoundR(value);Hidden();}private void MusicDataUpdate() //将已存盘的数据读取后更新{MusicData data = GameData.DataContorl.musicData;toggleMusic.IsSwitch = data.musicSwitch;toggleSound.IsSwitch = data.soundSwitch;sliderMusic.NowValue = data.musicRoll;sliderSound.NowValue = data.soundRoll;}public override void Show(){base.Show(); //保留父类的封装逻辑MusicDataUpdate(); //在展示时更新}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
//-------------------------------------
//—————————————————————————————————————
//___________项目: ______________
//___________功能: 开始面板类
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class BeginPlane : BeginFather<BeginPlane>
{// 获取开始面板中的各个按钮控件public Button but1;public Button but2;public Button but3;public Button but4;private void Start(){but1.triggerEvent += () => { SceneManager.LoadScene("Start"); }; //点击“开始游戏”but2.triggerEvent += () => { Hidden(); SetPlane.SingleInstance.Show(); }; //点击“游戏设置”but3.triggerEvent += () => { Application.Quit(); }; //点击“退出游戏”but4.triggerEvent += () => { Hidden(); }; //点击“排行榜”}}
🎶(D)逻辑封装——游戏排行榜数据存储
界面设计
- 效果演示:
😶🌫️:步骤实现
-
1.封装排行榜数据类(无参构造做new ,有参构造做一键赋值)
-
2.以数据管理类为载体进行更新API封装——只存储排行榜中的数据到盘(注册表)中
-
3.封装排行榜面板类进行实时显示
-----
封装排行榜数据类(无参构造做new ,有参构造做一键赋值)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:
//___________功能: 排行榜数据的载体
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class RankData
{ public string name;public int score;public int time;public RankData() //用来new{}public RankData(string name, int score, int time ) //用来一键赋值{this.name = name ;this.score = score ;this.time = time;}
}
----------------------
以数据管理类为载体进行更新API封装
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________脚本名: 游戏数据管理类
//___________功能: 记录和更新游戏的数据并用PlayerFabs存储
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------public class GameData
{static private GameData dataContorl = new GameData ();static public GameData DataContorl => dataContorl ;public MusicData musicData ;public List<RankData> rankTopData;//固定承载前六名的数据信息private GameData(){//初始化读取音乐数据musicData = PlayerPrefsDataMgr.Instance.LoadData(typeof(MusicData), "Music") as MusicData ;//初始化读取排行榜数据rankTopData = PlayerPrefsDataMgr.Instance.LoadData(typeof(List<RankData>), "Rank") as List<RankData>;if ( !musicData.isFirst ) //如果是第一次进入游戏(表示注册表中第一次存该类型数据时){musicData.isFirst = true;musicData.musicSwitch = true;musicData.soundSwitch = true;musicData.musicRoll = 1f;musicData.soundRoll = 1f;PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music"); }} //------------------------排行榜数据的更新封装-------------------------------//在排行榜中添加数据public void SaveRankData(string name, int score, int time){rankTopData.Add(new RankData(name, score, time));Debug.Log(rankTopData);rankTopData.Sort((a, b) => { return a.score > b.score ? -1 : 1; }); //添加排序规则//但list大于6时for (int i = rankTopData.Count - 1 ; i > 5; i--){rankTopData.RemoveAt(i); //删除}PlayerPrefsDataMgr.Instance.SaveData(rankTopData, "Rank" );}//------------------------音乐数据的更新封装------------------------------//音乐开关数据的更新存储public void ChangeMusicS( bool value){musicData.musicSwitch = value;PlayerPrefsDataMgr.Instance.SaveData(musicData,"Music");}//音效开关数据的更新存储public void ChangeSoundS(bool value){musicData.soundSwitch = value;PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");}//音乐滑条数据的更新存储public void ChangeMusicR(float value){musicData.musicRoll = value;PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");}//音效滑条数据的更新存储public void ChangeSoundR(float value){musicData.soundRoll = value;PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");}
}
-----------
3.封装排行榜面板类进行实时显示
using System.Collections;
using System.Collections.Generic;
using UnityEngine;//-------------------------------------
//—————————————————————————————————————
//___________脚本名: 排行榜面板
//___________功能: 掌控排行榜面板相关控件
//___________创建者: 秩沅_______________
//_____________________________________
//-------------------------------------public class RankPlane : BeginFather<RankPlane >
{public Button closeButton;//采用列表的方式进行排行数据的暂时存储private List<Label> RK_Name = new List<Label>();private List<Label> RK_Score = new List<Label>();private List<Label> RK_Time = new List<Label>();private void Start(){//通过API获取排行榜中的标签for (int i = 1; i <= 6; i++){ RK_Name.Add(this.transform.Find("RKName/player" + i ).GetComponent<Label>());RK_Score.Add(this.transform.Find("RKScore/Score" + i ).GetComponent<Label>());RK_Time.Add(this.transform.Find("RKTime/time" + i ).GetComponent<Label>()); } //为按钮中的事件添加方法closeButton .triggerEvent += ()=>{Hidden(); BeginPlane.SingleInstance.Show();};Hidden(); }public override void Show(){base.Show();ShowRankData();}public void ShowRankData() //读盘排行榜数据并显示{GameData.DataContorl .SaveRankData("nibb", 100, 342);List<RankData> data = GameData.DataContorl.rankTopData;for (int i = 0; i < data.Count; i++){string showTime = "";int hour, min, second;print(data[i].name);RK_Name[i].ContorlContent.text = data[i].name;RK_Score[i].ContorlContent.text = data[i].score.ToString();RK_Time[i].ContorlContent.text = "";//时间格式转化hour = data[i].time / 3600;min = data[i].time / 60 % 60;second = data[i].time % 60;showTime = $"{hour}小时{min}分钟{second}秒";RK_Time[i].ContorlContent.text = showTime;}}
}
总UML图
🎶(E)逻辑封装——音乐数据管理类
😶🌫️步骤:
- 1.封装音乐数据管理类——单例
- 2.在游戏数据管理类中,更新音乐数据更新方法
封装音乐数据类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目: ______________
//___________功能: 更新音乐
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class MusicContol : MonoBehaviour
{static private MusicContol singleMusicContol;static public MusicContol SingleMusicContol => singleMusicContol;private AudioSource beginAudio;private MusicData nowMusicData;void Awake(){singleMusicContol = this;//达到一运行游戏就有音乐的效果beginAudio = GetComponent<AudioSource>(); //从盘中读取nowMusicData = PlayerPrefsDataMgr.Instance.LoadData(typeof(MusicData), "Music") as MusicData;beginAudio.enabled = nowMusicData.musicSwitch;beginAudio.volume = nowMusicData.musicRoll;}//----将其变成外界可调用的方法------ public void ChangeMusicSwitch(bool value) //改变音乐开关{beginAudio.enabled = value;}public void ChangeMusicRoll(float value) //改变音乐大小{beginAudio.volume = value;}public void ChangeSoundSwitch(bool value) //改变音效开关{}public void ChangeSoundRoll(float value) //改变音效大小{}
}
游戏数据管理类,也需要更新——在方法中更新逻辑
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________脚本名: 游戏数据管理类
//___________功能: 记录和更新游戏的数据并用PlayerFabs存储
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------public class GameData
{static private GameData dataContorl = new GameData ();static public GameData DataContorl => dataContorl ;public MusicData musicData ;public List<RankData> rankTopData;//固定承载前六名的数据信息private GameData(){//初始化读取音乐数据musicData = PlayerPrefsDataMgr.Instance.LoadData(typeof(MusicData), "Music") as MusicData ;//初始化读取排行榜数据rankTopData = PlayerPrefsDataMgr.Instance.LoadData(typeof(List<RankData>), "Rank") as List<RankData>;if ( !musicData.isFirst ) //如果是第一次进入游戏(表示注册表中第一次存该类型数据时){musicData.isFirst = true;musicData.musicSwitch = true;musicData.soundSwitch = true;musicData.musicRoll = 1f;musicData.soundRoll = 1f;PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music"); }} //【------------------------排行榜数据的更新封装----------------------------------】//在排行榜中添加数据public void SaveRankData(string name, int score, int time){rankTopData.Add(new RankData(name, score, time));Debug.Log(rankTopData);rankTopData.Sort((a, b) => { return a.score > b.score ? -1 : 1; }); //添加排序规则//但list大于6时for (int i = rankTopData.Count - 1 ; i > 5; i--){rankTopData.RemoveAt(i); //删除}PlayerPrefsDataMgr.Instance.SaveData(rankTopData, "Rank" );}//【------------------------音乐数据的更新(存盘)封装----------------------------------】//音乐开关数据的更新存储public void ChangeMusicS( bool value){musicData.musicSwitch = value;MusicContol.SingleMusicContol.ChangeMusicSwitch(value); //实时改变音乐大小_下同PlayerPrefsDataMgr.Instance.SaveData(musicData,"Music"); //实时进行音乐数据存盘_下同}//音效开关数据的更新存储public void ChangeSoundS(bool value){musicData.soundSwitch = value;MusicContol.SingleMusicContol.ChangeSoundSwitch(value);PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");}//音乐滑条数据的更新存储public void ChangeMusicR(float value){musicData.musicRoll = value;MusicContol.SingleMusicContol.ChangeMusicRoll(value);PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");}//音效滑条数据的更新存储public void ChangeSoundR(float value){musicData.soundRoll = value;MusicContol.SingleMusicContol.ChangeSoundRoll(value);PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");}}
过程中的错误——优化思维
进行优化__________==>
结论:
👌结论:
- 1.进行模块化处理,数据管理就是数据管理,面板显示就是面板显示,各司其职,员工不得乱工作
- 2.抽象行为,分配行为,你就是掌控者
- 3.如果某个行为/操作,不仅限于一个对象,要将其封装成外界可以调用的API
(例如修改主界面音频时,自己直接获取,却没想到将其封装成外界调用的方法)
⭐相关文章⭐
⭐【2023unity游戏制作-mango的冒险】-6.关卡设计
⭐【2023unity游戏制作-mango的冒险】-5.攻击系统的简单实现
⭐【2023unity游戏制作-mango的冒险】-4.场景二的镜头和法球特效跟随
⭐【2023unity游戏制作-mango的冒险】-3.基础动作和动画API实现
⭐【2023unity游戏制作-mango的冒险】-2.始画面API制作
⭐【2023unity游戏制作-mango的冒险】-1.场景搭建
⭐“狂飙”游戏制作—游戏分类图鉴(网易游学)
⭐本站最全-unity常用API大全(万字详解),不信你不收藏
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!
相关文章:

【unity之IMGUI实践】单例模式管理数据存储【二】
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:uni…...

【C++】开源:Linux端ALSA音频处理库
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Linux端ALSA音频处理库。 无专精则不能成,无涉猎则不能通。。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,…...

【Linux | Shell】结构化命令2 - test命令、方括号测试条件、case命令
目录 一、概述二、test 命令2.1 test 命令2.2 方括号测试条件2.3 test 命令和测试条件可以判断的 3 类条件2.3.1 数值比较2.3.2 字符串比较 三、复合条件测试四、if-then 的高级特性五、case 命令 一、概述 上篇文章介绍了 if 语句相关知识。但 if 语句只能执行命令,…...

基于单片机的语音识别智能垃圾桶垃圾分类的设计与实现
功能介绍 以51单片机作为主控系统;液晶显示当前信息和状态;通过语音识别模块对当前垃圾种类进行语音识别; 通过蜂鸣器进行声光报警提醒垃圾桶已满;采用舵机控制垃圾桶打开关闭;超声波检测当前垃圾桶满溢程度࿱…...

最新版本docker 设置国内镜像源 加速办法
解决问题:加速 docker 设置国内镜像源 目录: 国内加速地址 修改方法 国内加速地址 1.Docker中国区官方镜像 https://registry.docker-cn.com 2.网易 http://hub-mirror.c.163.com 3.ustc https://docker.mirrors.ustc.edu.cn 4.中国科技大学 https://docker.mirrors…...

深度学习——LSTM解决分类问题
RNN基本介绍 概述 循环神经网络(Recurrent Neural Network,RNN)是一种深度学习模型,主要用于处理序列数据,如文本、语音、时间序列等具有时序关系的数据。 核心思想 RNN的关键思想是引入了循环结构,允许…...

three.js入门二:相机的zoom参数
环境: threejs:129 (在浏览器的控制台下输入: window.__THREE__即可查看版本)vscodewindowedge 透视相机或正交相机都有一个zoom参数,它可以用来将相机排到的内容在canvas上缩放显示。 注意:…...
sql语法树(select)实例
在SELECT节点下,将"*"(表示选择所有列)添加为子节点。下面是一个简单的SQL语句示例: SELECT * FROM customers WHERE age > 25 AND city New York;语法树(Syntax Tree)是由SQL解析器构建的…...

爬虫002_python程序的终端运行_文件运行_ipython的使用---python工作笔记020
用python运行一个文件,就是要写一个.py结尾的文件 然后保存 然后直接cmd中,python 然后写上py文件的路径就可以了 然后看一下内容 看一下终端中运行,直接输入python进入python环境,然后写python代码 回车运行 退出可以用exit()...

智融SW3518S降压协议IC一款适合车充控制芯片
描述 SW3518S 是一款高集成度的多快充协议双口充电芯片, 支持 AC 口任意口快充输出, 支持双口独立限流。 其集成了 5A 高效率同步降压变换器, 支持 PPS/PD/QC/AFC/FCP/SCP/PE/SFCP/VOOC等多种快充协议, 最大输出 PD 100Wÿ…...

虹科活动 | 虹科ADAS自动驾驶研讨会
虹科ADAS/自动驾驶研讨会将于8月7日在上海闵行展开——加快ADAS/AD开发步伐! 期待您的参与!...
LeetCode-每日一题-将数组和减半的最少操作次数
2208. 将数组和减半的最少操作次数 提示 中等 49 相关企业 给你一个正整数数组 nums 。每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。(注意,在后续操作中你可以对减半过的数继续执行操作) 请你返…...
97、Kafka的性能好在什么地方
Kafka的性能好在什么地方 一、顺序写二、零拷贝三、额外补充 kafka不基于内存,而是硬盘存储,因此消息堆积能力更强 一、顺序写 顺序写 : 利用磁盘的顺序访问速度可以接近内存,kafka的消息都是append操作,partition是有序的&#…...

(2)前端控制器的扩展配置, 视图解析器类型以及MVC执行流程的概述
SpringMVC入门程序的扩展说明 注册前端控制器的细节 在web.xml文件注册SpringMVC的前端控制器DispatcherServlet时使用url-pattern标签中使用/和/*的区别 /可以匹配.html或.js或.css等方式的请求路径,但不匹配*.jsp的请求路径/*可以匹配所有请求(包括.jsp请求), 例如在过滤器…...
GO学习之切片操作
GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 文章目录 GO系列前言一、什么是切片(和数组有什么关系)二、切片基本操作2.1 切片定义2.2 添加元素2.3 删除元素2.4 遍历2.5 自定…...

YOLOv8实战口罩佩戴检测(视频教程)
课程链接:https://edu.csdn.net/course/detail/38827 口罩佩戴检测可以应用于公共场所的安全管理、疫情防控监测等多种场景。YOLOv8是前沿的目标检测技术,它基于先前 YOLO 版本在目标检测任务上的成功,进一步提升性能和灵活性。 本课程使用…...

SiddonGpu编译过程记录
1. 还是想要能够快速生成DRR,用了这个up的代码GitHub - fabio86d/CUDA_DigitallyReconstructedRadiographs: GPU accelerated python library for generation of Digitally Reconstructed Radiographs (March 2018) 在看步骤的时候不是很清晰。尤其是procedure to…...
Ubuntu 20.04使用 VNC远程桌面连接避坑指南
自从开始使用Ubuntu 20.04搭建深度学习服务器,就想到使用VNC远程桌面连接使用。可是之前一直使用的是Ubuntu18.04,心里想着设置应该不难,结果在配置的时候总出现无法连接的错误。下面我就分享一下我使用TigerVNC配置远程桌面连接过程中遇到的…...

STM32MP157驱动开发——按键驱动(定时器)
内核函数 定时器涉及函数参考内核源码:include\linux\timer.h 给定时器的各个参数赋值: setup_timer(struct timer_list * timer, void (*function)(unsigned long),unsigned long data):设置定时器:主要是初始化 timer_list 结…...

基于Centos 7虚拟机的磁盘操作(添加磁盘、分区、格式分区、挂载)
目录 一、添加硬盘 二、查看新磁盘 三、磁盘分区 3.1新建分区 3.2 格式分区 3.3 挂载分区 3.4 永久挂载新分区 3.5 取消挂载分区 一、添加硬盘 1.在虚拟机处选择编辑虚拟机设置,然后选择添加 2.选择硬盘,然后选择下一步 3.默认即可,下一步…...
“完全指南:理解API和商品详情的作用和关系“
当涉及到电子商务和在线交易时,API和商品详情是两个至关重要的概念。本文将为您提供一个详尽的指南,帮助您全面理解API和商品详情之间的作用和关系。 淘宝/天猫获得淘宝商品详情 API 返回值说明 公共参数 请求地址 名称类型必须描述keyString是调用…...

Spring Cloud Gateway - 新一代微服务API网关
Spring Cloud Gateway - 新一代微服务API网关 文章目录 Spring Cloud Gateway - 新一代微服务API网关1.网关介绍2.Spring Cloud Gateway介绍3.Spring Cloud Gateway的特性4.Spring Cloud Gateway的三大核心概念5.Gateway工作流程6.Gateway核心配置7.动态路由8.Predicate自定义P…...

HTTP超本文传输协议
HTTP超本文传输协议 HTTP简介HTTP请求与响应HTTP请求请求行请求头空行请求体 HTTP响应响应行响应头空行响应体 HTTP请求方法GET和POST之间的区别HTTP为什么是无状态的cookie原理session 原理cookie 和 session 的区别cookie如何设置cookie被禁止后如何使用session HTTP简介 HT…...

React+Redux 数据存储持久化
ReactRedux 数据存储持久化 1、安装相关依赖 yarn add reduxjs/toolkit redux redux-persist 2、userSlice:用户状态数据切片封装 import { createSlice, PayloadAction } from reduxjs/toolkitinterface IUserInfo {userName: stringavatar?: stringbrief?: st…...
Redis高可用部署架构
目录 1. 主从复制与哨兵架构:2. Redis集群架构: Redis高可用部署可以采用主从复制与哨兵架构或Redis集群架构。下面将分别介绍这两种架构的架构图、优缺点和具体应用场景。 1. 主从复制与哨兵架构: 架构图: ----------| Client…...

深度学习与神经网络
人工智能,机器学习,深度学习,神经网络,emmmm,傻傻分不清楚,这都啥呀,你知道吗?我不知道。你知道吗?我不知道。 来来来,接下来,整硬菜:…...

CPU密集型和IO密集型任务的权衡:如何找到最佳平衡点
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、CPU密集型与IO密集型3.1、CPU密集型3.2、I/O密…...

超越POSIX:一个时代的终结?
在本文中,我们通过对Portable Operating System Interface(POSIX)抽象的历史演变进行系统性的回顾,提供了一个全面的视图。我们讨论了推动这些演变的一些关键因素,并确定了在构建现代应用程序时使它们不可行的缺陷。 …...
秋招算法备战第22天 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode) 在一个二叉搜索树中,两个节点 p 和 q 的最近公共祖先可以通过以下的算法找到: 从根节点开始。如果当前节点的值大于 p 和 q 的值,那么你需要转向左子树。因为在二叉…...

小程序之移花宫-自定义底部标签图标---【浅入深出系列005】
浅入深出系列总目录在000集 如何0元学微信小程序–【浅入深出系列000】 不会导入/打开小程序的看这里 让别人的小程序长成自己的样子-更换window上下颜色–【浅入深出系列001】 文章目录 本系列校训学习资源的选择 学习目标图标的注意事项图标资源打开小程序动手实践找到图标最…...