jiangzhhhh / Unity-MultiProcess-BuildPipeline

multiprocess buildpipeline for unity
MIT License
165 stars 36 forks source link

关于权重问题 #1

Closed SixGodZhang closed 6 years ago

SixGodZhang commented 6 years ago

我在项目源码中,看见楼主合并group的时候直接进行暴力合并的,并未根据之前设置的权重weight进行划分,代码如下: ` while (groups.Count > nJobs) { List sortedGroups = new List(groups); sortedGroups.Sort((a, b) => { return a.Weight.CompareTo(b.Weight); });

            var g1 = sortedGroups[0];
            var g2 = sortedGroups[1];
            g1.UnionWith(g2);
            groups.Remove(g2);
        }`

请问这样合并任务,怎么去确保我每个Unity分的的量级大约是一致的呢? ps:非常感谢楼主提供的这种多进程打包的解决方案

jiangzhhhh commented 6 years ago

每组任务组的总权重由包含的全部BundleNode的权重值累加得出。 而BundleNode的权重是在BundleNode.AddWeight里通过WeightTable.GetWeight方法从预设权重表中查到相应权重叠加的。

任务组列表排序时,任务组的Weight属性就已经是该任务组的总权重了。

SixGodZhang commented 6 years ago

非常感谢解答. 可能是我没有表述清楚,其实我的意思是: 任务组权重的目的是为了保证每个Unity的的负载是差不多的,打个比方 我们有7个任务组,A(20)、B(40)、C(50)、D(10)、E(10)、F(20)、G(20),我们要将这七个任务组分给四个子进程,就是说我们需要合并一些任务组,在这个合并过程中我们可以根据权重适当地给每个Unity子进程差不多负载的任务,这些,打包效率会不会高一些,而不会出现有些Unity子进程分得的任务少很快就结束了,都在等另外一个负载极重的Unity子进程.

jiangzhhhh commented 6 years ago

你描述思路是正确的,而且当前版本的代码里已经是这么实现的了。

sortedGroups.Sort((a, b) => { return a.Weight.CompareTo(b.Weight); }); 合并过程中的这句排序,就是将任务组根据权重从小到大排序,优先合并权重最低的两组任务组,达到负载均衡的目的。

SixGodZhang commented 6 years ago

这样确实也可以的,我以为你会用动态规划来处理这个合并的问题