
C#
文章平均质量分 61
Moyiii
Simplify the knowledge and deepen your mind.
展开
-
C# 德语法语解析浮点数不正确的问题记录
今天查Bug的时候,发现一个玩家登录不上去,一个游戏里镜头乱飞,表现不正常。对于法语来说,float.parse(1.5)这种方法会报错,因为法语环境下,小数是靠逗号分隔的,这个直接报错了也就还好。在德语环境下,不会报错,但是小数点会被忽略。所以只是数值不正常,这个就难查了。不要在表格里配置小数。都配置整数,再除以10000什么的。只是记录一下,原来没有往这个方面想过,踩过坑也就知道了。虽然他说的时候就这一句话,而且跟这个报错没什么关系。只是突然想起了之前一个同事给我说的一句话。但今天想想,还是浑身一抖。原创 2023-12-14 21:32:24 · 332 阅读 · 0 评论 -
Unity UGUI 循环滑动列表实现思路及简单代码实现
unity UGUI 循环滚动列表实现思路及简单代码原创 2023-10-24 18:22:32 · 2021 阅读 · 4 评论 -
复用对象的技巧
缓存、对象池、对象复用原创 2023-03-09 12:42:17 · 392 阅读 · 0 评论 -
记录一个Unity序列化的垃圾回收问题
我们可以发现,确实Unity总共New了两次List对象,并且都是在Awake之前。通过对比HashCode可知,第一次是我们默认New的空对象,第二次是UnityNew出来的并完成了反序列化。好了,问题了来了,在运行时,我们自己New的List和外部传进来的List,是同一个List吗?那如果我们自己不new对象,在面板上也放着不管,那这个List是null还是一个为0的对象呢?为了方面测试,我们新写一个类,名字叫做XList,我们重写类的构造函数,让类在构造函数中打印自己的HashCode。原创 2023-02-16 17:36:15 · 227 阅读 · 0 评论 -
一个关于Action的内存分配问题
Action action = Func 竟会不停地GC.Alloc?来一探究竟吧原创 2023-01-29 19:29:17 · 494 阅读 · 0 评论 -
C# 闭包的垃圾回收
今天在分析项目内存释放和垃圾回收问题的时候,注意到了一个问题,如果一个变量被闭包引用,则不会被垃圾回收掉(这理论上是废话),这正是这样,这个问题才变得很难查。这意味着,一些按钮绑定了带闭包的事件,这部分内存就很难回收了。可以看一个例子:结果如下:B未被回收B被回收了 如果闭包所在的函数是静态函数,则回收还会更麻烦,我在测试中,即便把action置为null,垃圾回收也没有成功回收掉对B的引用。所以要谨慎谨慎再谨慎,有时候一个小点累积下去,就是一个非常难排查的问题搜索复制...原创 2022-06-22 20:04:46 · 392 阅读 · 0 评论 -
C# 中 Dictionary 的 Capacity 问题
我们知道C#中的容器,其基础规则是以2倍的翻倍策略进行内存扩增的,我们也经常会通过统计容器的Capacity来统计内存占用。像List这种简单的线性结构。Capacity作为公开的属性是直接可以获取到的。但是像Dictionary这种复杂结构,我们不能直接拿到Capacity属性,那怎么办呢,我们可以通过反射的方法,简单计算下内存占用。我们只统计了桶的大小,并没有统计Entry的大小,感兴趣的同学可以自己试一下这个结果是89,因为它需要保证桶的大小是质数其中还有一个有趣的问题,如果你看过C#字典的源代原创 2022-06-15 11:42:26 · 1055 阅读 · 0 评论 -
关于深度优先遍历和广度优先遍历的一些深入思考
之前关于深度和广度优先遍历觉得算是比较简单的东西了,特别是深度优先遍历,用递归实现起来几乎是非常自然的,然而最近进行了一些思考探索,仍然有一些非常有意思的点,不论是从实际应用,还是优化方向。由于线性结构遍历比较朴素就不讨论了,这里主要针对图和树两种模型来探讨。深度优先遍历还是广度优先遍历从结果上看,二者都是遍历整个关联结构,而且时间复杂度都一样,跟对象群的规模呈线性关系, 没有太大的影响,但过程上还是有些差别。我们先来聊下深度优先遍历深度优先遍历有递归和非递归的写法,对于递归来说,它的代..原创 2022-03-04 16:46:20 · 2141 阅读 · 2 评论 -
C# TaskCompletionSource在Unity中的使用
之前项目在设计框架的时候,同事负责的底层资源加载模块没有提供同步方法,所有的资源都是需要通过异步模式进行加载,而异步模式是会传染的,一旦其中一步采用了异步,所有的上层调用链都需要改成异步以作兼容。而异步代码写起来代码容易分散不紧凑,甚至是大量的嵌套,很不优雅。先举个例子吧,假设UI管理在打开界面时需要加载界面的预置本身,异步代码大概就要这么写:public void TestOperation(){ UIManagerOpen("登录");}public void UIMana..原创 2021-12-29 12:28:10 · 2856 阅读 · 0 评论 -
Unity管理器驱动怎么做?简单聊下静态类与解耦
在前边的文章里提到了,我们希望做一个拦截UnityLog的管理类,并且初衷是希望,程序直接把这个脚本拖动到工程里,别的什么代码都不用动,管理类就能自动运行。然而当时测试的结果并不行。 我们问题的关键点在于,不改动其它的代码。试想一下,如果一个类不被别的类初始化和调用,那它的代码怎么执行?所以我最开始的想法是把初始化直接放到类的静态构造函数里去。但是这样做并没有用。 因为类的静态构造函数的执行时机是不确定的,它只能保证类在被引用前一定会执行完静态构造函数,...原创 2021-08-27 11:48:54 · 264 阅读 · 0 评论