Ccc tiledmap超大地图的实现和demo

因为项目用要用15001500的超大型地图,目前官方的tiled支持最大只能128128,而且在内存渲染上面基本是没做过任何处理。我的地图加载进来直接就爆了。撸了快两周基本解决了问题。目前在js和jsb上都能正常的加载地图了,有提交pr,貌似api设计的不合理,官方没合并。

c++引擎部分
https://github.com/yangzhu6263736/cocos2d-x-lite/commit/a9071f46e3760fc2559abcc6f50b9a3114b4a4b5
js引擎部分
https://github.com/yangzhu6263736/engine/commit/8527b690ccb398c6cb6cfa4e361a1d44d8dc7aab
水平有限,仅供参考。

调用方式
layer.setupTilesBeyondPos(cc.p(x, y), 11)
即只显示指定点(tile)周围distance以内的格子。

16赞

感谢你的反馈与解决方案。建议发一个 demo 或者示例代码段出来,这样我们和其他开发者都可以参考。谢谢!:+1:

https://github.com/yangzhu6263736/BigTileTest
测试地图1500 * 1500格,可自由拖动。

我来解释一下为什么只能渲染128128吧。
其实这个问题在以前老版论坛里面是有人发帖讨论过的,帖子地址:http://www.cocoachina.com/bbs/read.php?tid=315427&page=1#1356457
引擎默认的IndexBufer使用的是GL_UNSIGNED_SHORT,在源码中:
CCFastTMXLayer.h的337行,_indices的数据类型GLushort,
CCFastTMXLayer.cpp的315行,_indexBufer的创建
Primitive.cpp的97行,根据类型使用GL_UNSIGNED_SHORT或GL_UNSIGNED_INT
而使用GL_UNSIGNED_SHORT的话,顶点索引上限就只能128
128个格子,即65536个顶点,即2的16次方
所以想渲染大地图,就只需要把_indices的类型改成GLuint,_indexBuffer的type改成INDEX_TYPE_UINT_32,可以支持2的32次方,即4294967296个顶点,1500*1500也就9000000个顶点,渲染肯定是没问题的。而且这种修改方法应该是对源码改动最小的,我就是这么干的。

楼主的链接我点进去看了,不是我上面这种修改方法,我也没细看,不过看到引擎团队有人回复我就顺便回复下,tmx的这个渲染限制的确很少有人知道正确的处理方法。
另外引擎tmx模块的渲染效率太低了,目前源码有极大的优化空间,creator团队有兴趣的话干脆彻底重构吧

8赞

嗯。想了下你的这个方案确实是在渲染方面很小改动。 但是1500 *1500格子在 updateTotalQuads时可能会创建出超级多的quad ,内存直接会爆掉。 我这里有处理只创建可视区域内的tiles来降低内存。内存占用从2G降到170M左右。目测还可以进一步压缩。我这里代码不严谨,仅仅是思路拿出来给大参考下。

1赞

1500 * 1500目前改动已经支持了。我这个方案主要就是优化内存的。 无缝大地图两个方法 一个直接大地图,一个小地图拼接,我一开始就直接走的超大地图的方案。

你做的是动态加载进内存吗?移动的时候

是的。根根当前屏幕范围动态加载周围的格子。

引擎本身是直接根据地图大小创建totalquads,导致的问题是有时候一个层里面只有很少的格子需要渲染却创建了一个巨大的数组,这部分的源码是可以优化的,改成只给需要渲染的格子创建数据就可以了。所以说啊tmx这块需要彻底重构,可优化的地方太多了

跟帖關注,我的項目中也有用到TiledMap,不過目前最大只有100*100

官方要做的东西太多了,很多时候还是要靠自已动手,等不起。哈哈

100*100基本没多大问题啦。

楼主,你的github上的例子已经运行不了了。能否用1.2再更新一下

Hi 大神, 官方现在还在维护2dx吗? 目前有队tiledmap加载超大地图做优化么?

希望官方优化下titledmap,实现超大地图

你这样干在一些机器上会出问题的,gles2.0标准里index buffer只支持unsigned short,3.0才正式支持unsigned int。在2.0里用unsigned int那就要看你人品了,如果支持那是gpu厂商额外送你的。

1赞

有个问题想请教一下,creator tiledmap 用的是TMXTiledMap,你修改的代码是FastTMXTiledMap,请问是你切换成fast的么?
还有,如果快速切换?
谢谢

目测官方的TMXTiledMap就是用的FastTMXTiledMap。没有切换,我也是直接改的fast的。

感谢回复,我在论坛里问了下,官方使用的不是fast (可能版本不同吧,我用的是1.3.3)
http://forum.cocos.com/t/creator-tmxtiledmap/43658/2?u=111923
非常感谢提供的 思路和demo !~

你好, 请问这个该怎么用呢, 下载好js的该怎么设置呢,
我是小白, 所以不是很懂!!!