TMXMap 渲染 超过16384个块(65536个点)后数据无效, 后续部分渲染无图制问题

16384 65535 TMX 渲染 部分 不显示 显示不全

好大一个坑,但解决办法却很简单。

表现:瓦片超过16384个(65536个点)个, 后面的无论是全部还是局部均无法显示。整个矩形瓦片矩阵 从下方开始,部分无法显示。

原因:cocos2d::TMXLayer (或cocos2d::experimental::TMXLayer)中, ogl渲染时VerterxBuffer没问题,IndexBuffer使用的索引值indices均为Glshort类型 (可能最初觉得不可能最多渲染这么多,为了节省一点点缓存)。 Glushort上限65536个,也就是说无论vertexBuffer如何折腾,后面的点索引都无法指得到。

解决办法:cocos2d::TMXLayer (或cocos2d::experimental::TMXLayer) 类:
成员变量 std::vector _indices; 改为 std::vector _indices;
函数 updateIndexBuffer 中 IndexBuffer::IndexType::INDEX_TYPE_SHORT_16 改为 IndexBuffer::IndexType::INDEX_TYPE_UINT_32

Glushort上限65536个是哪里查到的数据求源地址
哦我以为你说的glbuffer的上限,原来是说Glushort的上限

Glushort 等价于 unsigned short, 上限65535。

。。还是手动复用吧。。

我又去看了下源码,感觉虽然问题解决了但不是你说的原因
tmxlayer里的_indices是根据layer大小创建的,如下:
_indices.resize(6 * int(_layerSize.width * _layerSize.height));
所以不管用glushort还是gluint,indexbuffer通过glBufferData创建的glbuffer容纳的顶点个数没有发生变化,都是_indices的大小。
而tmxlayer最后渲染调用的是PrimitiveCommand的draw方法,绘制用的glDrawElements,此时会根据_indices的type设置其第三个参数,我猜想是在这里传递GL_UNSIGNED_SHORT和GL_UNSIGNED_INT时支持的最大渲染顶点个数不一样,GL_UNSIGNED_SHORT的上限是65536

跟索引数量无关,是单个索引范围问题。 另外如果你不修改索引类型而只修改绘制时的读取方式类型,恐怕显示错误或OGL报错。

想通了,的确是范围问题

3.7的版本的解决办法应该修改cocos2d::FastTMXLayer类里面的文件,修改方法更楼主一样,只是位置变了:2:
我也是刚刚按照楼主的方法解决了问题

楼主!!求救!!,按照你的方法,当主角静止不动的时候地图是没有问题,但是当主角动起来又出现地图显示不正常的情况了!这种情况你们有遇到吗?

没遇到过额,在正常加载tiled直接显示的情况下,没有遇到这种情况。

倒是在使用自定义camera的时候,如果camera移动,FastTiledMap的draw中用视图矩阵过滤显示的块时未考虑到camera矩阵,会有问题,不知道是不是和你遇到的环境相同

已经解决了这个问题了,主要是使用了TMXTiledMap *tileMap时会出现运动过程地图出现显示不全的问题,在使用楼主你的方法基础上,用cocos2d::experimental::TMXTiledMap *tileMap;替换TMXtiledMap就解决问题 了。

楼主在此顺便请教,如何在游戏中切换横竖屏?因为设计把启动页和登录页做成竖屏,然后游戏又是横屏,所以需要在游戏中切换,有什么方法可以切换吗?

我按楼主的方法,加载一个1200*1200 有两层的地图,在手机上直接直接崩溃了!

好像是内存分配太多,耗尽了!