ET框架:Async和await,ETVoid与ETTask
前言 看ET框架时发现其广泛使用了ETVoid、ETTask的异步处理方式,同时也有段时间没复习await/async的有关内容了,所以也趁这个机会重新看一看。
参考资料
123456784.1ETTask: https://www.yuque.com/et-xd/docs/wyr682ET篇:ETVoid和void,ETTask和Task的区别与使用时机: https://www.lfzxb.top/et-ettask-etvoid/C# async 和 await 理解: https://blog.csdn.net/a462533587/article/details/82261468字母哥:【ET框架课程】08-异步编程与ETTask的使用 https://www.bilibili.com/video/BV1sV411J7wJ?spm_id_from=333.999.0.0
总结
ET方面:
ET框架是单线程逻辑,ETTask是一个轻量级单线程的Task,相比Task性能更强,本质上可以说是协程
ETTask就是把回调改成同步的写法,具体是单线程回调还是多线程回 ...
Leetcode: 492 构造矩形
492. 构造矩形
解题思路: 一道非常简单的题目,直接将面积开平方向上取整以后从下往上判断是否符合要求,符合则break即可。
以下为C++代码:
12345678910111213141516class Solution {public: vector<int> constructRectangle(int area) { //从sqrt(area)开始计算 int index=ceil(sqrt(area)); vector<int> ans; for(int i=index;i<=area;i++){ if(area%i==0){ ans.push_back(i); ans.push_back(area/i); break; } } return ans; ...
Leetcode: 229.求众数 II
229. 求众数 II
解题思路:
遍历计数法
先遍历vector,用unordered_map记录下每个数出现的次数
逐个判断出现次数是否>nums.size()/3,符合则加入ans中
时间复杂度为O(n),空间复杂度为O(n)
摩尔投票法
根据出现超过⌊ n/3 ⌋次的元素可以得出最多可能有2个这样的元素
让互不相同的三个元素互相抵消,最终会得到两个可能符合的元素
遍历计数,判断两个元素是否符合,符合则将其加入到ans中
时间复杂度为O(n),空间复杂度为O(1)
以下为C++代码:
1234567891011121314151617181920212223242526272829303132333435363738394041424344class Solution {public: vector<int> majorityElement(vector<int>& nums) { //MARKER:摩尔投票法 int vote1=0; int vote2=0; ...
基于ET6.0的对战游戏demo
前言 先开个坑,关系到毕业设计的实现。
游戏类型:战旗类型、分为单机和联网,单机下怪物由AI树驱动,联网进行玩家对战
暂定的网络同步思路
状态同步方式
位置方面:客户端Unit每隔一段时间将自身的位置、朝向、速度发送给服务器,服务器计算出最终结果后进行广播操作,所有Units对位置结果进行插值处理12/19更新:现已通过A*方式进行寻路,所以客户端上传位置指令后服务器进行一定的校验、记录后即可进行转发操作,由客户端通过A*寻路移动到指定格子。
状态方面(技能、动画等):利用一个状态包来进行转发广播操作,与位置包分开处理12/19更新:因为制作的是战旗类型游戏,所以调整同步方式为同步玩家的输入指令,由服务器计算伤害数值、角色属性等变化进行广播操作(现在已将伤害的显示逻辑与表现逻辑分离)提供给客户端进行表现。
目前进度:
弃用ET的自带UI,加入了EGUI的基于ET的UI框架并针对其进行修改和适配,加入UI栈、UI队列等
采用ET框架实现A*寻路算法,将具体寻路功能拆分为在zoneScene中全局的A*地图GridComponent组件与移动控制组件ControlCompon ...
Leetcode: 66.加一
66. 加一
解题思路: 方法1:直接从最后一位开始模拟整个加法的过程即可
方法2:逆序查找第一个不为9的数加1,其余都设为0即可(感觉更简单)
以下是C++代码:
123456789101112131415161718class Solution {public: vector<int> plusOne(vector<int>& digits) { vector<int> ans=digits; int index=ans.size()-1; int add=1; while(add==1 && index>=0){ ans[index]+=add; add=ans[index]/10; ans[index--]%=10; } //考虑最终有进位情况 if (add==1) ...
Leetcode 453: 最小操作次数使数组元素相等
解题思路:考虑到n-1个元素增加1,对于这n-1个元素来说差值的情况是不会变得,因此可以看做是这n-1个元素并没有变而是将最后1个元素减1的情况,这时解题的代码就非常明确了。
以下是C++代码:
1234567891011121314151617class Solution {public: int minMoves(vector<int>& nums) { //将n-1个元素增加1相当于让1个元素减1 int min=nums[0]; for(auto temp:nums){ if (temp<min){ min=temp; } } int ans=0; for(auto temp:nums){ ans+=temp-min; } return ans; ...
C#:值类型和引用类型的具体类型和区别
先放上一个图表示值类型和引用类型的所有数据类型:
(1)最根本的一个区别:值类型的变量直接存储数据,将数据存储在栈中。而引用类型的变量持有的是数据的引用,数据存储在堆中(对其的实例引用存储在栈中)(面试碰到的话后续还可以引申栈和堆的一些区别,比如GC标记压缩的垃圾回收方法等等)。
(2)同时对于struct(值类型)和class(引用类型)来说,struct和class都可以实现接口(函数),但是struct在赋值时(如struct s1=s2)会直接创建s2的副本并赋值给s1,而对于class赋值时(class c1=c2)时会将两个类指向同一个引用,后续操作会同时改变同一个堆中实例。
(3)所有的值类型都继承System.ValueType,引用类型继承自System.Object。(其实引用类型和值类型都继承自System.Object类,不同的是,几乎所有的引用类型都直接从System.Object继承,而值类型则继承其子类,即直接继承System.ValueType)
△ 如果一个值类型被声明在一个方法体外并且在一个引用类型中,那它就会在堆上进行分配。
Leetcode记录:211 添加与搜索单词-数据结构设计
211. 添加与搜索单词 - 数据结构设计
解题思路: 比较典型的一道前缀树的题目,注意在构建前缀树的过程中不要粗心大意即可,前缀树的定义可以参考208. 实现 Trie (前缀树) 的官方题解。
1.用一个is_end来记录是否到达结尾,2.结点向下的多叉树子结点用vector<TrieNode *>来记录
以下是C++代码:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465class TrieNode{public: vector<TrieNode *> childs; bool is_end; TrieNode(bool _is_end=false){ childs=vector<TrieNode *>(26,nullptr); is_end=_is_end; }& ...
Session和Cookie的区别、联系
1参考:https://www.cnblogs.com/ITCodeMonkey/p/7874343.html
有时间回来补充一下
Unity服务器--什么是RPC?
前言:在学习ET框架中Client与Server交互时的message信息中碰到的RpcId,之前没有太了解,固趁这个机会了解以下
1知乎参考:https://zhuanlan.zhihu.com/p/76727302
此篇可能会慢慢更新。。。
RPC 调用分类RPC调用分为以下两种
123451. 同步调用 客户方等待调用执行完成并返回结果。 2. 异步调用 --c2s_new,s2c_new,sreq_new 客户方调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果。 若客户方不关心调用返回结果,则变成单向异步调用,单向调用不用返回结果。