楼主: 爆发的妞

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

[复制链接]
梦石
0
星屑
60
在线时间
297 小时
注册时间
2007-5-21
回帖
119
发表于 2013-5-15 12:48:00 | 显示全部楼层
lz你走偏了,用openGL
回复

使用道具 举报

梦石
0
星屑
50
在线时间
142 小时
注册时间
2013-4-13
回帖
82
 楼主| 发表于 2013-5-15 13:01:11 | 显示全部楼层
noachic 发表于 2013-5-15 12:48
lz你走偏了,用openGL

恩。 谢谢你回复。
openGL绘制的确效率高些, 不过不是所有的手机
都支持openGL的。 我是使用普通的canvas绘制的。
另外我觉得2D游戏没必要使用openGL进行绘制。
如兄言, 有没有可靠的参数来说明openGL绘制
能提高多少的性能,相对于普通的canvas绘制。  
rm for android (原生开发)
回复

使用道具 举报

梦石
0
星屑
50
在线时间
142 小时
注册时间
2013-4-13
回帖
82
 楼主| 发表于 2013-5-15 13:20:52 | 显示全部楼层
一根大鸡巴 发表于 2013-5-14 20:17
首先声明,我没有用过RPGMaker,所以对脚本不是很了解。
2D游戏开发,已经涉及了。不过最近要找工作的, ...

谢谢你的回复。
有一些很不错的意见。
首先 减少绘制的次数, 我想到可以使用 双缓冲+卡马克算法解决。
还有一个是使用openGL,这个我可能只是来试验一下来做吧。 因为
简单的2D图形使用openGL效果不一定好。 况且有些手机也不一定支持。
rm for android (原生开发)
回复

使用道具 举报

梦石
0
星屑
60
在线时间
297 小时
注册时间
2007-5-21
回帖
119
发表于 2013-5-15 13:23:59 | 显示全部楼层
我现在在用的cocos2dx引擎,openGL绘制2d的,你可以自己试下,有专门的贴片地图的。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
20 小时
注册时间
2013-5-8
回帖
8
发表于 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消耗。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
142 小时
注册时间
2013-4-13
回帖
82
 楼主| 发表于 2013-5-17 11:37:43 | 显示全部楼层
对于fps低下的问题, 小弟已经解决。
还要再次谢谢楼上两位的建议。
现在三层全铺满, 人为干预20毫秒的情况,
fps基本上可以达到140以上。
具体的解决方法是使用了卡马克算法, 这两天又
温习了下, 原理简单, 编写起来还是非常麻烦的。
手机还是原来的配置:
机型:i9000
分辨率:800*480
地图三层,全铺满
地图宽30格子, 高 20格子。
device-2013-05-17-112553.png
rm for android (原生开发)
回复

使用道具 举报

梦石
0
星屑
50
在线时间
142 小时
注册时间
2013-4-13
回帖
82
 楼主| 发表于 2013-5-17 14:58:17 | 显示全部楼层
我看xp绘制地图的时候,用到tile_id,不知道这个数值
xp是怎么导出数据的。 并且怎么用。

[pre lang="ruby" line="1"]  for z in 0...@map_data.zsize

723.          # Passes Through X Coordinates

724.          for x in x1...x2

725.            # Passes Through Y Coordinates

726.            for y in y1...y2

727.              # Collects Tile ID

728.              id = @map_data[x, y, z]

729.              # Skip if 0 tile

730.              next if id == 0

731.              # Skip If Non-Animated Tile

732.              next unless @autotiles[id / 48 - 1].width / 96 > 1 if id < 384

733.              # Passes Through All Priorities

734.              for p in 0..5

735.                # Skip If Priority Doesn't Match

736.                next unless p == @priorities[id]

737.                # Cap Priority to Layer 3

738.                p = 2 if p > 2

739.                # If Autotile

740.                if id < 384

741.                  # Draw Auto-Tile

742.                  draw_autotile(x, y, p, id)

743.                  # Draw Higher Tiles

744.                  for l in 0...@map_data.zsize

745.                    id_l = @map_data[x, y, l]

746.                    draw_tile(x, y, p, id_l)

747.                  end

748.                  # Save Autotile Location

749.                  autotile_locations[x, y, z] = 1

750.                # If Normal Tile

751.                else

752.                  # If Autotile Drawn

753.                  if autotile_locations[x, y, z] == 1

754.                    # Redraw Normal Tile

755.                    draw_tile(x, y, p, id)

756.                    # Draw Higher Tiles

757.                    for l in 0...@map_data.zsize

758.                      id_l = @map_data[x, y, l]

759.                      draw_tile(x, y, p, id_l)

760.                    end

761.                  end

762.                end

763.              end

764.            end

765.          end

766.        end

767.      end     
[/pre]

上面有tile_id的使用, 没搞清楚跟啥有关系, 这个384,是什么概念?
望清楚的可以给小弟明示一下。 谢谢啦。
rm for android (原生开发)
回复

使用道具 举报

梦石
0
星屑
266
在线时间
2355 小时
注册时间
2009-3-13
回帖
2257

贵宾

发表于 2013-5-17 15:59:42 | 显示全部楼层
爆发的妞 发表于 2013-5-17 14:58
我看xp绘制地图的时候,用到tile_id,不知道这个数值
xp是怎么导出数据的。 并且怎么用。

      因为只看过ACE的脚本,所以不是很肯定。那个 tile_id 是图块的索引,就是32*32的小格子从左到右一排一排往下数。
      通过索引可以直接定位图块:tile_id % 每行图块数 得到 “列数”; tile_id / 每行图块数 得到“行数”,使用的时候通常再 * 32 可以得到图块在素材的左上角坐标
      另外还可以建立一个数组,储存关于图块的其它信息,比如用于通行判定之类的信息。通过这个tile_id也可以轻松得到相应的信息。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
142 小时
注册时间
2013-4-13
回帖
82
 楼主| 发表于 2013-5-17 17:22:39 | 显示全部楼层
Sion 发表于 2013-5-17 15:59
因为只看过ACE的脚本,所以不是很肯定。那个 tile_id 是图块的索引,就是32*32的小格子从左到右一 ...

谢谢你的回复。
我看 tile_id不是单纯的% or / 得到对应图片的位置等等。
上段代码给我的意思是 在384之前的图块是自动元件的,
在384之后, 是正常的。 就是搞不清他的值区域的意思。
然后怎么绘制一张自动元件的图块呢?怎么得到是自动元件的
哪个图块?
rm for android (原生开发)
回复

使用道具 举报

梦石
0
星屑
266
在线时间
2355 小时
注册时间
2009-3-13
回帖
2257

贵宾

发表于 2013-5-17 18:06:30 | 显示全部楼层
本帖最后由 Sion 于 2013-5-17 18:27 编辑
爆发的妞 发表于 2013-5-17 17:22
谢谢你的回复。
我看 tile_id不是单纯的% or / 得到对应图片的位置等等。
上段代码给我的意思是 在384 ...


自动元件大概就是根据一个图块它周围的图块是否跟它自身一样,然后来决定图块样式。
xp这个图块好乱,看不出它是怎么计算的- -b,大概原理就是这样:http://bbs.9ria.com/thread-157487-1-1.html
实在不行自己写一个吧。


补充:
绘制完以后,tile_id 应该就是对应到每个具体的图块了,自动元件只是在绘制的时候会智能的帮你选中对应的元件(确定它的tile_id)而已。这个是在生成动态的区域比较有用,比如绘制战争迷雾。算法其实很简单,几行就搞定的,P那堆图才叫麻烦。如果你没有对应的地图编辑器,还是建议一格一格来画吧- -b
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部