请问官方为什么db://internal 不放到internal 内置Bundle里?

某个自定义Bundle 叫p1, 用到了一个db://internal/image/default_sprite_splash.png 内置资源,如果p1优先级大于8 那么 default_sprite_splash.png 会被打入p1里,导致项目启动时 默认就去加载p1要 就出错了, 根本就没有逻辑机会做处理,
本来p1里都是自己的资源 结果还混入了工具的某些内置资源 ,导致内置main Bundle启动的时候要去先找p1了 必须,我哪有机会去下载p1啊?
你们不觉得这个设计是个问题吗 现在根本没法把独立的动画和资源打成高优先级的Bundle 大于8就出错 ,
db://internal 不放到内置的internal Bundle里 我就想知道 这是为什么?

文档里写了呀,而且 internal 的优先级是 11,怎么会大于 8 就出错?
image

版本2411
resources的等级是8, 如果p1等级是9 p1里有用到default_sprite_splash.png,你认为 COCOS在启动的时候 main Bundle 会关联到p1吗?
如果main Bundle 会关联到了p1,那么就会导致COCOS没法启动,因为这时候 还没机会下载p1都,
所以 你试试先,看看main Bundle的 deps里是否有p1?

因为p1的优先级更高,所以资源在p1里,如果你要在main中使用,你应该先加载p1,当你决定p1都大于内置的时候,你应该在main加载前加载p1,怎么在main之前加载呢?论坛有方案
https://forum.cocos.org/t/topic/153364

另外,当你准备这么干的时候,建议main就不要过多引用~
当然,更加建议按官方的建议,不要大于内置的bundle

官方 给个回复啊 ?
是我使用方式有问题导致的? 还是你们设计有问题就? 还是你们实现有BUG?
总之给个结论的,
不用我给你们例子吧 你自己操作一下 5分钟都用不了?
给你们几个截图 打包成小游戏,p1里有个test1动画 里面只有一个内置图片资源,你看最后main里面 是否关联了p1
图片 图片 图片

不会啊,p1 关 main 什么事?main 为什么要依赖 p1?

内置资源是在 internal,跟 main 无关

如果main中也引用了p1中的资源就会啊 ,按他的描述,大概率就是p1引用了internal的default-sprite-frame,main中也引用了,所有造成加载main前要加载p1

但结果就是会啊 所以问题就在这里,你做个测试先 很简单 不行我在发个包给你,
图片
看到这个截图了吗 这个就是构建后 main 包里 config.json的内容
你看到"deps":[“p1”,“internal”] 了吗 说明main 关联了p1
所以 你认为该如何?

main 依赖 p1 是有可能的,不过应该跟 internal 无关吧,可能是其它资源导致的,比如 start scene 用到了 p1 里面的 prefab。
这种情况下很简单,p1 优先级不要设大于 7 就好了。

p1 允许优先级设大于 7 主要是为了解决一些特殊场景下的需求,这块是很早的设定了,不要这么用不就好了?

其实你如果自信看引擎中internal 你会发现只用 internal/resources 是 Bundle internal, 其他的还是需要根据引用情况 打到不同的 Bundle 中。
这么做也很合理啊,有很多东西根本不需要打到 internal 中。

你把自定义的Bundle 的优先级搞这么高是有啥特殊目的吗?可以改一下啊,再加载main把自定义的 Bundle 加载了

首先说没有 start scene,然后我告诉你这个包的结构 很简单也
没有任何第三方的资源 都是你们内部的资源,图片 看到test1 test2 test3吗 这3个动画结构都是一样的只是名字不同 里面都只有一个图片default_sprite_splash.png,
然后 test1放p1里 test2放resource里 test3放main里,p1优先级是9图片 ,结果打包就是你看到的main 要关联 p1,你能说这没错误?
首先 p1目的很明确 就是 p1只放internal的东西 和自己方通用的资源 p1的级别最高 但一定会小于11大于等于9 这样好让resource 里的动态加载的动画被共享的资源都被打包进p1,因为我会提前加载 p1 让其他包共享到, p1里的资源都是动态加载的, 不会启动main的时候被引用到 我会自己控制的 ,
但结果你看到了 我都还没放自己的资源呢 都是你们内部的资源 这样都出错了
你不要说 不应该这样用 你如果工具有错误 你应该去查这个错误 不应该说我不要这样用,我用法没问题 很合理,问题就是每个包都只用到了internal的资源 却相互被关联到了 这就是错误了 你如果保证把db://internal 都放到internal Bundle里 那我的用法就不会报错了 你自己先去试试

但我被这个坑过,不知道是哪个版本,大概是3.4.2 internal/resources也是跟包跑的,然后,我a和b(b仅仅是一个普通的包,比如用来做提示、登录之类的,一般用不到,所以没关心层级,直接放到1了)都引用了,然后有次真的用到了b,发现居然要我先加载a,找了好久才发现是sprite-frame这张图片公共引用了

你不是有一个 Scene/startscene.fire 文件吗?这个文件里面直接或者间接引用到了 p1/test1 不是?
如果不是的话,你传一个 demo 上来看看?

图片 我是说 没有用这个小游戏的startscene , main里用了test3 不是用了test1,只是这3个动画都是一样的结构,图片 ,所以用法有问题吗 ,有相同的资源吗? 除了都用到了internal 中的东西
看例子吧还是 packtest.rar (1.1 MB)
另外 多谢回复,因为我看其他人也有过类似的问题 只是都没有结果一直 希望这次能有个处理结论

哦,抱歉之前我理解错了,internals 里面的资源(非 internal/resources 下),是会直接内嵌到所用的 bundle 中的。因此当 p1 优先级大于 resources/main/start-scene 这几个bundle 时,internals 中的资源像是 splash sprite 就会跑到 p1 中,导致 p1 变成实际意义上的 internal 包。

要解决这个问题只能避免 p1 的优先级 > 7
或者尽量不要有资源的复用才行,也就是不要用到默认资源(通常正式项目也不会)。

会出现这个问题的根源在于 2.x 的 internal 包会做自动剔除,这是一个很特殊的操作,导致 internal 对非 internal/resources 下的资源丢失引用。

是啊 就是你说的这样 这是个错误的,我认为大概是你们设计初衷应该不是这样 但最终实现有问题导致的,否则如果设计就是这样 太反人类了就,
问问 你们打算如何处理? 下个版本 会修改这个错误吗?
这个BUG 很恶心啊 如果不能超过 resources 会导致很多资源 不能打入想要的共享资源Bundle里 ,就失去意义了

1赞

问问 什么结论?
你们打算改这个错误 还是不打算改?

这里的设计确实不太合理,问题已经记录了,应该会在 3.8 后续版本进行优化。3.x 老版本的话在 application 模版中自己声明一下 preloadBundles 可以绕过,2.x 的话改一下 main.js 也可以绕过去。

3.8.2 和 3.8.3 计划啥时候出~

出个2.4的新版本吧就直接 改了就是了,改了我就升级直接新版本