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

Project1

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

[讨论] 以一个程序设计的角度来看这个RPG引擎

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
20 小时
注册时间
2013-5-8
帖子
8
1
发表于 2013-5-14 20:17:30 | 显示全部楼层
爆发的妞 发表于 2013-5-14 15:46
小弟模仿xp脚本在android平台实现了地图绘制的功能。
遇到的问题是 如果是2层地图的话,fps 只能达到20多帧 ...

首先声明,我没有用过RPGMaker,所以对脚本不是很了解。
2D游戏开发,已经涉及了。不过最近要找工作的,因为要作品程序,只好做了简单的引擎。这两天正在考虑地图绘制问题。因此一直在66上DOWN资源,看到lz的帖子,
特来看一下。
不能提出什么建设性意见,权当笑料罢了。
以现代的cpu和gpu技术来说,如果2d绘图的掉帧,99%都是程序没有优化好,或者是设计的失误。手机也一样。如果是用android的话,估计是用opengl。这点,我大学的时候
看过一段时间opengl。现在忘记了。

首先先说下我的引擎绘制方案吧。2d游戏地图,经典的格子层,这是共识的无可多说。关键是怎么加快格子绘制进度。我设计引擎的时候,仿造<传奇>,建立三层,一层地板,
一层物品,中间根据角色位置来判断遮挡。最上一层,每单元2字节,来判断碰撞。
在地图绘制过程中,如类似传奇类的大型rpg,本身图元利用率就很低。所以,类似比奇,大多资源都是放在硬盘文件中,需要时候才能读取,但即使读取这些文件,本身也是很要花时间的。即便是 文件映射到内存。事先,我把传奇所有的图片压缩为png格式,因此不能直接写屏幕。这是我的引擎和传奇使用的D7最重要的区别。这点来,图片解压缩就需要花费时间。而且在基数长宽下会轻度失真。

在这个图中,绘制20*20单元格。每一个格子图元都是由即时加载生成。映射两个硬盘文件一个是地图数据,一个是图片集和。
总地图资源在40X40时一帧耗费0.265f秒,在2048X2048时耗费0.886秒。Alienware表示压力很大,在另外一台旧笔记本上彻底跑不动。原因在哪里?
解决方案
其实在绘制地图时候,第一帧总是要画很长时间,但是第二帧呢,如果不移动,第一帧和第二帧绘图就是相等。就算是移动只要不是用了随机传送卷,第一帧和第二帧也不会变化太大幅度。所以要充分利用这些。而且玩家在意的是角色而不是背景。 还记得 暗黑3 里,选项设置中有前景和背景之分吗。

所以我把第一帧绘制过的图形,存放在一个池子里,然后每次加载前,要先确认池中是否有存在的元素,这些元素可以重复利用。而对于手机rpgmaker之类,本身地图单元格就有很大的重复率。而且减少读写文件的次数。这次,在新引擎下绘制28X28 3层格子耗时几乎可以忽略。实测在0.0016波动。

其实最主要的,还是本身语言的痛处。android是Java,忽略了指针,就失去了自由控制变量生命周期和内存的自由。如同当需要不停依靠一个循环数组来检测是否重复资源的时候,使用指针和一个队列,就可以解决问题。
还有就是GPU的问题。
如果是android,理论上是可以操作gpu的。opengl情况我不清楚。但和dx大抵有类似的地方。首先你加载单元格时候,禁止cpu访问,而且使用writediscard,可以略微加快速度。还有就是合理使用内存和显存,在两者之间相互替换。因为我自己搞了1年左右的d9,本来想做游戏程序的,但硬生生被老师拿去做微分了。因为d9在图片操作的时候,释放速度一直不尽人意,所以我临时决定用d10绘制,d10不支持vista以下系统。
希望对你有帮助。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
20 小时
注册时间
2013-5-8
帖子
8
2
发表于 2013-5-15 14:51:32 | 显示全部楼层
爆发的妞 发表于 2013-5-15 13:20
谢谢你的回复。
有一些很不错的意见。
首先 减少绘制的次数, 我想到可以使用 双缓冲+卡马克算法解决。 ...

使用OPENGL,调用硬件支持是加快绘制速度的关键。单单靠cpu的解算速度可能不尽人意。而且涉及更多的颜色时候,cpu显然显得很吃力。
以google的实力,android应该支持shader。
如果可以调用shader编程,速度提升不仅仅是一两倍的事情。
我曾经写过1366X768分辨率下的模糊算法。 以最简单,将周围四个压缩为1格,进行模糊,每一帧需要计算4X1366X768。cpu相当吃力,如果用shader,
直接飘逸uv坐标,几乎不耗时间。
不是opengl绘制2d效果不好,是因为现代的显卡厂商已经无视2d绘制了。N卡的一则报告上有说,2d绘制在现在显卡上耗时为0。

关于绘图速度的调整,计算机就是在内存和速度上来回切换的。使用双缓冲应该可以解决问题,实在不行用3倍缓也可以,现在移动设备内存是最不值钱的。我的建议是,如果你的地图背景非动态而且角色与地图交互少的情况下,
可以预先渲染一张地图,放入缓存中不需要更改,然后只绘制角色和那些会动的树木等等。

双缓冲,也取决与单帧的绘制速度,如果单帧绘制不够快,两个线程也只能在临界区互相等待。如果你又足够大的内存
可以在角色换新地图的时候,`LOADING界面后台加载足够的大地图,根据角色位置,直接 从内存中的 地图的RECT 复制到当前画面上。这样可以直接跳开循环检测方案。而且等于地图只绘制了一次。等价于你后台绘制地图,然后切换到前台的效果。不过少了线程,减少cpu消耗。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-11 23:15

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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