- 博客(196)
- 收藏
- 关注
原创 越抽象,越能拓展
如上图,如果用的不是泛型 而是 直接用了 IWindowProperties 的话,后续下面的代码的 Props 部分只能按照 IWindowProperties 的承诺去 写,万一 我的 Props 是新的东西,他也无法接收。有的,就是使用 属性。如上图,在后续实现的时候,把 private 类型的实际的字段 通过 属性 Return 了过去,实现了字段可读,且完成了一开始的承诺。那么在后续拓展的时候,只要拓展的东西是继承自 抽象类 和 接口 的,那么根基的代码就能跑,整个框架就稳定。
2024-09-16 21:12:44
493
原创 三分钟搞懂帧同步和状态同步
由上便知,这两个做法的最大区别在于计算的位置。状态同步的计算是在服务器,而帧同步所有的计算是在客户端完成。帧同步需要向服务器发送大量数据包,然后让服务器汇总后再转发给所有人,对于网络的实时性要求非常高,在整个处理过程中,网络流量的压力很大。所以帧同步适合 “开房间”类型的游戏(比如王者荣耀 本质上是10个人开小房间进行游戏)。而像开放世界,对实时性要求不高,各个客户端的展现不一定要高度同步相同,反正只要最后的数据结果对了就行,这种就适合做状态同步。状态同步的流量压力是随着同屏人数越多,其网络压力就越大。
2024-03-08 21:04:31
1030
1
原创 Unity中 Ref 和 Out 的使用差别
Out 可以不初始化,但 Out 一定要在函数内部进行赋值。在Unity中的案例就是射线检测用的就是Out。Ref 进函数时必须初始化。
2024-03-03 21:47:12
775
原创 《麦田物语》项目学习笔记
本文旨在记录我在学习《麦田物语》这个项目时,觉得有趣且有用的知识点,希望以后的我不要忘了下面这些知识哈哈把删除,可以提高整个项目的流畅度可以保存图片设置的预设,方便执行多图片重复的设置配置,而更改的场景部分就是地图场景。而切换地图的原理就:将所有场景添加至一起,将不需要的地图场景卸载,只保留需要的地图场景(而不是原来的使用SceneManager来直接Load)可以更改来单独观察特定的图层,防止瓦片地图绘制到错误的图层上可以用unity自带的来绘制随机瓦片如果是像素游戏,则可以来使得像素更加清晰。
2023-05-30 20:57:44
1770
原创 生产者-消费者问题【操作系统学习笔记】
生产者消费者问题是一个互斥,同步的综合问题对于初学者来说,最难的是发现题目中隐含的两队同步关系有时候是消费者需要等待生产者生产,有时候是生产者要等待消费者消费,这是两个不同的“一前一后问题”,因此也需要设置两个同步信号量。
2022-10-27 15:55:51
908
原创 用信号量实现进程互斥,同步【操作系统学习笔记】
缺少 P 就不能保证临界资源的互斥访问。缺少 V 会导致资源永不被释放,等待进程永不被唤醒。,比如对于打印机就设一个mutex1,对摄像头就设一个mutex2。可以把 P 看做 上锁, V 看作 解锁,这样好理解的很多。让本来异步并发的进程相互配合,有序推进。进程同步:要让 各并发进程 按要求。在“前操作”之后执行 V 操作。在“后操作”之前执行 P 操作。
2022-10-27 15:20:20
1210
原创 信号量机制【操作系统学习笔记】
整型信号量与普通整型变量的区别:对信号量只能执行 初始化,P,V 三种操作。整型信号量存在的问题:不满足让权等待原则。作为信号量,数值表示。
2022-10-25 14:38:23
286
原创 进程互斥的硬件实现方式【操作系统学习笔记】
old记录是否已被上锁;再将lock设置为true;检查临界区是否已被上锁(若已上锁,则循环重复前几步)缺点:不满足“让权等待”,会导致“忙等”,执行的过程不允许被中断,只能一气呵成。,执行的过程不允许被中断,只能一气呵成。适用于多处理机环境;逻辑上等同于TSL指令。优点和缺点同TSL指令。
2022-10-13 18:17:05
539
原创 进程互斥的软件实现方法【操作系统学习笔记】
每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志 flag[i] 设为 true ,之后开始访问临界区。在退出区把临界区的使用权转交给另一个进程(相当于在退出区既给另一个进程“解锁”,又给自己"上锁")主要问题:不遵循“空闲让进,有限等待”原则,可能导致“饥饿”主要问题:不遵循“忙则等待”的原则。“检查”,退出区“解锁”(先加锁)主要问题:不遵循“空闲让进”原则。“上锁”,退出区“解锁”
2022-10-13 17:04:03
228
原创 进程同步,进程互斥【操作系统学习笔记】
临界资源:一个时间段内只允许一个进程使用的资源(比如摄像头,打印机,还有许多变量,数据)**对临界资源的访问,需要互斥的进行。**即同一时间段内只能允许一个进程访问该资源。异步性:各并发执行的进程以各自独立的,不可预知的速度向前推进(
2022-10-11 17:02:35
259
原创 调度算法的评价指标【操作系统学习笔记】
总共完成了多少道作业 / 总共花了多少时间。因此调度算法其实只会影响作业/进程的等待时间!指单位时间内完成作业的数量。
2022-10-10 11:00:27
387
原创 进程调度的时机切换与过程调度方式【操作系统学习笔记】
是指一个进程让出处理机,由另一个进程占用处理机的过程。指的是从就绪队列中选中一个要运行的进程。包含了选择一个进程和进程切换两个步骤。,并不是调度越频繁,并发度就越高。狭义的"调度"和"切换"的区别。
2022-10-10 10:20:27
263
原创 进程通信【操作系统学习笔记】
进程通信就是指各进程拥有的内存地址空间相互独立,故而需要通信但为了安全,,但这种信息交换有是必须的,故操作系统提供了下面三种方式来通信。
2022-10-09 09:57:08
186
原创 进程的定义,组成,组织方式,特征【操作系统学习笔记】
的定义:就是一个指令序列三部分组成了。一般情况下,我们把进程实体就简称为比较传统的经典定义无论如何,都强调了进程的,他是一个过程。
2022-10-08 16:20:22
413
原创 移动语义 in C++【C++学习笔记】
89.移动语义 in C++当我们知道左值和右值,左值引用和右值引用后,我们可以看看它们最大的一个用处:移动语义🍅移动语义概述移动语义让事情变得简单,移动语义本质上允许我们移动对象。这在C++11前是不可能的,因为C++11引入了右值引用,这是移动语义所必须的其基本思想是:当写C++代码时,很多情况下,我们不需要或者不想把一个对象从一个地方复制到另一个地方,但又不得不复制。例如,把一个对象传给一个函数,那么它就要获得那个对象的所有权,我别无选择,只能拷贝。而当想从一个函数返回一个对象时也是如
2022-05-15 09:51:06
203
1
原创 左值与右值 in C++【C++学习笔记】
85.左值与右值 in C++🍅左值和右值是什么现在又很多人称左值为有地址的值,因为它们是有地址的如果要给一个具体的定义左值是由某种存储支持的变量右值是临时值int i = 10;如上表达式有两部分,左边和右边左值绝大多数时候在等号左边,右值在右边(但这并不总是适用的!)可以将右值赋值给左值,但不能给一个右值赋值(比如给10赋值)int i = 10;int a = i;在这里等号左边是左值,右边同样是左值,所以才说等号右边就是右值的说法是错的❌右值不仅仅是字面量,
2022-05-14 10:10:12
204
原创 追踪内存分配的简单方法 in C++【C++学习笔记】
84.追踪内存分配的简单方法 in C++知道你的程序什么时候分配内存,特别是堆内存,是很有用的。弱知道程序在哪里分配内存,便有可能减少它,从而运行更快,因为在堆上分配内存并不是最好的做法,尤其是在性能关键的代码中此次所探讨,展示的所有东西,都可以很容易的插入到你现有的应用程序中!记住的知识没有应用就是无用的!🍅追踪内存的方法论简单例子#include <iostream>struct Object { int x, y, z; };int main() {
2022-05-12 13:36:41
603
原创 静态库的使用 in Linux【Linux项目学习笔记】
1.5静态库的使用首先在给别人静态库时,除了静态库文件(.a)要给别人,还要给别人对应的头文件!!!静态库里的东西一般看不了,要了解这个库和使用这个库都需要头文件(比如使用时就#include 这个头文件)如果项目的文件结构如上,而如果在main.c中#include "head.h",然后编译:gcc main.c -o app,则会报错说找不到head.h头文件,因为默认条件下外来的头文件需要和main.c在同一级目录下!当然,为了整洁,肯定不会丢同一目录下的,那么就要在编译的时候做手脚了
2022-05-11 20:34:54
704
原创 静态库的制作 in C++【Linux项目学习笔记】
静态库的制作🍅关于库的概述库文件是一类文件,可简单将库文件看作一种代码仓库,它提供给使用者一些可以直接拿来用的变量,类或者函数库是一种特殊的程序,和一般程序区别不大,只是库不能单独运行库文件有两种:静态库和动态库静态库在程序的链接阶段被复制到了程序中动态库在链接阶段没有被复制到程序中,而是程序在运行时有系统动态加载到内存中供程序调用库的好处代码保密(别人用你的库,但是不会了解你的源码)方便部署和分发🍅库的制作命名规则Linux : libxxxx.alib : 前缀(固
2022-05-11 19:42:15
196
原创 小字符串优化 in C++【C++学习笔记】
83.小字符串优化 in C++在编程语言中,字符串的名声比较负面,慢的众所周知(悲),字符串实在是有太多负面影响了,移除字符串后程序的速度显著提升但是又不能抛开字符串单做事,字符串又是很重要的但无所谓,今天关注的是:C++标准库中如何优化小字符串🍅什么是小字符串优化小字符串(即不是很长的字符串),它们不需要堆分配,可以只分配一小块基于栈的缓冲区而不是堆分配的小字符串的实际定义长度由使用的C++标准库而变化,如VS2019中,小字符串的长度要小于等于15,即如果有一个这样的小字符串,它就不
2022-05-11 18:47:56
795
原创 五分钟了解单例模式 in C++【C++学习笔记】
82.单例模式 in C++今天讨论的不是c++的语言特性,而是一种设计模式,即单例模式🍅单例模式是什么单例是一个类的单一实例,而单例模式是指打算那个类或者结构体只有一个实例💡💡💡C++中的单例只是一种组织一堆全局变量和静态函数的方法🍅为什么要关心单例模式(为什么要用单例模式)在处理数据时一方面,如果你是有一个对象的单一实例,那么只会有单一的数据集,然后可能有一些功能而另一方面,我们有代表数据的类成员变量,我们有成员函数,代表的是对特定的数
2022-05-11 12:55:45
334
原创 如何让C++字符串更快 in C++【C++学习笔记】
80.如何让C++字符串更快字符串实际上是字符数组,所以对于string的主要问题,可能就是字符串格式化以及字符串的操作,这是因为它们都要分配内存🍅概述问题之前说过内存分配在堆和栈上的区别和建议:能分配在栈上就别分配到堆上,因为把内存分配到堆上会降低程序的速度。然而,std::string和它的很多函数都喜欢分配在堆上,这实际上并不理想#include <string>
2022-05-09 20:49:06
558
原创 如何让C++运行的更快 in C++【C++学习笔记】
79.如何让C++运行的更快 in C++这次的主题是:如何通过多线程来提高性能此次的多线程是来源于C++11的std::asnycasnyc的意思的 异步🍅std::asnyc用法首先要包含头文件#include <future>伪代码演示如果要加载一个文件里所有的东西,则可以用下面的for循环/*for (遍历一个文件) { 加载一个东西}*/for (const auto &file : meshFilepaths) { m_Meshes
2022-05-09 19:35:45
407
原创 如何储存任意类型的变量 in C++【C++学习笔记】
78.如何储存任意类型的变量 in C++前排提示,这个东西是C++17的新特性,需要设置成C++17才可使用今日的主题即为:std::any🍅std::any的使用std::any的使用非常简单首先要包含头文件#include <any>,并且确保是C++17#include <iostream>#include <any>int main() { std::any data; //亦可以std::any data = std::m
2022-05-08 18:41:57
939
原创 单一变量存放多种类型的数据 in C++【C++学习笔记】
77.单一变量存放多种类型的数据今天的主题是:如何在一个变量中存储多种类型的数据(这是一个C++17的特性)如何做到呢?要用到一个叫**std::variant**的东西(variant意思:变种,变形,各种各样的,易变的)🍅概述variant它和option很像,它的作用是让我们不用担心处理确切的数据类型,只有一个变量,之后我们在考虑它的具体类型故我们做的就是指定一个叫std::variant的东西,然后列出它可能的数据类型std::variant允许你列出所有可能的类型,然后你可能决定它将
2022-05-07 16:08:53
1206
原创 如何处理optional数据 in C++【C++学习笔记】
76.如何处理optional数据 in C++当我们的数据可能存在,也可能不存在的时候会发生什么呢?std::optional是C++17的新东西,用于检测数据是否存在or是否是我们期盼的形式,用于处理那些可能存在,也可能不存在的数据or一种我们不确定的类型在老处理方法中可以用返回引用的bool值来判断是否数据存在#include <iostream>#include <fstream>std::string ReadFile(const std::string
2022-05-07 10:58:37
813
原创 结构化 in C++17【C++学习笔记】
75.结构化 in C++17今天的主题:结构化绑定,只针对C++17结构化绑定是一个新特性,让我们更好的处理多返回值(曾有一回谈过如何处理多返回值,当时是用了结构体去处理,而这个结构化绑定就是在这个的基础上拓展的一种新方法,特别是处理元组,对组(pairs)以及返回诸如此类的东西🍅没用结构化前的应对多返回值先看以前应对多返回值的方法#include <iostream>#include <string>#include <tuple>std::t
2022-05-06 18:39:39
208
原创 基准测试 in C++【C++学习笔记】
74.基准测试 in C++你写了一段新代码,像把它的性能和你过去做的方法做一个比较,看看谁更快。而在C++中则有很多不同的方式来实现。如此,如下讨论的便是如何实际测量C++代码的性能(Cherno的观点和方法论)#include <iostream>#include <memory>int main() { int val = 0; for (int i = 0; i < 1000000; i++) { val += 2;
2022-05-06 15:48:24
713
原创 dynamic_cast in C++【C++学习笔记】
73.dynamic_cast in C++🍅概述当我们想要做特定类型的类型转换时,有C的方式,也有C++的方式C的方式就是类似于(int)a这般转换而C++的方式就是使用比如static_cast, const_cast的转换,dynamic_cast亦是如此dynamic_cast是作为一种安全机制提供给我们的转换类型方式,它做了额外的工作来确保我们实际的类型转换是有效的类型转换dynamic_cast更像一个函数,认识到这点很重要。它不想编译时进行的类型转换,而是是在运行时计算,所以会
2022-05-06 10:42:30
193
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人