游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3299|回复: 5

对于纹理池,有什么好的设计思路?

[复制链接]

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
发表于 2011-5-2 21:42:00 | 显示全部楼层 |阅读模式
我目前的做法:
1:准备10种尺寸的纹理(最小是32×32,最大则是1024×1024)
2:游戏每次获取一个纹理时,纹理池先去检查是否有闲置的纹理,有的话直接返回,没有的话立即补充,即创建一定数量的纹理,并返回1个给获取者.
3:未经使用的纹理和通过外界销毁的纹理都将被标记为闲置状态,不过每一次收到销毁纹理事件的时候,会查看当前纹理池是否已经有大量的闲置纹理,有的话就释放一定数量的纹理,否则仅仅标记为闲置..

有些感觉不太好。...
一来是纹理尺寸的范围被些死了,二来会产生浪费,比如522×522的纹理会占用1024×1024的存储空间...

1

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2011-5-2 22:15:00 | 显示全部楼层

Re:对于纹理池,有什么好的设计思路???

这里用池有什么优势?
就我自己写程序总结的过程来看。一般只有小物件大量使用的情况下,采用池策略比较有效率。
如果非要再程序段解决纹理2次幂限制的话,我的做法是写个简单的插值函数,把纹理取值到2次幂再作mipmap。

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
 楼主| 发表于 2011-5-2 22:31:00 | 显示全部楼层

Re: Re:对于纹理池,有什么好的设计思路???

??b我心: Re:对于纹理池,有什么好的设计思路???

这里用池有什么优势?
就我自己写程序总结的过程来看。一般只有小物件大量使用的情况下,采用池策略比较有...


我是解决纹理的频繁创建而产生内存碎片问题.
比如2D游戏的战斗画面,假如有20个人,不可能把这20个人所有的动画全部加载进来,那内存空间恐怕1G也不够..那就得动态创建,而频繁的创建纹理必然会导致内存的频繁分配,如果预先就分配好纹理对象,就可以改善内存存储状况...

2

主题

429

帖子

435

积分

中级会员

Rank: 3Rank: 3

积分
435
发表于 2011-5-2 23:09:00 | 显示全部楼层

Re: Re: Re:对于纹理池,有什么好的设计思路???

我是解决纹理的频繁创建而产生内存碎片问题.
比如2D游戏的战斗画面,假如有20个人,不可能把这20个人所有的动画全部加载进来,那内存空间恐怕1G也不够..那就得动态创建,而频繁的创建纹理必然会导致内存的频繁分配,如果预先就分配好纹理对象,就可以改善内存存储状况...


自己加个内存分配管理的中间层,然后根据你的需求写个合适的分配算法,这样不仅能直接解决尺寸问题,也能统一用于你游戏中的其他动态对象。治标也治本。

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
 楼主| 发表于 2011-5-2 23:54:00 | 显示全部楼层

Re: Re: Re: Re:对于纹理池,有什么好的设计思路???

Enigmaya: Re: Re: Re:对于纹理池,有什么好的设计思路???



自己加个内存分配管理的中间层,然后根据你的需求写个合适的分配算法,这样不仅能直接解决尺寸问题,也能统一用于你游戏中的其他动态对象。治标也治本。


现在跟图片尺寸没有关系,我现在的问题是我无法分配由IDirect3DDevice9::CreateTexture()创建的纹理空间..

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2011-5-3 20:06:00 | 显示全部楼层

Re:对于纹理池,有什么好的设计思路???

从surface上lock到指针后,这块内存还不是随便你怎么搞

使用等大纹理池
设计一个纹理的装箱拆箱算法,根据需要把你的需要的纹理数据写到池里的纹理中去
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-8 05:31

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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