TiledMap失真和内存消耗问题

至少3.4以上版本都有这个问题
因为引擎在加载RGBA8888纹理的时候会默认做透明通道预乘,TiledMap的TMXLayer渲染blendfunc设置的是ALPHA_NON_PREMULTIPLIED,如果用了RGBA8888纹理就会失真。
各位如果遇到这个问题只要改下TMXLayer的blendfunc。

另外非常强烈的希望引擎组能优化下FASTTMXLayer的渲染处理。现在layer在渲染前会生成大量的顶点缓存数据,其中很多无用的屏幕外数据和tileset为0的垃圾数据。我这里测试的2200*100格子的地图,1个图层会生成50MB的顶点数据。主要产生在updateTotalQuads,updateTiles,updateIndexBuffer,updatePrimitives这几个方法里。而gles2.0的缓存buffer有上限,导致一个图层的顶点数过多会有渲染丢失现象,地图大了只能分多个图层刷地表,导致内存消耗成倍增长。这样使得我们不得不把地图拆分成多个小地图编辑,非常不方便。

tiledmap的图像图层一直没有得到支持,tmx解析的代码异常的反人类,难以阅读,没有处理对象层对象的rotation属性以及在rotation属性存在时的坐标修正,部分float值在解析的时候被强转成了int。为了满足项目需求我用tinyxml2重写了解析部分,加上了部分缺失的处理。希望引擎组能重视下tiledmap模块,cocos2dx是2d起家,现在能支持的第三方2d地图编辑器就tiledmap1个了,发展3d的同时不能忘本。

简直说到心坎里了,现在准备做一个很大的地图,我只加载到130x130格子就已经发现有丢失了…

今天花了一天时间重写了FASTTMXLayer的渲染,现在layer不会根据整个layer大小分配缓存空间了,layer只会缓存刷了地表的格子信息,索引数组现在只记录当前屏幕可以见的顶点数据,通过这两个调整原本消耗近300MB内存的地图现在只消耗8MB左右。
至于渲染丢失的问题我尝试了取消了vbo,根据当前屏幕位置动态生成顶点数组,测试下来虽然解决了渲染丢失问题,但由于没有使用vbo导致渲染效率下降不少,得不偿失,最后还是放弃了。

图像图层,是做什么用的?
原来2dx不支持啊

这是个很严重的问题,只能加载顶点坐标下的1w多个格子,其他的都渲染不出来。

怪不得,我以前2.x的时候都不失真,我说怎么地图滚动时总有问题呢。我实在不明白,2d都没搞好,搞什么3d,现有2d功能还有很多问题,结果就不管了

你们这样说,我就悲剧了,我现在的游戏必须得用TiledMap,到时候真的得分割地图了

http://www.cocoachina.com/bbs/read.php?tid=315427&page=1#1357079
有人已经解决了,看这个帖子

楼主,想向你请教一下关于TiledMap大地图,内存消耗的问题,申请加你为好友可以吗?

可以,站内信M我

论坛站内信有问题,点击后就跳到主页了!能否邮件联系:zxh1982@qq.com,非常感谢!

站内信不能使用,主要是想请教你如何减少FastTMXLayer的内存占用
我看了下源码,在FastTMXLayer.cpp中
TMXLayer::updateTotalQuads()函数中预先分配了大量内存
代码如下:
_totalQuads.resize(int(_layerSize.width * _layerSize.height));
_indices.resize(6 * int(_layerSize.width * _layerSize.height));
_tileToQuadIndex.resize(int(_layerSize.width * _layerSize.height),-1);

可我对opengl不熟悉,不知道如何优化