关于排行榜,大家是怎么设计子域的分辨率的?

这个是我在实现项目过程中的一个疑问:
在官方给出的微信小游戏开放数据域,有这么几段话我一直不大理解:

整个开放数据域项目只应该包含其内容 UI,并且应该将场景中 Canvas 组件的设计分辨率设置为 UI 的完整分辨率,不需要对应主域的分辨率。

可以完全自由控制开放数据域的尺寸,降低分辨率提高性能,提高分辨率优化效果,都可以轻松在开放数据域中完成。

这是否意味着,如果我有一个竖版排行榜区域,我的子域只需要竖版排行榜区域的大小,且我在主域对应的WXSubContextView也只需要框选出该区域即可。
我的疑问就是,在我有多个地方需要显示排行榜的情况下,比如:总排行榜的竖版排行榜,及结算界面的带有自己的成绩是三人横向排行榜。这两个排行榜的大小位置都不一样。在这种情况下,我要怎么设计我的子域的尺寸才是最合理的?

我目前的实现方式是子域的尺寸大小跟主域的大小是一致的,两个排行榜的对应UI的位置和大小也是跟主域显示区域一致,只是它们都放在一个全屏幕大小的节点下面,WXSubContextView的widget设置也是全部贴边显示。排行榜的显示上是没有太大问题,就是竖版排行榜的拖拽有时候会失效,而且拖拽的过程中会有些滞感。如图所示:

就想请问大家,在这种需要多个排行榜的情况下,大家是怎么设计子域的?或者说,我能否通过某些方式,实现:竖版排行榜显示时,子域大小就是竖版排行榜区域大小;横板排行榜显示时,子域大小就是横板排行榜区域大小?
以及大家是否有遇见过排行榜首次进入滚动没问题但是再次进入该界面时拖拽就失败的现象(子域的逻辑是退出时设置该排行榜的节点的active为false,进入时重新设置为true并重新加载数据),大家是怎么处理这个bug的?

实践出真知,你已经有想法了,不妨实践看看不就有结果了嘛

????
我就是不知道才上来问大家的呀:joy:
我连实践的方向都不清楚,cocos官网那么写,但是我没看懂…:sweat:

子域的大小时通过主域控制的,也就是说你有多个排行榜,那你在打开第一个排行榜的时候设置一下子域大小,打开第二个排行榜的时候再设置一下子域的大小,我的思路是这样的,你可以试试。你最后的那个问题,你可以试试不要改变active,而是把item全部remove,重新进来的时候再创建新的item,当然,这也是我想的,我没做过滑动排行榜。

推荐原生

要怎么设置子域的大小?每次显示排行榜的时候传递消息,然后子域通过脚本修改子域的Canvas的DesignResolution大小吗?

不是的啊,子域是不能自己改变自己的分辨率的,子域的分辨率是通过主域去改变的。假设子域的分辨率是7501334,但是你只用到了子域的左上角的部分,大概600600的大小,那么主域打开排行榜的时候设置一下子域canvas的大小为600*600。不知道我这样说你明白不

不大明白,子域的分辨率怎么通过主域进行修改?
我查了下,cc.WXSubContextView是有一个接口是reset(),但是我在脚本上使用时,发现它也没有传参…
还是说,我子域的两个排行榜均通过左上角对齐,我显示其中的一个之后,我主域调用某个接口,子域就会自动将分辨率切换为该排行榜的大小?
还是说,子域还是那个大小,只是主域的不同尺寸的WXSubContextView只是显示了不同大小的子域的内容?也不对啊,无论子域多大多小,主域都会显示完整的子域的内容的呀。

你是不是被自己绕晕了,还是看别人的说法绕晕了。一个很简单的道理,你有多做排行榜显示,每种排行榜重绘一次排行榜,主域不需要动,子域上重绘就可以了。

我现在的实现方式就是子域大小跟主域大小是一样大的。然后主域的WXSubContextView所在节点的尺寸也是完全贴边主域,跟主域一样的大小。然后需要显示排行榜A的时候子域显示排行榜A,需要显示排行榜B的时候子域显示排行榜B。(我这种写法子域有些卡顿,而且其中一个排行榜滚动视图有个无法滚动的bug)
然后,官方的推荐是WXSubContextView的大小最好是要显示UI的内容的大小,来达到好的优化效果。然后,我不知道通过什么方式来让子域在显示排行榜A的时候,大小就是排行榜A的大小,在显示排行榜B的时候,大小就是排行榜B的大小…?

你的主域空间是布满整屏的,子域与主域一样大小。
比如你绘制排行榜A:

  1. user1 300
    2.user2 200
    。。。
    此时的UI排版,会全部显示到主域上,因为你的子域与主域一样大小。
    但绘制排行榜B:
    1 name1 500
    2 name2 400
    。。。
    此时的UI排版又是另外一种,肯能跟排行榜A布局,相关元素的间隔等都不一样,但同样会全部显示到主域上。
    这时要注意的问题是:这个两个排行榜多数是在同一个场景,比如点开查看排行榜A时,在切换到排行榜B时要清除排行榜A上绘制的内容,已经关闭查看排行榜A时也要清除一下绘制的内容,不然可能会出现你的项目中无法滚动的现象;同理查看排行榜B时要进行这样的处理,这样做肯能效果要好点。

啊,我的两个排行榜是在不同的节点下显示的。因为一个是竖版的排行榜,一个是横版的只显示前后三名玩家的成绩的排行榜。所以我需要显示哪一个就让哪一个的节点为active就可以了,两个排行榜之间是不会相互影响的。
另外,官方推荐是子域的大小就是要显示的内容的大小,这样优化效果更好。但是我不知道怎么让我的子域在显示竖版排行榜时,子域的大小就是竖版排行榜的大小;在显示横板排行榜时,子域的大小就是横板排行榜的大小…?

还是说,我对官方的那段话理解有误?!

我这边的排行榜是这样的:


sub组件大小是主域大小,子域大小也跟主域大小一样大。
我不知道怎么通过sub组件让显示排行榜的时候,子域大小也跟着变化…?

第一个排行榜A他是一个竖屏,在主域上的sub节点空间也是竖屏,你的子域就是一个竖屏排版的内容,当你用第二个主域上sub节点空间时它是横向排版的,这时你要让横屏的排行榜B能很好的显示在主域的节点空间,要保证内容不能溢出主域sub节点空间区域,宽度上保证是一样宽度,尤其纵向长度上排版的内容不能溢出。

没有横屏,游戏自始至终都是竖屏的…

那不就简单了,第二排行榜是横向排版的,你就让主域上的sub控件节点尺寸设置为你想要呈现的尺寸。你第一个排行榜A是另外一个主域sub节点,每个sub对应不同的排行榜,调用前sub节点active都为false,调用哪个就置为true,离开时在重置为false。

这个OK啊,问题是sub节点显示的内容就是整个子域的内容,如果把sub节点的大小设置为不同的排行榜的大小的话,那子域的大小也得是相应的不同排行榜的大小。就是后者,我不知道怎么实现…?

直接调整子域的场景分辨率Canvas.designResolution,使之适应你的横屏的排行榜;绘制竖屏排行调用Canvas.designResolution使其分辨率设置为相应的尺寸。

这么说吧,你们所说的主域设置子域的大小只是指通过修改sub组件的大小从而修改了显示的子域的大小;而子域的Canvas的DesignResolution还是由子域自己通过代码进行修改?