Blend文件格式
文件结构的探讨
文件结构是理解Blend文件格式的关键,可通过参考相关资料进行深入学习。源码
文件头(FileHeader)是源码Blend文件的核心部分,编码为DNA1,源码由SDNA结构体实现。源码
SDNA包含四个重要属性:names、源码arraycopy 源码types、源码typessize、源码structures。源码依BlenderV版本为例,源码names长度为,源码types长度为,源码typessize长度与types一致,源码structures长度为个。源码
理论上,源码structures长度应为types长度减去原子类型个数,但实际为个,原因是手机app分发 源码部分DNA类型包含非DNA类型的字段,相关结构信息未保存在SDNA数据中。这些结构体的特征可参考source\blender\makesdna\DNA_ID.h中的类型IDOverrideLibraryRuntime定义。
所有前带有两个#字符的结构体未保存在SDNA数据中。四个属性长度的理论上限为(倒排索引使用的是ushort),实际上限为。因此,当前的存储容量足够使用。
Editor解析
使用Editor(V.0.1)对Blend文件进行解析,已提交模板文件至editor,预计不久即可完成解析。
模板文件
实现的模板文件内容包含对SDNA中第一个结构体Link的详细说明。
示意图使用draw.io绘制,以帮助理解。
DNA数据生成
makesdna工具用于生成DNA数据。
Blend信息获取
在浏览Blender网页时,发现JanWalter的个人网站,其Rust语言的c ascii转换源码blend_info库一直在更新,已能读取blend文件中的模型并自行渲染。如欲深入了解Blend文件格式,可阅读其博客或下载blend_info源码。
UE5在HoloLens上的DataDrivenPlatformInfo.ini文件源码解读分析
UE5项目中,配置文件扮演关键角色,定义引擎运行时行为、特性和平台特定设置。本文聚焦于HoloLens平台的DataDrivenPlatformInfo.ini文件,解析其功能与重要性。
DataDrivenPlatformInfo.ini作为数据驱动的平台信息配置文件,允许开发者定制优化不同硬件平台行为,无需修改引擎源代码。文件结构与代码逻辑如下:
1. [DataDrivenPlatformInfo]部分
2. 图标路径与SDK路径
3. 平台可用性与编译器设置
4. 平台组名
针对HoloLens平台,Shader平台配置部分至关重要,包括:
1. 语言与特性等级
2. 着色器格式与功能支持
3. 友好名称
DataDrivenPlatformInfo.ini的深入分析揭示,它是如何为UE5中的HoloLens平台提供灵活、细致的阿里的溯源码配置选项,减少源代码依赖,增强平台适应性,简化跨平台开发工作。通过数据驱动配置,实现高效、定制的平台优化与体验提升。
GDB中的‘info’命令:一次全面的探索
GDB,作为开源的GNU调试器,是程序员不可或缺的调试工具。它如同孟子的“得其环中,以应其外”,让我们能深入理解代码运行,找出隐藏的错误。其中,info命令扮演着关键角色,它能揭示程序的断点、局部变量和寄存器状态等,大道7线源码是调试过程中不可或缺的线索。
info命令的结构清晰,其基本语法让开发者能轻松获取所需信息。例如,通过info breakpoints,我们可以一目了然地查看所有设置的断点,这对于理解程序执行流程至关重要。同时,info locals命令则能实时显示当前函数的局部变量,帮助我们跟踪程序状态。
在实际应用中,info命令与其他命令如list和show形成对比。list命令用于查看源代码,而show则关注GDB自身的配置。通过这些命令,我们可以像庄子说的“工欲善其事,必先利其器”那样,有效利用GDB进行调试。
尽管info命令强大,但它也有局限性。复杂程序可能需要更深入的分析,而不仅仅是依赖info命令。正如《思考的乐趣》所说,理解并非只停留在表面,需要深入挖掘和实践。因此,推荐进一步学习GDB和info命令的资源,以提升调试效率。
总的来说,info命令是GDB中的一把金钥匙,它帮助我们窥探程序的内部世界,是提升编程技能和解决问题的重要工具。正如《编程的艺术》所言,了解和掌握这些工具是提升编程效率的关键。
[UVM源代码研究] 如何定制一款个性化的打印格式
使用默认的打印格式时,执行如下代码:
实际打印结果格式如下:
查看UVM源代码,我们首先定位`uvm_info宏定义的位置:
这段代码对uvm_info/uvm_warning/uvm_error/uvm_fatal等宏进行了描述,实际上是对uvm_report_*函数的封装。以`uvm_info为例,分析其执行过程,其中使用了全局函数uvm_report_enabled。
这里又调用了uvm_root中定义的uvm_report_enabled函数。需要注意的是,在uvm_root中并未找到这个函数的定义。经过查找源代码,发现uvm_report_object中定义了uvm_report_enabled。
为什么要通过uvm_root实例调用这个函数呢?这需要了解uvm类库的继承关系。通过分析,我们发现通过调用uvm_root中uvm_report_enabled的函数,是因为uvm_root支持单例模式,可以获取uvm_root的单例句柄执行uvm_report_object中定义的自动继承的函数,避免了创建额外的实例。
接下来分析函数执行过程,原本简单的获取severity对应的verbosity阈值设置,却涉及了severity的override问题。我们可以通过调用函数或运行时传入参数来对severity进行override。
所有severity的override都记录在uvm_pool键值对severity_id_verbosities中。
severity和verbosity枚举类型定义如下:
回到uvm_report_object中行的代码,可以认为调用`uvm宏传入的verbosity值如果大于设置的verbosity阈值,则uvm_report_enabled返回0。另外行还有一种函数返回0的情况。
关于uvm_action和verbosity的设置类似,不再展开。执行`uvm_info系列宏时,不仅需要考虑severity对应的verbosity_level的设置是否大于阈值,还需要考虑对severity设置的行为是否为UVM_NO_ACTION来判断uvm_report_enabled的返回值。
本质上,执行的是uvm_report_server中的compose_message函数,该函数规定了uvm_info系列宏的打印格式。
这个函数的参数filename和line是我们调用uvm_report_info传入的`uvm_file和`uvm_line。
`__FILE__和`__LINE__是systemverilog的编译指令,在编译阶段被替换:`__FILE__被替换为当前文件的文件名,以字符串形式存在;`__LINE__被替换为当前文件的行号,以十进制数字形式存在。
如果需要定义个性化的打印格式,可以通过从uvm_report_server继承一个类重写compose_message函数实现。需要注意的是,这里不能用set_type_override_by_type/name,因为uvm_report_server类没有使用uvm_object_utils注册,也没有实现get_type()函数,所以不能用传统的factory的override方法进行override。好在uvm_report_server已经预留好了子类server的覆盖函数set_server。
这个静态函数可以直接使用类uvm_report_server进行调用。接下来,我们通过一个例子来看看如何实现个性化打印的定制。
首先,我们定制自己的report_server:
然后,在base_test中实例化并set_server:
现在,我们来看看最初那句打印的执行情况:
通过以上步骤,我们便实现了个性化的打印定制,该定制对4种severity同时生效。
2024-11-19 08:03
2024-11-19 07:32
2024-11-19 07:30
2024-11-19 06:41
2024-11-19 06:40