自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 收藏
  • 关注

原创 关于Unity使用DLL的说法

简单介绍了托管DLL与非托管DLL区别

2024-04-12 10:30:17 346

原创 关于MessagePack的一些记录

MessagePack做的更直接,直接看你Value的值用几位可以表示,8位,16位,还是32位,那我就标记3种不同的类型信息,然后吧Value按照对应的字节直接写入后边。因为ProtoBuf有MSB的概念,特别对于比较大的数,至少要浪费2-3位的MSB,如果这2-3位被MsgPack用来做type信息,实际上二者在空间上是差不多的。但实际上,MsgPack应该还是节省了一些。这样的好处是节省内存空间,缺点是,比较难去做字段扩展,一旦字段顺序改变,或者增删,基本上很难和过去的数据结构进行兼容。

2024-04-08 18:32:48 252

原创 关于ProtoBuf的一些记录

关于二进制和proto的一些记录,内存压缩,优化算法

2024-04-07 18:25:35 432

原创 记一个Unity的异常问题

我们推测,Resources.UnLoadUnsedAssets方法是在别的线程执行的,在那个线程里,垃圾收集器并没有检测到Mesh的引用,于是就把Mesh的Native内存给销毁了。这些目前还都支持推测,因为没有源码,也看不到具体的逻辑。查了一些资料,最早Unity官方是有发文说,不要使用ThreadStatic,会引发Crash,不过我们用了也没有引发Crash。这段代码,会打印true。ThreadStatic会将静态字段标记为线程安全的,也就是每个线程将有一份自己的该字段存储。

2024-04-02 17:40:14 418

原创 Unity-通过AB包使用SpriteAtlas图集(基于unity2018)

图集、AssetBundle图集、unity图集

2024-03-29 17:56:51 1103

原创 unity小工具-非实时的值变化监听器

项目里有代码专门监听网络环境的变化,特别是在下载中,如果遇到断网或者切换为移动网络,可能需要触发提醒等等。这种需求可能是通用的,于是便写了一个通用的监听代码。如果需要的是实时的,则需要另外的设计了,比如用事件管理器,但对于一些通用的数值则可能需要封装为属性,重载set方法,广播事件了。注意,这种变化观察都是非及时性质的,也就是并不会在变化发生的瞬间通知,而是最少要延迟一帧(基于Update执行)。使用起来,也比较方便。

2024-02-22 12:05:56 575 1

原创 unity 编辑器开发一些记录(遇到了更新)

记录了一些unity编辑器中的问题,持续更新。

2024-01-19 11:03:06 545

原创 Unity项目里Log系统该怎么设计

另外要小心的一点是,遇到帧报错事件,如果处理不好,会有大量的日志往文件里写,每帧写好多个,会造存储的浪费和大量快速的GC问题,这个还是要提防一下。一个可能的处理办法是,每一段时间处理一定量的log数目,在正常情况下,日志的出口效率是比进入效率要高的,如果检测到某一刻日志队列已经超出了阈值,就可以清空处理等等。其实并没有想完整就设计一个好用的Log系统,然后发出来。这个想法绝对是没有问题的,即便是整个缓冲的设计都不是难事,问题在于,如果日志还没有写入缓冲区,游戏闪退了,那这部分缓冲区的日志该如何写入文件呢?

2023-12-15 17:27:20 250

原创 C# 德语法语解析浮点数不正确的问题记录

今天查Bug的时候,发现一个玩家登录不上去,一个游戏里镜头乱飞,表现不正常。对于法语来说,float.parse(1.5)这种方法会报错,因为法语环境下,小数是靠逗号分隔的,这个直接报错了也就还好。在德语环境下,不会报错,但是小数点会被忽略。所以只是数值不正常,这个就难查了。不要在表格里配置小数。都配置整数,再除以10000什么的。只是记录一下,原来没有往这个方面想过,踩过坑也就知道了。虽然他说的时候就这一句话,而且跟这个报错没什么关系。只是突然想起了之前一个同事给我说的一句话。但今天想想,还是浑身一抖。

2023-12-14 21:32:24 163

原创 Unity Memory Profiler 一点记录

3、从Assetbundle中Load出GameObject,但不实例化,也是会进入内存的。所以如果遇到渲染率为0的情况,可能是因为在内存池里,但是没有被渲染,这是内存池的一个弊端。1、在编辑器模式下运行,所有在工程里的资源都会被统计进去。2、删掉这些资源后,资源没有被统计了。

2023-11-01 15:19:06 106

原创 Unity UGUI 循环滑动列表实现思路及简单代码实现

unity UGUI 循环滚动列表实现思路及简单代码

2023-10-24 18:22:32 1124 2

原创 复用对象的技巧

缓存、对象池、对象复用

2023-03-09 12:42:17 260

原创 记录一个Unity序列化的垃圾回收问题

我们可以发现,确实Unity总共New了两次List对象,并且都是在Awake之前。通过对比HashCode可知,第一次是我们默认New的空对象,第二次是UnityNew出来的并完成了反序列化。好了,问题了来了,在运行时,我们自己New的List和外部传进来的List,是同一个List吗?那如果我们自己不new对象,在面板上也放着不管,那这个List是null还是一个为0的对象呢?为了方面测试,我们新写一个类,名字叫做XList,我们重写类的构造函数,让类在构造函数中打印自己的HashCode。

2023-02-16 17:36:15 151

原创 一个关于Action的内存分配问题

Action action = Func 竟会不停地GC.Alloc?来一探究竟吧

2023-01-29 19:29:17 234

原创 《Fixing Performance Problems》阅读笔记·一

一篇Unity关于CPU性能优化的文章总结,这是读书笔记,加上一些自己的理解

2022-11-08 16:49:40 104

原创 关于游戏性能优化的一些感想

性能优化的一些感想,时空平衡,项目取舍

2022-06-28 17:49:53 706

原创 C# 闭包的垃圾回收

今天在分析项目内存释放和垃圾回收问题的时候,注意到了一个问题,如果一个变量被闭包引用,则不会被垃圾回收掉(这理论上是废话),这正是这样,这个问题才变得很难查。这意味着,一些按钮绑定了带闭包的事件,这部分内存就很难回收了。可以看一个例子:结果如下:B未被回收B被回收了 如果闭包所在的函数是静态函数,则回收还会更麻烦,我在测试中,即便把action置为null,垃圾回收也没有成功回收掉对B的引用。所以要谨慎谨慎再谨慎,有时候一个小点累积下去,就是一个非常难排查的问题搜索复制...

2022-06-22 20:04:46 275

原创 C# 中 Dictionary 的 Capacity 问题

我们知道C#中的容器,其基础规则是以2倍的翻倍策略进行内存扩增的,我们也经常会通过统计容器的Capacity来统计内存占用。像List这种简单的线性结构。Capacity作为公开的属性是直接可以获取到的。但是像Dictionary这种复杂结构,我们不能直接拿到Capacity属性,那怎么办呢,我们可以通过反射的方法,简单计算下内存占用。我们只统计了桶的大小,并没有统计Entry的大小,感兴趣的同学可以自己试一下这个结果是89,因为它需要保证桶的大小是质数其中还有一个有趣的问题,如果你看过C#字典的源代

2022-06-15 11:42:26 779

原创 个人比较喜欢的最左(最右)二分查找写法

我们偶尔会遇到这样的二分查找问题,它的元素有重复,我们需要找到这个元素下标最小和最大的位置。或者它不是一种精确地查询,比如问一个排序数组中,大于等于6的最小数值是多少。面对这样的问题呢,我们的核心思路仍然是用二分法,只不过我们查找到符合条件的元素后不会立刻停止,而是会继续查找,缩短范围。它的核心还是判断。举个例子,假设在[L, R]区间内进行二分查找,成立条件为Condition(X) == True。因此我们可以套用这样的模板int l = L;int r = R;int res =

2022-03-18 17:26:33 331 1

原创 关于深度优先遍历和广度优先遍历的一些深入思考

之前关于深度和广度优先遍历觉得算是比较简单的东西了,特别是深度优先遍历,用递归实现起来几乎是非常自然的,然而最近进行了一些思考探索,仍然有一些非常有意思的点,不论是从实际应用,还是优化方向。由于线性结构遍历比较朴素就不讨论了,这里主要针对图和树两种模型来探讨。深度优先遍历还是广度优先遍历从结果上看,二者都是遍历整个关联结构,而且时间复杂度都一样,跟对象群的规模呈线性关系, 没有太大的影响,但过程上还是有些差别。我们先来聊下深度优先遍历深度优先遍历有递归和非递归的写法,对于递归来说,它的代..

2022-03-04 16:46:20 1870 2

原创 C# TaskCompletionSource在Unity中的使用

之前项目在设计框架的时候,同事负责的底层资源加载模块没有提供同步方法,所有的资源都是需要通过异步模式进行加载,而异步模式是会传染的,一旦其中一步采用了异步,所有的上层调用链都需要改成异步以作兼容。而异步代码写起来代码容易分散不紧凑,甚至是大量的嵌套,很不优雅。先举个例子吧,假设UI管理在打开界面时需要加载界面的预置本身,异步代码大概就要这么写:public void TestOperation(){ UIManagerOpen("登录");}public void UIMana..

2021-12-29 12:28:10 2515

原创 Unity一个简单的播放视频方法

在看宣雨松的博客的时候,看到了一个unity播放视频的方法Handheld.PlayFullScreenMovie("PV.mp4", Color.black, FullScreenMovieControlMode.Full);这个方法只在移动端有效果其中.mp4文件需要放到StreamingAssets目录下详细介绍可以看下宣雨松的博客Unity3D研究院之两种方式播放游戏视频(二十五) | 雨松MOMO程序研究院https://www.xuanyusong.com/archives

2021-10-11 15:18:48 1389

原创 Lua 判断一个变量是否是Boolean类型

很小的一个问题,觉得挺有趣,就记录一下今天遇到一个问题,是说如何不通过type()来判断一个变量是否是布尔类型

2021-09-16 11:30:40 1305

原创 Unity管理器驱动怎么做?简单聊下静态类与解耦

在前边的文章里提到了,我们希望做一个拦截UnityLog的管理类,并且初衷是希望,程序直接把这个脚本拖动到工程里,别的什么代码都不用动,管理类就能自动运行。然而当时测试的结果并不行。 我们问题的关键点在于,不改动其它的代码。试想一下,如果一个类不被别的类初始化和调用,那它的代码怎么执行?所以我最开始的想法是把初始化直接放到类的静态构造函数里去。但是这样做并没有用。 因为类的静态构造函数的执行时机是不确定的,它只能保证类在被引用前一定会执行完静态构造函数,...

2021-08-27 11:48:54 193

原创 C# 对文件进行MD5计算

今天在做需求的时候,需要把MD5的计算集成到应用中。其实计算MD5本身并不难,C#本身提供了计算Md5值的工具:using (FileStream fs = File.OpenRead(path)){ using (var crypto = MD5.Create()) { var md5Hash = crypto.ComputeHash(fs); return md5Hash; }}请注意,对fs的计算是M

2021-08-25 21:15:22 5323 2

原创 一个简单的C#HTTP服务器(含Unity通信调用)

为什么会有这个需求呢,是这样的,我们希望在手机端能够实时的把日志汇报到一个测试用的服务器上。因为本人是客户端,而且也不想占用服务器资源。因此就想自己尝试一下能不能直接用C#实现一个简单的http服务器,搜了一些资料后发现。一种是用Socket实现,一种是用HttpListener实现。Socket的实现不够直观明朗,但是更灵活。因为我的需求就是期望客户端那用简单的http请求就可以把游戏内日志汇报上来,因此简单易用是第一需求。原作者找不到了,这是我找到的那个参考https://www.h3399.c

2021-08-23 19:34:48 1905

原创 查看自己手机是否支持Google服务

记录一下,省的又找半天。在上架海外应用时,有时会接入googleAPI。有的手机虽然出厂不自带谷歌框架,但可以通过第三方软件安装并使用。但有的手机,即使通过第三方软件安装了谷歌框架,还是使用不了。谷歌后台有一个地方可以看到当前应用支持的机型可以通过右上角输入关键字来快速过滤机型。如果你的机器没在里边,或者你选择(exclude,不支持的列表)而你的手机在里边。那最好还是换个机器测试吧。但是不清楚root,甚至重刷系统有没有用。...

2021-08-16 11:59:45 7462

原创 图像漩涡特效,扭曲特效,Swirl算法思想

所谓的扭曲特效就是这样的:在网上直接搜漩涡算法什么的,也没有搜到,可能是我不知道怎么搜索关键词吧,最后终于找到一个生效的代码,研究了一下之后,把简单算法原理总结在这。其实这个算法挺仿生的,核心在于了解漩涡的特点是什么?是流速,距离漩涡中心和边缘的旋转速度是不同的。之前考虑了各种什么二维坐标转一维坐标,再把一维坐标映射在螺旋线上。想复杂了,也不知道怎么实现,也不知道是否有用。其实算法核心就是以漩涡为中心,对图片进行旋转,只不过旋转量不同。你观察图片也发现,越靠近中心,扭曲(旋转)越大。

2021-08-11 13:47:33 775

原创 IOS-ATT弹窗需求

ATT是苹果一项新规定,叫做AppTrackingTransparency,意味着在IOS14.0以上的设备,获取用户的IDFA,需要首先经过用户同意。这会影响到数据分析和广告投放,保护了用户的隐私,不过对研发和运营来说就不是一个好消息了。那为了过审怎么做呢,其实很简单,只需要调用几行简单的代码就可以了:1、获取用户是否已经具有权限OC代码如下:int GetSKAdNetworkEnaled(){ if (@available(iOS 14.0, *)) { A..

2021-06-29 12:05:43 4500 3

原创 C# 索引优先队列(索引堆)

在求Dijkstr最短路径的时候,我们会用到索引优先队列,因为堆中的值会随着遍历过程中被更新,这就需要一个支持定点更新的堆数据结构。从而保证log(n)的复杂度需求public class IndexPriorityQueue<T> where T : IComparable<T> { private int MaxSize; private int n; private T[] Keys; private

2021-06-25 16:34:05 239

原创 C# 并查集

最近测试了下并查集,发现之前写的效率不是很高。一定要进行路径压缩的情况下,查询的均摊效率才接近反阿卡曼函数,可以约等于常数,这里并没有统计权值,速度会略慢,但是也比较快了,而且省了一些空间。 class UnionSet { private int[] parent; private int groupNum; public UnionSet(int n) { parent = new int[n]

2021-06-24 20:52:35 332 2

原创 TargetSdkVersion升级到30后,安卓11手机上,apk解析失败

原来是因为TargetSDKVersion为30的情况下,必须用V2以上的签名模式才可以成功。但是因为MTP加固涉及到重签,而用的重签版本之前太老了,还是v1的,所以导致加固后的包都安装失败。

2021-06-22 19:31:23 3369

原创 C#最小堆实现

最近看了《算法》第四版这本书,里边关于优先队列讲的确实非常好,之前自己写过的最小堆代码过于臃肿了,这次重构一下,记录发上来public class Heap<T> where T : IComparable<T>{ readonly List<T> m_heap; public int Count => m_heap.Count - 1; public Heap() { m_heap = new List&

2021-06-15 13:40:41 168 1

原创 关于数据结构的&符号所带来的诸多疑惑(未完待续)

法师打发斯蒂芬

2021-02-18 16:52:58 1538 2

原创 《闲唠数据结构一》数据结构学什么

很多人比较疑惑,学数据结构有什么用,其实这个问题比较难回答,不是因为不知道怎么说,而是往深了说铺垫太长,往浅了说,又会词不达意,因此,我想等最后再说这个问题,那么首先还是可以讨论讨论学习数据结构我们到底要学什么? 数据结构学习可以从两个方面进行分类,第一是思想和代码实现。第二是,数据结构的实现和数据结构的应用。先说第一种,思想和代码实现。 数据结...

2019-12-05 12:13:25 434

原创 《闲唠数据结构》 前言

从08年上大学开始学习数据结构,到现在已经过了十一个年头,系统的学习过数据结构课程,也看了很多杂书。曾经写过几篇数据结构学习的文章,但毕竟鸡汤好看,具体学习还是很困难,通过这些年混迹贴吧,看了很多人的提问后发现,数据结构难在入门,以及对整体概念的理解和把握,也就是没开窍感觉什么都不会,一旦开窍了,感觉一通百通。 最开始我学习数据结构的时候也是一窍不通,一是C语言刚...

2019-11-26 15:33:00 169

原创 二叉树的层次遍历

很多同学在学习二叉树的过程中,最先接触的是二叉树的先序、中序以及后序遍历,但是遇到层次遍历的时候,就不知道怎么下手了,这里就教大家怎么样去实现树的层次遍历二叉树的结点定义:struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NU...

2019-11-08 15:41:39 133

原创 Leetcode117 填充同一兄弟结点II

不得不说,之前在做[116 填充同一兄弟节点I]的时候,没有思考那么多,被做题的兴奋冲昏了头脑,很想当然的把题目I的完全树想象成可以用完全树绝对坐标的性质做点事情。但到题目二的时候,我才发现这个问题的纠结所在。如果不是完全树,树中的某些结点为空的话,用题目I的算法是跑不通的。 分析如果有同学和我一样,最开始用先序遍历来解决这个问题的话,就会遇到和我一样的问题,如上图所示。按照先序序...

2018-08-17 11:32:31 624 2

原创 数据结构之禅

       &lt;一&gt; 万法皆空         当你走出校门,忘记了所学的东西,剩下的就是教育的本质       在我读大二的时候我听到了这句话,一直记忆犹新,不是我从里边读到了什么,而是从里边读不到什么。像这种根本不知道在讲什么的道理,应该是挺牛逼的吧,我小心翼翼的记下这句话,当做锦囊。       大四毕业,收拾东西,又看到了在一个手抄本上歪歪扭扭写着的这句话,瞬时热泪...

2018-08-15 21:57:13 392

原创 Leecode116 填充同一层的兄弟节点

题目描述分析这个题目leetcode难度定义为中等,也就是说官方认为这不是一道非常难的题目,需要一些技巧性。首先,我们应当具有的基础是,知道树的深度优先遍历(先序,中序,后序)、广度优先遍历(对树来说也可称为层次优先)。题目要求使用常数空间复杂度,因此个人猜测,题目其实是不希望通过层次遍历的方法去解决这个题目的。这里暂且不讨论层次遍历所需要的队列结构是否属于允许范围内的开销,就递归...

2018-08-03 15:58:26 365

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除