大家好,这几天在看Title Map 地图,遇到一个这样的问题,如果我用一张很大的已经做好的地图图片作为地图背景,比如4800 X 4800,当我导入TMX文件时,程序是一次性将图片导入内存的。这样就会使用掉很多内存,项目中肯定不会这样做,我想到一种解决方案是将大图切成一个个小图,然后根据程序需要再去加载相应的小图片。这样会会好很多,但是还是比较麻烦,我google后找到了马卡可卷轴算法,似乎能很好的解决这个问题,但是我没有找到cocos2d-x对应的解决方案,我不知道在cocos2d-x怎样先加载一张图片的指定区域到内存中,或者说我这种想法就不对。如果哪位大大以前解决过类似的问题,或者你知道怎样解决,麻烦给我指教下,万分感谢!
自己写吧,tmx就是读好所有资源才返回的,而且是同步的。
所以你得把大图切碎,而且自己读取tmx信息,不用tmx的功能来读这些需要动态释放的资源。
你还得监听移动时事件,来动态载入即将出现的地图块,以及动态释放暂时不需要的地图块的内存。
可麻烦了,要实现很多细节。
tmx根本就不适合做这种大资源的,或者说cocos2d-x的tmx库为了通用性而没有做得很智能。
内存换速度,加载需要等待的,可能卡一下。
那一般处理大地图的时候是采用什么解决方案的?
估计你的地图可重复元素很少,tmx对你这个需求来说可以不用了,分块加载是肯定的了,单屏幕图块数量别太多,屏幕外围要有缓冲图块,这样地图小范围移动不需要变更图块,每个图块宽高是2的倍数最好,我是用png的图块,然后每个图块利用addImageAsync加载需要变换的图就几乎不会有卡顿的情况(只换外围的图块,原理也是卡马赛克算法),我用这个方法加载90004800的大地图分辨率1000600还能保持57-60fps,win32和gm模拟器的安卓环境都测试过,下面的代码是图块换图片的实现,其他的交给高大上的引擎就好了,注意适当的内存释放,引擎版本是3.0正式版。
void Title::setTextureAsync(const std::string& path) { TextureCache::getInstance()->addImageAsync(path, std::bind(&Title::complete, this, std::placeholders::_1)); } void Title::complete(Texture2D *shipTexture) { this->setTexture(shipTexture); } ```
是的 你说的就是我遇到的情况,图片复用不高,看来还是要将地图切小,谢谢你的回答,帮我理清了思路!非常感谢!
问下 楼主解决好大地图加载方法没? 能给我说下解决的方法么
我最近也碰到这个问题,可否能给一份示例源码呢?
mark!