- C++ TypedArray 的 set 方法
https://github.com/cocos/cocos-engine/blob/7cc396794959ccfbb8438b8c755090a95f30c090/native/cocos/core/TypedArray.h#L195-L197
这里的设置应该要考虑元素的大小和 array 本身的偏移, 类似这样
- TiledMap 对象层的排序
https://github.com/cocos/cocos-engine/blob/7cc396794959ccfbb8438b8c755090a95f30c090/cocos/tiledmap/tmx-xml-parser.ts#L1015
引擎直接使用了对象的坐标 y 值来排序, 但是这样的顺序和在 tiled 编辑器中是不一致的
我有在这里发过 creator如何修改tiledMap中对象层渲染顺序
还是 TiledMap 相关
fillIndicesBuffer 这个方法是在 native 上当 TiledLayer 发生变化需要重新渲染时会调用的
那么假如有两个 tiledmap 节点, map1 一直在显示中, map2 一直在隐藏中, 当把 map2 设置显示时, map2 中的 TiledLayer 就会触发这个方法调用
问题在于, 上述场景这个方法触发时, 代码中计算得到的 indexOffset 是错误的
并最终导致 native c++ 代码中
这里获取到的 map1 map2 中的 TiledLayer 的 indexOffset 错乱, 显示异常
能否发 PR 修改改呢?
上面提到的问题只有 TypedArray 的问题是比较好改我自己改了的 fix TypedArray set by sablib · Pull Request #17817 · cocos/cocos-engine · GitHub
另外两个问题都是通过其他方式绕过去了, 没有去改引擎的代码, 且我暂时也没有什么头绪要怎么改
tiled object group 排序的问题, 我只是知道在我的场景下这个排序是和 tiled 不匹配的, 对 tiled 也没那么熟悉, 不知道在 tiled 支持的所有地图中这个排序都应该要怎么实现
tiled layer 的 indexOffset 的问题我也只是调试的时候发现这里有问题, 也并不清楚要怎么改才是对的, 我自己是在上面描述的时机调用了所有相关 tiled-layer 的 markForUpdateRenderData, 都标记为 dirtyRender 然后显示就没问题了
准确来说, 不是这里代码中 indexOffset 计算逻辑有问题, 而是这个 drawInfo 和 renderData 每次都是新生成的对象, 并没有维护它在 buffer 中的 indexOffset, 像上面描述的场景中 只有 map2 的 tiled-layer 这一个 dirtyRender, 那么它在这个方法中"let indexOffset = renderData.chunk.meshBuffer.indexOffset;"所获得的 indexOffset 就是0, 因为每次 BEFORE_DRAW 的事件中, StaticVBAccessor 的 reset 都会把 meshBuffer 上的 indexOffset 重置为0. 问题在于这个每帧重置 indexOffset 为 0 的逻辑和有 dirtyRender 的标记才会执行 updateRenderData 的逻辑有些冲突, 这个冲突导致把非 dirtyRender 的数据覆盖掉了, 导致了显示异常