持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 1 天,点击查看活动详情
这是一个关于 Blender 的过去和未来的有趣的展望: 在 IRC 上的一段讨论摘录中,Ton Roosendaal 解释了 Blender 现有的 DNA 和 即将到来的 RNA 结构。
DNA 提供了一个经常被忽视的 Blender 特性 —— 惊人的向后兼容性。
感谢 DNA,你可以读回版本 1.00 的 Blender 文件 !
Ton 写道
问: DNA 和 RNA 实际上代表什么吗?
它们与生物学意义类似。Blender 的 DNA 结构和 Blender 一样历史悠久,它是 一个长长的字符串,包含 Blender 数据的整个内部结构的编码类型,保存在每个 .blend 和每个 Blender 二进制文件中 (即维护了 Blender 状态的底层记录)。有了这个 DNA ,它可以读取较旧甚至较新的文件。Blender 甚至可以 “意识到” 它自己的数据类型,例如,你可以给它一个指针,Blender 可以在其中找到名为 “vertex” 的项。这使得 .blend 文件仍然可读,即使保存在版本 1.00 中(试试这个例子 )。
问: …… 和 RNA 呢?
这是一个 Blender 2.50 的特性,一个将 DNA 包装到一个很好的 API 中来读取/设置 Blender 数据和属性的系统。实际上它的意思是 “信使 DNA”,这并 不完全正确,因为 RNA 在细胞中制造 DNA。
我们的 RNA 可以自动生成一个 Python 数据访问 API,并将允许 “一切都可动画化” 的特性,以及自动按钮列表视图数据,甚至它将在未来处理依赖关系。
但是许多富有经验的工程师讨厌这种 DNA,这就是为什么过去所有的 谣言 都说要用 XML 取代它。:) 仍然有人认为 XML 更好…… 有趣的是,对于所有的内部开发,谷歌以实现类似的 DNA 系统替换了 XML ! 虽然降低了文件的可读性,但拥有同样的灵活性,以及更高的速度。Blender 是第一个这样做的公共应用程序。
stackoverflow 上的高赞回答
DNA 和 RNA 是 Blender 开发人员和社区使用的术语,用来指代他们序列化 Blender 状态数据的系统,这个系统和 Blender 本身一样古老。每个 .blend 文件都包含一个 DNA 结构,其中详细描述了几乎所有关于 blend 的细节,以及最后所使用 Blender 的版本和精确副本。这使得 Blender 文件 高度向后兼容,因为它们允许任何未来版本的 Blender 以旧版本处理旧文件的相同方式来配置自己,并以一种非常规范化的方式消化文件,可以在 不更改文件结构的情况下进行版本到版本的扩展 。
RNA 是一个较新的概念; 可以把它看作 DNA 的 DTO (Data Transfer Object)。它允许 DNA 片段和子树在 Blender 内部以及在 Blender 和它的插件 之间传递(这些的主要语言是 Python),并且是实现这一功能的主要方式。
DNA / RNA 源码中的注释
DNA_documentation.h
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2001-2002 NaN Holding BV. All rights reserved. */
/** \file
* \ingroup DNA
* \page makesdna makesdna
*
* \section aboutdna About the DNA module
*
* The DNA module holds all type definitions that are serialized in a
* blender file. There is an executable that scans all files, looking
* for struct-s to serialize (hence sdna: Struct \ref DNA). From this
* information, it builds a file with numbers that encode the format,
* the names of variables, and the place to look for them.
...
*/
翻译过来就是:
DNA 模块 保存了在 blender 文件中被序列化的所有类型定义。有一个可执行文件会扫描所有文件,查找要序列化的结构体(即是 sdna: Struct DNA)。根据这些信息,它会构建一个包含 编码格式、变量名 和 何处寻找它们 的带有数字的文件。
RNA_documentation.h
/* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup RNA
* \page makesrna makesrna
* \section aboutmakesrna About RNA
* The \ref RNA module defines and provides the access API to the data,
* thus encapsulating \ref DNA
*/
翻译过来就是:
RNA 模块 定义并提供访问数据的 API,从而封装了 DNA