allegro设置内存分配器的一个坑

文章详细记录了解决Allegro内存分配器与第三方内存分配器Nedmalloc在游戏开发中冲突的过程,包括初始化、内存管理与清理的正确步骤。通过深入分析,最终找到问题根源并提供解决方案。

        看过《游戏引擎架构》后我开始对内存的分配问题关注,一直想用内存分配器来管理游戏的内存。前两天发现了有许多第三方内存分配器可以用。最后挑中了nedmalloc,这个库也是ogre所使用的,测试了一下,确实比VS的malloc/free要快不少。

    通过写几个简单的函数就可以代替allegro内存分配器,十分方便,又顺便给box2d也换了。

        allegro通过调用al_set_memory_interface()来替换内存分配器。然后我把这个函数放到了al_init()后面。一运行,发现很正常,不错。点击窗口的关闭按钮,然后报错了!我就猜想是不是放的位置不对。在设置分配器之前调用了al_init(),那就说明allegro初始化的时候申请的内存用的分配器还是默认的分配器,关闭的时候卸载这些初始化的数据缺用的是nedmalloc的free,这样肯定就报错了。于是我把al_set_memory_interface()放到了al_init()之前。再运行,关闭。完全正常!到这里我以为事情就结束了。

        后来在写了若干代码之后发现上面那个关闭时报错的问题又出现了!于是开始找问题,注释了几乎所有代码,问题依旧。最后又单步调试,发现报错是在main()返回之后出现的,才意识到,这个问题出现在静态变量上,接着单步调试,发现问题出在一个String类的身上。这个类封装了allegro的字符串操作函数。(这个类所属的库用c++11封装了allegro所有的对象及其操作,官方也推荐过链接

        这时突然才想起来我在一个cpp文件里定义了一个文件内的局部变量,类型正是这个String。这是个静态变量,也就是说它初始化的时候main还没调用,卸载的时候也在main()返回之后了。在我这个程序里就是用默认的malloc  new的它,但最后却用nedfree delete的它,这就出问题了。为了解决这个问题,我在main()返回之前再一次调用al_set_memory_interface()。然后运行,又报错!这次是al_uninstall_system()出错了。

        我意识到,这是allegro的初始化和卸载的配对出了问题。我原来一直没有用过al_uninstall_system()这个函数,因为原来查资料说是allegro会自动调用这个函数。之后就是查手册,看源码,终于搞懂了。al_init()其实是个宏,用来代替al_install_system(),用al_init()的话会把al_uninstall_system()注册为main()结束后调用的函数(atexit)。所以就不能再用al_init()来初始化了,然后再手动uninstall。

        整理一下思路:就是在al_install_system()设置内存分配器,在al_uninstall_system()后设置回默认的分配器。

下面是代码:

int main()
{
	al_set_nedmalloc_memory_interface();
	if (!al_install_system(ALLEGRO_VERSION_INT, 0))
	{
		return 1;
	}

	...

	al_uninstall_system();
	al_set_memory_interface(0);
	return 0;
}

        以后要用哪个函数的时候,最好还是先看下它的说明。在这个问题之前我都不知道al_install_system()的存在。


### 在Allegro 17.2中设置Part关联多个Footprint的方法 在Allegro PCB Designer中,可以通过特定的设置使一个Part(元件)关联到多个Footprint(封装)。以下是实现这一功能的具体说明: #### 1. 使用Library Manager进行多Footprint关联 在Allegro Library Manager中,可以为一个Part定义多个Footprint选项。具体操作如下: - 打开Library Manager工具。 - 选择需要编辑的Part,并进入其属性编辑界面。 - 在“Footprint”或“Package”字段中,可以输入多个Footprint名称,使用逗号分隔[^2]。 - 确保所有指定的Footprint已经在对应的Library中正确定义。 #### 2. 利用Design Entry HDL中的替代功能 在OrCAD Capture CIS或Design Entry HDL中,可以为同一个元件定义多个替代项(Alternate Choices)。这些替代项可以包含不同的Footprint: - 在元件属性对话框中,添加多个替代项。 - 每个替代项都可以指定不同的Footprint[^3]。 - 当设计被导入到Allegro时,系统会保留这些替代选项供用户选择。 #### 3. 在PCB Editor中手动切换Footprint 如果在设计过程中需要更改某个Part的Footprint,可以在Allegro PCB Editor中手动完成: - 右键点击目标元件并选择“Change Footprint”。 - 在弹出的对话框中,从可用的Footprint列表中选择合适的选项[^4]。 #### 示例代码:批量修改脚本 以下是一个简单的TCL脚本示例,用于批量更新元件的Footprint: ```tcl # 定义要修改的元件和对应的Footprint列表 set part_list { {R1 {RES0402 RES0603}} {C1 {CAP0402 CAP0603}} } # 遍历每个元件并设置Footprint foreach part $part_list { set name [lindex $part 0] set footprints [lindex $part 1] foreach footprint $footprints { catch {exec "change_footprint $name $footprint"} } } ``` #### 注意事项 - 确保所有Footprint已经正确导入到Allegro的Library中。 - 如果需要在设计中动态切换Footprint,建议使用替代项功能以保持设计一致性[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值