设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3825|回复: 7
打印 上一主题 下一主题

[有事请教] 同时渲染两张地图卡顿如何解决或优化?

[复制链接]

Lv2.观梦者

梦石
0
星屑
646
在线时间
120 小时
注册时间
2019-12-7
帖子
67
跳转到指定楼层
1
发表于 2020-3-14 16:27:29 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 gg123wtf 于 2020-3-17 23:25 编辑

首先声明一下,做以下这个插件是为了实现口袋妖怪那样的地图移动,我搜了很多插件和帖子,国内的国外的,没有找到任何一个方案能完美实现,所以只好自己写了。。

原因已找到:看5楼
问题解决:看6楼


目前在制作一个可以同时显示两张地图的插件,思路是第二张地图仿照Spriteset_Map的做法创建一个新的tilemap,添加到_baseSprite里,人物移动时地图按需动态加载,不过当两张地图同时渲染时能够感觉到明显的卡顿

地图1

地图2

同时渲染:


上面动态图一开始向左移动是流畅的,但是第二张地图一出来就卡了

按理说两张地图都是默认大小17x13,远小于一张256x256的地图,所以说不是大小问题,我目前猜测是两个_tilemap对象在底层update循环里处理效率底下之类的,但是还没想到怎么调试,要看效率肯定不能打断点,如果去update循环里打印,那打印的东西会有一大堆……

所以有没有大佬知道怎么解决的?或者可以帮忙一起调试一下吗?

现阶段的脚本,即插即用:
C47_SeamlessMap.rar (5.03 KB, 下载次数: 65)

用法:插件说明里有
简单点就是创建两张默认地图,随便画
地图1备注里写<cmap:u 2 7 0>
地图2备注里写<cmap:d 1 6 12>
新账号chyj4747,这个账号是我刚来论坛时随便填的,当时没想着要发帖

Lv3.寻梦者

梦石
0
星屑
1191
在线时间
112 小时
注册时间
2019-1-30
帖子
30
7
发表于 2020-3-17 23:47:26 | 只看该作者
好厉害!大佬加油!
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
646
在线时间
120 小时
注册时间
2019-12-7
帖子
67
6
 楼主| 发表于 2020-3-17 23:23:20 | 只看该作者
本帖最后由 gg123wtf 于 2020-3-18 09:30 编辑

已解决,由Lanza Schneider大神给了一个巧妙的方案解决了核心问题
不过插件还不能用,还有很多要完善的地方,比如人物还不能地图间穿行,另外加载第二张地图时会卡的黑屏一下,但这些都不算底层问题了,等我后续完善之后再放上来吧
新账号chyj4747,这个账号是我刚来论坛时随便填的,当时没想着要发帖
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
646
在线时间
120 小时
注册时间
2019-12-7
帖子
67
5
 楼主| 发表于 2020-3-17 16:17:12 | 只看该作者
我知道为啥会卡了。。两张地图两套tilemap,mv在渲染时需要切换图块集(tileset),先用图块集1渲染地图1,切换成图块集2,再渲染地图2,假设地图就是按12的顺序渲染,那么上一帧渲染后,当前图块集是2,下一帧要渲染需要先切回图块集1,渲染地图1,然后再切图块集2。。

所以嘛,图块集这个东西就很大了,不停切换一直在消耗算力,只有一张地图的话只会在进入地图的时候加载一次图块集,所以无论地图多大,渲染耗时基本不变

原因找到了,要实现双地图就得改底层mv的渲染方式了,或者说要改加载图块集的方式……
我得想想有没有别的方法。。
新账号chyj4747,这个账号是我刚来论坛时随便填的,当时没想着要发帖
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
646
在线时间
120 小时
注册时间
2019-12-7
帖子
67
4
 楼主| 发表于 2020-3-15 23:24:42 | 只看该作者
我已经确定是同时渲染两套地图时tilemap算法效率低下造成的卡顿,然而具体原因还不知道,跟地图尺寸没关系,一张17x13x2大小的地图算法只执行一遍,不会卡,两张17x13的地图,虽然跟前面一张图大小相等,但是算法执行两遍,就会卡。。

一张地图的话算法耗时大约70+ms,所以两张图就直接翻倍变成140+ms,甚至更多,因此就能感觉到卡顿了,另外FPS直接掉到6并且升不回去了

尝试过创建新的tilemap、新的sprite、新的spriteset_map,都不行,同一帧计算两张地图就是会卡,于是试了下隔帧渲染,也就是一帧渲染主地图,下一帧只渲染衔接地图,再下一帧只渲染主地图,能解决卡顿问题,但是屏幕会闪

所以最后想来想去还是只能从算法本身入手,要么看懂完整的算法流程,然后再想办法,要么把两个tilemap合并成一个,然后在算法里动手脚,让算法能够识别成两张地图,先尝试后者吧,前者太烧脑了……
新账号chyj4747,这个账号是我刚来论坛时随便填的,当时没想着要发帖
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
646
在线时间
120 小时
注册时间
2019-12-7
帖子
67
3
 楼主| 发表于 2020-3-14 21:47:02 | 只看该作者
wabcmcc 发表于 2020-3-14 21:18
樓主如此熱誠,固執,實在忍不住多言,
單張大地圖劃分兩(多)張不同風格地圖,玩家看不出來.
如要連環地圖.請君 ...

你提的这两点都不行啊,之前几天搜索我都搜到了,但是没法应用,不然我也不会自己写插件了。。

单张大地图划分的那种,首先地图得非常非常大,我要做口袋妖怪那种的,MV的256x256根本不够,再者那么大的地图加载肯定巨慢,另外单张地图的话地图块目测不够用,毕竟任何一个ABCDE类型的图块集MV都限制了素材宽高,能放的不同图块类型有限

合并的那种,最基本的,就要求两张地图使用同一套图块集,肯定不行

点评

666666  发表于 2020-3-15 07:31
新账号chyj4747,这个账号是我刚来论坛时随便填的,当时没想着要发帖
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
16064
在线时间
3993 小时
注册时间
2015-9-14
帖子
1337

开拓者

2
发表于 2020-3-14 21:18:50 | 只看该作者
樓主如此熱誠,固執,實在忍不住多言,
單張大地圖劃分兩(多)張不同風格地圖,玩家看不出來.
如要連環地圖.請君移步將多個地圖連接到一個大地圖的插件
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-12-1 03:34

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表