0%

可编辑模型实现写时复制

什么是写时复制?

直接复制这篇文章里的解释:“ 写入时复制(英语:Copy-on-write,简称COW)是一种计算机 [程序设计]领域的优化策略。其核心思想是,如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。
大概就是说:如果有多个相关的操作依赖同一个资源,如果其中一个需要修改,就在有修改时创建新的“存档”,其他的还是引用之前的“存档“。

为什么可编辑模型要实现写时复制?

这要从一个bug说起:可编辑模型保存为预设,如果场景中的模型修改参数,该修改也会影响预设的参数。 在修改场景中的模型时,因为场景中的物体和预设引用了同一个本地资源文件,,在创建预设时反序列化时解析文件时生成的模型相同。

开始修bug。我首先在项目里发现了一个类似的资源,材质,都依赖本地文件。在用户确认修改场景中或者预设的材质后就会新建了一个文件。在没想起COW时,这对我来说就是一个很大的启发:创建新文件不就行了吗?

何时创建新文件呢?因为可编辑模型在调整模型形状时没有确定按钮,何时创建本地文件的问题也困扰了我。最暴力的方式是每次变化就创建,但这样会创建许多没有用的文件,非常浪费。其实只需要每个模型对应的本地文件不同就行了。只需要一个判断标志,在第一次修改参数时创建一个新的本地文件,修改标志位。这样一个场景中的文件被报保存为预设或者预设在修改参数时,新旧物体之间会断开连接。