20k 18 分钟

# 前言 很久以前也有拿着 XLua C# 这边的源码看过,网上也找过资料... 就是搞不大清楚。 可惜没人提醒,后来才想明白,直接硬看 C# 这边的源码是不行的,想明白 C# 与 XLua 的交互原理,至少得先了解 C/C++ 与 Lua 的交互原理 —— 毕竟 C# 与 XLua 交互,依然是基于中间的 C API,了解了那边的概念,再看 C# 与 XLua 交互原理,才好理解。 # 基本介绍 Lua 虚拟机由 C/C++ 实现,因此它可以直接与宿主进行通信 C# 则可以依靠 C API 通过 P/Invoke 方式调用 Lua 虚拟机函数 即 C# 可以借助 C/C++ 来与 Lua...
4.6k 4 分钟

# 前言 最近做项目优化,在整理主界面的按钮问题的时候,用到了只读结构体,这个结构体会保存于一个列表中,并采用 in 对列表中的值进行引用传递。 然后突后面然想到,保存于列表中的值类型,真的能直接被引用吗? 毕竟 List 数据结构本身由于存在扩容问题,因此是不允许直接返回其中数据引用的。 那么我们就有理由怀疑:实际类型为 List 容器中,采用下标取出的对象作为引用传递时,它可能依然会在栈上新建一个临时变量,然后再将其作为引用传递过去。那么这里就还是存在一个额外拷贝开销了。 于是考虑了一下,并且也比较好奇,于是就想着用 ILSpy 进行反编译查看生成的 IL...
12k 11 分钟

# 前言 《CLR VIR C#》 这本书太厚,笔记也记得太多,因此还是分成两篇上传 这是第二篇,主要记录多线程相关章节笔记 # 第二十六章 线程基础 进程:进程是应用程序要使用的资源集合 每个进程都有一个虚拟地址空间,确保在一个进程中使用的代码和数据无法由另一个进程访问 以此确保应用程序实例的健壮性以及安全性 线程:对 CPU 进行虚拟化 每个进程都有自己专用线程 确保应用程序代码陷入死循环时仅 冻结 与代码关联的进程 Windows...
17k 16 分钟

# 前言 本来计划的是 3 月份就看完,结果 4 月 2 号了还剩两章,虽然这跟到后面看得更仔细有关,但是公司上个月突然要求加起班来也有关系,导致每周上班时间只有两天可以提前回家看书。 不过,在昨天 清明节 总算把这本书看完了! 看了下语雀的笔记创建记录: 已经记不起什么时候开始看的,笔记是 2 月 27...
6.1k 6 分钟

# 前言 在 《CLR vir C#》一书中,有说明 call 与 callvirt 的差别: call:可调用静态方法,实例方法和虚方法 调用实例方法和虚方法必须指定引用了对象的变量,该指令假定该变量不为 null callvirt:可调用实例方法和虚方法,不能调用静态方法(需要对变量做 null 检查,因此比 call 慢) 并且调用虚实例方法时,还需要检查发出调用对象的实际类型,然后以多态方式调用 同时,对于声明为 sealed 的类型,会有优化,采用 call 调用,例如:始终对结构体采用 call 调用。 这里我想进行各种调用测试,并从 IL 代码上确认下。 #...
1.7k 2 分钟

# 原型 struct ssss{ int x, y;}struct aaaa{ int x, y; public aaaa(int a) { x = a; y = 100; }}struct bbbb{ int x, y; public bbbb(int a) { this = new bbbb(); y = 1; }}对应 IL 代码: # ssss 类 .class private sequential...
2.6k 2 分钟

# 前言 在上一篇 关于 AssetBundleManifest 使用 文章我就写了,我们项目最近搞 微信小游戏 版本 那么这个版本肯定是主要面向 国内 ,那么就可以考虑 ASTC 格式了,于是索性全部切为 ASTC ,安卓、IOS 统一 然后就发现,之前通过 TexturePacker 生成的 UI图集 ,基本上都是选择了 Force Squared(强制方形分辨率) 选项的 —— 应该是为了兼容 IOS 平台的 PVRTC 格式。 不过现在统一换成 ASTC 就没这样的必要了,免得浪费内存。 于是就想着批量处理一波 虽然其实很简单,不过还是记录一下,以后没准什么时候就又用到了。 #...
3k 3 分钟

# 前言 最近项目在做 微信小游戏 版本,因此所有的 AssetBundle 都得加上 AppendHashToAssetBundleName ,据说主要是用于解决缓存问题。 例如文档: 【重要】BuildAssetBundleOptions.AppendHashToAssetBundleName:bundle 带上 hash。在小游戏底层对 bundle 做缓存及缓存淘汰时,hash 是重要依据。 —— 这也导致了我们打包的一个问题,所有的 AssetBundle 打完之后,实际的名字都被改变了 (而且可以预期的是每次资源发生变化都会变): 如果依照正常的名字去...
21k 19 分钟

# 前言 匿名函数平时用得太常见了,平时都知道说用多了不好。 为什么不好?原因呢? 特别是涉及到造成 闭包 的匿名函数,其原理是什么?闭包 抓住 的的局部变量怎么处理的? 众所周知 匿名函数 其实是 C# 提供的一种 语法糖 ,最终还是会由编译器生成具体的函数。 不过之前一直没有深入去研究,这次带着这个疑问,我决定利用反编译的 IL 代码详细研究下,对比各种匿名函数写法,看看最后究竟生成了什么。 # 分类 C#...
9.1k 8 分钟

# 前言 这两天又研究了下协程,之前虽然用过,也稍微想过,但是并没有深入研究,这次就想把流程仔细走一遍。 # 原理 其实也是一个思维方式问题,协程的原理其实很简单:利用迭代器 # 迭代器 我们都知道,实现了 IEnumerable 接口、或者说拥有 IEnumerator GetEnumerator() 的类可以被 foreach 所迭代。 其重点就在于 IEnumerator 这个接口。 数组 、 List 、 字典 等数据结构,迭代时都是通过返回自己创建的一个实现了 IEnumerator 的 Warp 类进行。 为什么一个方法,标记返回 IEnumerator...