b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

存储块对象的Lua封装

电脑杂谈  发布时间:2020-08-23 08:02:52  来源:网络整理

系统封装工具_内存封装单面和双面_封装工具 内存

这种用法在C / C ++级别非常容易使用,但是对于lua绑定,这非常令人困扰. 因为很难安全封装.

如果将Memory封装到Lua用户数据中,但是在构造用户之后,由于各种原因(由于发生了错误,阻止了正常的执行流)而没有使用它,则无法消化(因为没有直接已发布的api). 如果用户构造了一个对象,但不能多次使用,也会在使用中造成麻烦.

内存的结构将有一个以上的内存副本,这也可能是浪费. bgfx提供了一种通过引用创建内存的方法,但是您必须自己保证数据的寿命. 这里有两个选项:

内存封装单面和双面_系统封装工具_封装工具 内存

确保引用的数据可以保留至少2帧. 提供回调以释放内存.

如果使用选项1,则需要临时引用我们自己传递给bgfx的所有lua内存对象,并每2帧取消引用一次;如果使用选项2,则需要考虑bgfx是一个多线程库,并且跨线程操作Lua的vm对象需要考虑线程安全性问题.

基于这些困难,当我第一次开始绑定bgfx时,我没有抽象内存对象,而是直接处理所有相关API中的输入参数. 根据参数表/字符串/用户数据,临时创建一个Memory对象,并将其传递给bgfx. 不要暴露细节.

内存封装单面和双面_封装工具 内存_系统封装工具

但是随着开发的不断深入,我们需要越来越多样化的数据构造方法,这使得维护一组API成为了负担. 一些复杂的构造方法(例如传递指针和偏移量等)具有太多参数,这使得相关api参数的复杂性无法接受. 因此,我决定在Lua级别上抽象内存对象,并一劳永逸地解决此问题.

首先讨论结果:

我向绑定库添加了一个名为bgfx.memory_buffer的新api. 有四种创建内存块的方法.

系统封装工具_内存封装单面和双面_封装工具 内存

使用描述数据布局的字符串和要创建的表数组. 布局字符串可以描述每个数据段的数据类型(不同字长的浮点/整数),并且表数组是每个字段的值. 使用字符串以及可选的起始位置和长度来创建不可写的存储块. 使用lightuserdata(指针)以及可选的长度和数据关联对象创建. 这里的数据关联对象是指让框架帮助您引用该对象,以防止指针引用的内存出现故障. 直接指定大小以创建可写存储块.

大多数过去的api仍然兼容,但是必须在这样的内存块对象而不是像过去的表中传递少量的api,例如bgfx.create_vertex_buffer. 有关特定用法的更改,请参阅示例.

我是如何实现的?

首先,这个Lua内存对象不是bgfx :: Memory的直接封装. 构造之后,它不是bgfx的Memory对象. 因此,即使您停用它,也可以安全地对其进行回收.

一旦被bgfx的api调用,它将临时以数据引用的形式创建一个Memory对象,并将其传递给bgfx. 并增加了内存引用. 如果bgfx不再使用它(它将在两帧内释放),则回调函数将减少此引用.

此对象的__gc方法检查引用计数. 只有当它为0时,它才会安全释放. 如果引用计数不为0,则该对象将存活一会儿.

如何使进入__gc方法的对象的寿命更长?我使用的方法是在__gc方法中临时创建一个用户数据,并将其自身安装在其uservalue上. 临时用户数据的__gc会再次检查引用计数,如果下次仍然无法达到0,则继续执行该过程.


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-305002-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...