作者ddavid (谎言接线生)
看板GameDesign
标题Re: [请益] 请问如何共用图片或动画
时间Mon Sep 22 18:01:06 2008
※ 引述《jijuan (鸡卷)》之铭言:
: 假设我有A B C三个物件
: 它们都会用到同一张(同一组)图片(动画)
: 假设物件的建构式必须传入图片(动画)
: Img A = new Img("D://test.gif");
: Img B = new Img("D://test.gif");
: Img C = new Img("D://test.gif");
: 类似这样 因为A一开始已经载入test.gif这张图了
: 有没有办法B跟C使用跟A同一份就好了
: 而不用多载两次到记忆体里面
本来如果单单修改你这个架构,最简单就是你多做一个建构式,如:
Img A = new Img("D://test.gif");
Img B = new Img(A); // 直接去A里面挖指标设给B
但这样会发生依赖性的问题,A被delete掉时解构式要不要把那图清掉呢?清的
话B再去用原本的指标就烂掉了,可是不清的话A跟B都清掉後没人去清,你也没任何
办法去追踪谁是最後一个该清的。
比较好的方法可能都是要更动架构,比如你要另外维护一个ImgPool,它里面只
存了一张接一张会用到的图,并给每一张图一个Unique的id。而Img物件本身不提供
存图的空间,它只拿着它需要图的id,在需要时持id去跟ImgPool讨指标来处理自己
的行为。
○ImgPool
[基本功能]
1.可以读入一张图进Pool里并给予Unique id(可由使用者指定,只要保持Unique)
2.可以清掉Pool里的一张图
3.可以让其它(特定)物件用id取得图的内容,id若不存在就传回NULL
[进阶功能]
1.可以记录每张图被使用的时间点或使用频率等等资讯,并可以设定Pool的大小,若
发现Pool满又读入图时自动以某些规则(最久远、使用频率、特殊设定)挑选可以
被清掉的图先清掉
2.可以给予一个并未真正读入的图id,当其它物件要求的id存在但并未读入时就主动
去读进来
这样你要让A跟B用同一张图,只要给他们拿一样的id就好了。而不用的时候你把
A跟B砍光光也不会发生Memory Leak,因为真正管图的是ImgPool,只要ImgPool被砍
时会去清光所有它管的图就好了。
利用这种模式除了管理以外,还有一些灵活的好处。比如说你可以直观用改Img
中持有的id让它去取到ImgPool的另一张图,但其实你也可以让ImgPool用某一个id在
不同情况下去读不同的图。前者用在切换快速且频繁,所以你预先把每张图都先读进
Pool以空间换时间减少读取的情况,後者则可以用在切换一次後不会很快又再切换,
因此每次都只读眼前要用的这张图以精简id对应的情况。
--
「如果你还知道墙壁或地板是硬的,就不该老是去用头撞啊!」
「你在说什麽,为什麽我会没事去用头撞墙撞地板啊!」
「不然,还有什麽理由能解释你怎麽这麽笨啊!」
--兰娜.席斯塔
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.167.9.1
1F:推 Transformers:支持! 09/22 20:15
2F:推 DreamYeh:写真好:> M了 09/22 20:43
3F:推 doomleika:推 09/22 21:27
4F:推 LinaInverse:观念清楚 09/22 23:57
5F:推 jijuan:感谢 ddavid 详细的解说 09/23 09:58
6F:推 etrexetrex:推 09/24 19:21
7F:推 hhmmjj:赞~感谢 09/24 19:57