书籍笔记 - 程序是怎样跑起来的(硬件软件交互理解)
CPUCPU可直接执行的“机器码”,到底能处理什么?简单来说分为4种,
数据传送指令:用于寄存器、内存、外围设备之间进行数据读写的操作。也就是读写操作。
运算指令:用累加寄存器执行算术运算、逻辑运算、比较运算和位移运算。
跳转指令:实现条件分支、循环、强制跳转等。其实就是个goto。
call/return指令:函数的调用 / 返回调用前的地址。和c#的函数栈桢展开是类似的。
二进制数如何在硬件层面理解二进制、bit、byte?像计算机的CPU和内存都是IC的一种,IC就是有很多引脚的集成电路,而每一个引脚的状态只有直流电压0V和5V,这两种。因此计算机的信息只能转化成二进制。
而**位(bit)**这个数据结构,就刚好对应了这个规律。
**字节(byte)**则是8个bit,因为内存和磁盘都是用字节为最小单位来存储、读写数据的,所以用位bit不能直接读写数据,所以都会在高位补0实现bit转byte。
而一个CPU有32位,就意味着它有32个引脚来处理信息的输入和输出,也就是说一次可以处理32位的二进制数信息。
为什么计算机内用补码来存数?(比如-1是11111111而不是10000 ...
AB包基础
2023年6月更新:已完成学习并实现huatuo+yooasset+uniTask的demo,下一步是接入自己的ui框架并迭代,地址:https://github.com/CodingCodingK/CodingK_SutureFramework
=================================================================================
学习计划:(我感觉用脑图好像比md更适合这种架构的学习和复习)
什么是热更 https://www.bilibili.com/video/BV1Np4y1e7DX/
AB入门 https://www.bilibili.com/video/BV1LD4y1m7kF
AB实战 https://www.bilibili.com/video/BV1VP411G7w2/
AA包 https://blog.csdn.net/u011366226/article/details/104506802
UniTask https://www.lfzxb.top/unitask_reademe_cn/ ...
UGUI学习 - 合批规则
1.抛开UGUI的概念,什么是drawcall?什么是批处理?他俩有啥关系?
CPU告诉GPU“可以渲染这个模型”的过程或者说这个命令叫做Draw Call(我们在Stats面板上看到的Batches其实就是Draw Call的调用次数)。在NGUI里甚至有UIDrawCall这个具体的类去抽象一次drawcall。
批处理(UGUI里类似的行为叫合批)就是把渲染时使用相同材质(Shader)、相同贴图的3D模型的网格合并在一起,成为一个大网格,然后再调用一次Draw Call,直接渲染这一个大网格。
关系就是,批处理是降低CPU发起drawcall次数的手段。
2.Unity中我怎么直观的去检查它?
frame debugger可以查看一帧整体的绘制流程,从而观察到UGUI层调了多少次Draw Mesh、每次是怎么样的。
profiler可以更直接的看到一个Canvas下的batch 0、batch 1…
3.基础的UGUI合批规则
无论是UGUI还是NGUI,都以一个基础的合批规则:当前渲染的UI组件与上一个UI组件的material+shader(也就是材质球)、texture( ...
Spine安装和简单了解、导入unity
1.首先简单了解下spine导出的东西是什么。spine导出的文件会有3个:png图集、atlas图集切分文件、记录骨骼、动画的一个二进制skel文件 或者 一个json文件。
2.要把spine导出的文件导入进unity,只要事先在spine-unity页面下载好对应的 spine-runtime unitypackage就可以。注意这个版本卡的特别死,unity版本和spine导出版本是必须严格遵照要求的,具体看页面。安装好对应的package之后,需要先把atlas后缀加上.txt,再给二进制文件skel加上.bytes,json就不用改了,然后直接复制粘贴文件到unity里就会自动转换。
3.在这里记录一个大坑,众所周知 Spine3.8.75 这个版本是网上能找到的破解版本。所以Spine直接在自己的 3.8版本unity runtime里,特别在2个地方写了一行:
12if ("3.8.75" == skeletonData.version) throw new Exception("Unsupported skeleton dat ...
战斗同步思考(未完)
需求拆解战斗同步1.战斗同步有2种模式,一种是离线验证模式,在本地记录操作帧和随机种子,发送到服务端,再重新演算战斗逻辑;另一种是同步模式,客户端只转发操作帧,由服务端下发真实操作帧。服务器成本原因,优先实现第一种。
2.结果验证
3.掉落验证
战斗流程1.实现战前匹配(可以是玩家也可以是Boss)、匹配成功后在服务端对所有玩家建立房间,下发开始。房间用状态机管理。进入房间后,启动倒计时,超过设定的最长战斗时长(10分钟)就判定失败,战斗视为失败,服务器回收资源。
2.从第一回合到最终回合,每一个回合的内部,进行回合触发时机的执行、行动优先级的判定、技能逻辑的执行、存活死亡的结算、战斗胜负的判定这几个程序步骤。
技术实现伪随机1.PRD算法
这是伪随机在游戏中最常见的用法,因此直接就被玩家用Pseudo Random Distribution的缩写PRD来指代了。
在WAR3中,一个暴击率20%的英雄,并不是每一刀都20%暴击率的。而是以5.57%作为初始暴率,如果第一刀不暴,则第二刀的暴率增加到初始值的2倍:11.14%;如果还是不暴,就继续增加到初始值的3倍:16.71%,以此类 ...
我用向日葵打开unity编辑器怎么白屏了?
原因根据网上搜索的结果,大致有两个原因:
台式机没有外接显示器,或显示器处于关闭状态。笔记本合上了盖子。
根据以上原因,个人猜测主要是因为没有检测到显示器,电脑显卡自动切换到某种低负载模式,这将导致一些使用显卡硬件加速的软件出现无法显示的问题。
没错,所以unity编辑器肯定是用了硬件加速或者根据硬件情况切换负载模式这种策略。
解决方法解决思路:既然软件无法正常显示,是由于显卡模式的切换,导致依赖显卡硬件加速的应用无法显示,那么解决方法主要有两种:
方法一: 让显卡能检测到显示器。可以通过外接显示器并通电、让笔记本打开盖子、外接虚拟HDMI之类的负载(让显卡误以为我们外接了显示器)。方法二: 若某个软件时因为依赖显卡硬件加速而导致无法显示,那么禁用该软件的显卡硬件加速功能即可。禁用显卡硬件加速方法又有两种思路:禁用手段一:百度,不同软件有不同的禁用方法。(可能有的软件没提供禁用选项)禁用手段二:在NVIDIA控制面板里指定禁用某个软件(个人猜测,没试过)
其他解决方法搜索的时候还遇到过别人有其他情况,一一列举,
1.清除cache
2.重装对应版本unity(前提是就个别版本unity ...
2D游戏中,角色预制体Image和Sprite怎么选择?
选型的时候搜了一下,Sprite更优,本来决定用Image的这样方便UI血条什么跟随不需要自己单独写代码了,但是发现Image对于帧动画支持并不好,需要手动SetNativeSize,感觉不如Sprite。以下是抄来的:
1.首先分析下两者的异同。
使用上,两者区别不大,都是使用一个Sprite源进行渲染,而Image需要位于某个Canvas下才能显示出来。场景中的Sprite可以像普通的3D游戏物体一样对待,通过Transform组件进行移动等操作,而Image则使用RectTransform进行布局,以便通过Canvas统一管理。由于RectTransform可以设置大小、对齐方式等,Image可以说更加方便一点,这也是很多人选择使用Image的原因。
渲染上,Sprite使用SpriteRenderer组件渲染,而Image则由CanvasRenderer组件渲染。两者在视觉上没有任何区别(都使用默认材质时)。它们默认的渲染也都是在Transparent Geometry队列中。
而在引擎的处理上,两者则有很大的不同。将Wireframe选项打开然后在场景中观察,就可以清楚地发现 ...
Unity中如何把RGB图和Alpha图分离的图片还原
Unity中如何把RGB图和Alpha图分离的图片还原一.RGB图、Alpha图简述RGB图RGB图是指由红、绿、蓝三个基本色光按不同比例合成的图像,是最常见的彩色图像。RGB图像的每个像素点由三个通道的颜色值组成,通常用三元组(R,G,B)表示,其中R表示红色通道,G表示绿色通道,B表示蓝色通道,三个通道的值均为0-255之间的整数。
Alpha图Alpha图是指一种用于描述图像透明度的图像格式,通常用于PNG格式的图像中。Alpha图像的每个像素点也由一个通道的值表示,通常用A表示,取值范围为0-255,0表示完全透明,255表示完全不透明。
二.为什么需要拆成2种图打包?1.ETC不支持透明通道ETC是一种Unity支持的贴图压缩格式,用于安卓设备,不过目前不支持ETC2的已经少到可以忽略了。
ETC:不支持透明通道,被所有 android 设备支持
ETC2:支持透明通道,Android 设备的 GPU 必须支持 OpenGL es 3.0 才可以使用,对于不支持的设备,会以未压缩的形式存在内存中,占用更多内存
PVRTC:所有苹果设备都可以使用,要求压缩纹理长宽相等,且是 ...
TCP、UDP的区别
什么是TCP、UDP协议,他们都只工作在传输层。
什么是TCP的挥手、握手三次握手、传输确认、四次挥手。
三次握手:建立连接用的。客户端发起请求给服务端,服务端返回消息给客户端发番号,客户端再发送请求给服务端,完成连接的建立。
为什么需要第三步?为了解决网络信道不可靠问题。第一个请求包阻塞了,所以客户端重新再做了第一步成功建立了连接,此时之前的那个阻塞包又恢复了,此时如果没有第三步服务端就会成功建立第二个连接。
传输确认:一包数据可能拆成多包发送,如何处理丢包问题?这些包的到达顺序不一定,如何处理乱序问题?答案是通过回复确认包。
这个根据下图模型理解。首先TCP会在建立连接之后,会创建如下的发送缓冲区。每次发送报文时,除了数据内容,还会在TCP协议头中附带本次数据内容的序列号(起始下标)+长度。接收端收到这个包后,会进行回复确认,内容为序列号+长度,也就是下一包的其实序列号。这样做是为了能够把整个包根据序列号和长度重组,中间遇到丢包的情况申请重发即可。
四次挥手:结束连接用的。
一、二挥手:客户端发送结束包给服务端;服务端返回一个包表示自己进入终止等待状态。这前两次挥手完之后,服务端 ...
工具篇:代码热更新
非常感谢 HybridCLR(代号wolong) 的作者walon大佬。
初识HybridCLR简介能够不写lua,简直就是神。
HybridCLR : github
HybridCLR li2cpp plus : github
HybridCLR示例项目 : github
手册:github.io
HybridCLR 由两部分构成 il2cpp_plus 仓库 (opens new window)和 HybridCLR 仓库 (opens new window)。il2cpp_plus 仓库基于 unity 原始 il2cpp 作了少量修改(几百行),使得它可以支持动态注册元数据,进行可以动态加载 dll。HybridCLR 仓库是 HybridCLR 的核心源代码。
HybridCLR的安装基于这两部分,安装有一定的版本规则。具体见支持的 Unity 版本文档。
配置第一个Unity项目搭建环境Unity版本2020.3.7
拷贝HybridCLR li2cpp plus项目中的libil2cpp文件夹 到对应版本Editor的Editor\Data\il2cpp文件夹下 ...