3.x设置位置只能通过setPosition吗

主要原因还是因为升维后,属性爆炸。
2.x 主要面向 2D,所以顶多就 x y scaleX scaleY angle,5 个

3.x 就得有 xyz scaleXYZ eulerAngleXYZ, angle 10 个……
问题来了,既然 local TRS 支持了,world 的呢?再来 9 个。一共 19 个。晕不晕?

就算不晕,问题来了,属性过多的话,性能是会降低的…… 访问 Node.prototype 时速度可能会变慢……

1赞

我认为至少要支持this.node.position.x = X这种赋值。本来也就是给vector做的拓展。标记一下调整的dirty,用户体验还是很重要的。就好比我老板天天说的,别人家的都行,就你们不行?

也不是暴躁啦,就是一直用setPosition用得很烦,在只想移动某一个轴的时候setPosition真的很不方便

这个详细数据有吗,我之前只看过 V8 属性多了后会转字典模式,但不是说原型对象会保持快速模式吗,还是其他的问题?

没啥问题的,xyz也可以用set方法去单独设置,只不过引擎只提供了get

上面两种方法都会导致原生平台出现问题,因为单独设置 _lpos 或者 position 的 x, y, z 分量,无法将数据成功更新到原生数据结构中,因为 Vec3 是没有 getter setter 绑定的,分量 set 也不可能反射到 position 属性的 setter 上。基于跨平台需求我们禁止单独设置 position 分量,其他 vec3,mat4 类型的属性同理。Vec3 和 Mat4 使用的地方过于广泛,我们尽可能将其实现成简单的 JS Object,而不是各种 getter setter,为的也是避免影响性能,所以上面说的 Vec3 属性 dirty 或 notification 方案也不行。

另外就是 Jare 说的,属性数量太多,的确会导致对象整体被转化为字典访问模式,所有 Node API 性能都会收到极大影响,直接导致游戏性能下降十倍以上。

所以我们只能保守的将 Node 的 Vec3,Mat4 属性设置为 readonly

1赞

你信不信终有一天会改回来,我狠下诺言,到时候你们又有另一套说辞,所以说白了关cpp什么事,,cpp不被这个锅,直接说这是实现抉择罢了~

咱们讨论的就是现在的技术方案和设计思路啊。
跟 Cpp 的关联就是 Node 是 JS 和 Cpp 两份对象数据,需要在两边同步数据,一旦设置了 Vec3 分量就会破坏这个同步。当然,我们可以提供可靠的 x, y, z 属性,但是不这样做是为了避免 Node 属性过多。
我不理解哪里没说清楚

楼上有个家伙说这是cpp的锅,我哭了~直接说实现就好了,还能甩锅cpp.
虽然你说不能设置node的单个分量,但是有没有考虑过比如我写this.node.x=5时候,你在set里面直接获取当前node的y和z,然后调用内部的setPosition(x,y,z),不就好了吗?我真的没明白为什么实现不了

就是这个原因啊

我们不能只考虑 position 的分量,可以参考 Jare 的回复

1赞

原型对象也会吗?多少属性会导致转为字典模式能分享一下吗?

image
值变了 节点不动 是我写的有问题吗

要用setPosition的,我说set方法可以不是针对修改坐标的,是说的自定义的属性可以提供set方法去赋值

setPosition修改坐标后还会有别的处理,你这单纯修改值是没用的。

那么问题又来了,如果基于当前position的基础重新计算位置需要创建新的vec3是不是有新的性能问题

不new Vec3,那就setPosition传x y z呗

要关闭这个窗口,必须得右边关。而且关闭按钮还在子菜单里。
我感觉这个也特别麻烦,能不能改改这。

我们加个右键菜单吧

我也觉得好麻烦

这是个谜,而且在不同环境下表现也不一样,尤其是 v8 和 JSC 的差异。但是属性数量和JS动态性都对性能有影响。
我们在之前的版本测试中发现过几次非常诡异的性能下降,发几个修复,这些修复都解决了一些很明显的整体性能下降。