游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2897|回复: 10

关于对象的内存管理,有没有好的思路?有请高手指路...

[复制链接]

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2007-4-23 16:09:00 | 显示全部楼层 |阅读模式
我想场景管理和内存管理应该是配合使用的,场景里面的对象不能全部加载到内存里面,加载一部分,有的时候需要释放一部分,我想把这些都交给一个容器去管理,我的想法是这个容器采用一颗B树来组织,每个节点掌管其下所有节点节点的生命周期,用一个垃圾回收线程在后台间隔一定的时间扫描一次,(扫描一次,所有结点的生命减少一定的时间)如果某节点的生命到头了,就释放自身和其下的所有节点的指针引用

关于生命问题
策略1:我想可以采用时间做触发提交,也就是线程扫描,一定时间内自动释放
策略2:不采用时间触发把maxlifetime设置为-1表示永久存在,只能手工的方式释放该对象


我是最近做场景管理,想到内存也需要管理,请高手前辈们给些思路吧。
不知道,这种组织方式是否可行,采用树,效率可行否?

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2007-4-23 22:49:00 | 显示全部楼层

Re: 关于对象的内存管理,有没有好的思路?有请高手指路...

我的问题是不是不清晰,怎么没人回答呢?

14

主题

245

帖子

256

积分

中级会员

Rank: 3Rank: 3

积分
256
QQ
发表于 2007-4-24 00:49:00 | 显示全部楼层

Re:关于对象的内存管理,有没有好的思路?有请高手指路...

如果你真的觉得场景的数据大得程序无法流畅运行了,再考虑怎么去做数据优化比较好。
如果数据不是很大,在系统可承受范围内,你最好别频繁的去申请释放资源。一来会影响效率(做场景管理的目的就是为了提升FPS),二来会产生内存碎片。

如果不是,先尝试一些通用的优化方法,如果这些都解决不了问题。再考虑这个问题比较好。毕竟一个场景在动态加载数据或是释放数据不是一个明智的方法。

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2007-4-24 11:10:00 | 显示全部楼层

Re:关于对象的内存管理,有没有好的思路?有请高手指路...

搂住的动态资源管理的想法是正确的,但是场景管理和内存管理不在同一层次上,所以不能混谈。动态资源管理也是目前比较先进的技术,unreal3 和 crysis 等一些商业游戏引擎都有自己的动态资源管理系统。

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2007-4-24 13:02:00 | 显示全部楼层

Re:关于对象的内存管理,有没有好的思路?有请高手指路...

那么场景对象有没有容器的概念?如何组织,我刚搞完LOD,效率也达标了,可优化的地方还是有

下个阶段就是场景的碰撞检测,这肯定要组织场景对象的依附关系。不可能用摄像机与场景所有对象都去判定的

对于这些有没有什么高见?

10

主题

219

帖子

236

积分

中级会员

Rank: 3Rank: 3

积分
236
QQ
发表于 2007-4-24 14:11:00 | 显示全部楼层

Re: Re:关于对象的内存管理,有没有好的思路?有请高手指

congy: Re:关于对象的内存管理,有没有好的思路?有请高手指路...

搂住的动态资源管理的想法是正确的,但是场景管理和内存管理不在同一层次上,所以不能混谈。动态资源管理也...


正理,资源动态加载属于场景管理方面,和内存管理是两个不相干的概念

举例为,无缝大地图需要我们动态加卸载地形块,这属于场景管理
纹理对象管理你可以用引用技术,对象池等方法来管理,这和场景管理不是一个概念

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2007-4-24 17:25:00 | 显示全部楼层

Re:关于对象的内存管理,有没有好的思路?有请高手指路...

我并不是说一定要把内存管理和场景两者生硬的联系在一起,只是想组织对象的关系。
比如一个游戏世界有N个场景,A场景包含一个房屋,房屋里面包含桌子,桌子上面有个苹果。
我释放A场景,那么A场景以及A场景里面的一切包括屋子,桌子,苹果都被释放了。
我要查找苹果,就很容易知道苹果在什么位置,是在桌子上还是在地上,或是树上?什么样的场景里包含苹果?

只是这样简单的一个思路,静态资源,比如贴图,x模型都是经常加载的,是共享的,我放到静态资源组里面,游戏结束才释放,  其实思路是把游戏里面一切的OBject都挂在一颗资源树, 这颗树能更好的 为场景管理服务

是基于这样的想法,并不是 粗浅的认为 内存管理=场景管理 ,只是希望内存对象树为场景服务

世界是由对象构成的,看过黑客帝国的朋友应该知道这一点
世界里的一切的东西都有它的母体,游戏也不例外啊

12

主题

217

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
发表于 2007-4-25 00:16:00 | 显示全部楼层

Re:关于对象的内存管理,有没有好的思路?有请高手指路...

?鼍安积?大的? 用?表都可以了
?⒚看巫x取到的?ο筇崛〉芥?表? 汰?Q?表尾 是一种很方便的LRU

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2007-4-25 08:22:00 | 显示全部楼层

Re:关于对象的内存管理,有没有好的思路?有请高手指路...

楼主直接按自己想法做基本上就是正确的了,但建议不要在内存废弃的时候立即释放它(尽管用的是线程,只要标记一下块已经废弃,并放入到free list里,在下次分配内存的时候直接从free list里取内存就OK)…
对象池技术对节点来说是可以使用的,对于更广泛的内存资源管理则不凑效。
如果使用的是弱引用,可以在收集的同时整理成紧凑的内存块,这样也可以避免内存碎片。

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2007-4-25 10:36:00 | 显示全部楼层

Re: Re:关于对象的内存管理,有没有好的思路?有请高手指

tonykee: Re:关于对象的内存管理,有没有好的思路?有请高手指路...

那么场景对象有没有容器的概念?如何组织,我刚搞完LOD,效率也达标了,可优化的地方还是有

下个阶段就是...

常见的场景管理数据结构都是树,BSP\QuadTree\OctTree,树型结构也是最适合描述场景物体之间的关系的。更高层次的管理就是场景图,图比树更加灵活,可以在图中某个节点下包含整个的树型结构。一般来说 3D 游戏引擎中都存在场景图系统,各个场景管理的树型结构挂在图中。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 16:59

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表