c#对象管理

June 17, 2021 · View on GitHub

[TOC]

c#对象管理

原方案是用一个dictionary, 存储object对应的userdata, 维护一个1v1的关系. 每当有已存在object需要传给lua的时候, 就从dictinary里面找到对应的userdata. lua那边gc的时候, 如果没有引用了, 则从dictionary里面把对应的项删除. 总体而言挺不错的, 安全有效, 这块的最主要的需求是安全, 没有泄露.

这个方案里面, 对1v1的关系比较重视, 即一个.net的object对象, 每次传递给lua的时候, 都是同一份userdata. 这样的好处是很多的, 首先就是节省了很多临时对象.

修改方案

对原方案做了一些修改, 主要是想简化一下实现复杂度, 减少维护成本.

尝试改成FreeList来实现存储, 也就是说, 打算不维护1v1的映射关系, 即一个.net的object对象, 传给lua多次的话, 会产生多个userdata. 之所以想这么改, 首先是lua加了分代GC, 对于短周期的对象的释放, 有了很大的提升; 其次, 还是希望c#和lua的交互少一些, 减少频繁的跨语言调用, 尽量在lua层完成大部分的业务, 把c#层当做一个底层引擎. 好处么就是FreeList更加高效一些, 存储的内存开销和查找时间都很优秀.