排料问题

把一大堆动画序列或场景图层图片放到n张1024*1024或1024*512或512*10l4中去的空图片中去,要求省料的排法
其目的是:1.节约内存空间,2.减少纹理渲染的次数,可以参看TexturePacker的介绍
 
 
要做两种方案
一种是图片不可旋转的方案
另一种是图片可以90度旋转的方案,例如
 
 
我在项目中的实际应用,测试的效果:
 

矩形排料

矩形排料问题可以用与或树来描述,排料问题其实就是个二叉树搜索的问题,找到一棵面积比率最大的树
下图是列举某一步会出现的全部可能性
 
可能性太多,所以遍历全部排列组合是不可能的。
动态规划用的是启发式算法,启发值设置是个关键点。启发值可以是当前一轮最好的元素优先,也可以是接近最好元素长度、宽度或长宽比例的优先。到底哪个最好,就要实际去测试了。
 
我举个例子,比如有A、B、C、D、E,一共5张图片,每张图都有一个分数,开始都是10分,这个分数叫“信息素”
第一轮排料,我们随机抽取图片并填满画布,一共放三次(可以想像成三只蚂蚁)
第一次放满(蚂蚁1):A、B、C,剩余300像素
第二次放满(蚂蚁2):C、D、E,剩余100像素
第三次放满(蚂蚁3):A、E,剩余200像素
 
分析第一轮的结果,蚂蚁2的排法是最好的(叫最优蚂蚁),那么我们给它排的C、D、E这三张图片都奖励5分(局部更新),这时的分数如下:
A=10分、B=10分、C=15分、D=15分、E=15分
 
到了第二轮,要先把每张图片的分数减2(全局更新),象征着信息素的挥发(这和人的记忆遗忘是一个道理),好处是避免陷入局部最优解:
A=8分、B=8分、C=13分、D=13分、E=13分
 
然后第二轮的随机,就要参考这些分数了。分多的,被抽中的概率自然就高,和轮盘赌是一个道理。
之后的每一轮都这样处理,直到最后的剩余像素收敛到一个很小的值为止。
 
从蚁群算法的描述上看,其实也是按照某种优胜劣汰的原则来做随机选择的。
 
 
遗传算法的整体思路也是差不多,也是要分很多轮(很多代),每一轮也要用轮盘赌的选择法(优胜劣汰)。只是中间的细节有所不同。

其它算法

如果图片太多,又很零碎,而画布很大,要求以很快的速度排完,不必太过省料,那么动态规划就不适合了。
可这往往是实际的需求,所以还有一些其它的算法也很实用,最常用的是MaxRects(最大矩形)算法。
 
这是最简单的:书架排法 - 按图片高度从左到右依次排下去。如果你的图片都差不多高,这种排法可能是最好的。
 
切纸机排法 - 分横竖两种选择,在这两种选择中选一个最合适的
 
 
最大矩形 - 在所有形成的最大矩形中找一个最合适的
 

转载于:https://www.cnblogs.com/whee/p/8029498.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值