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

Project1

 找回密码
 注册会员
搜索
楼主: 爆发的妞
打印 上一主题 下一主题

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
60
在线时间
297 小时
注册时间
2007-5-21
帖子
139
11
发表于 2013-5-15 12:48:00 | 只看该作者
lz你走偏了,用openGL
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
142 小时
注册时间
2013-4-13
帖子
92
12
 楼主| 发表于 2013-5-15 13:01:11 | 只看该作者
noachic 发表于 2013-5-15 12:48
lz你走偏了,用openGL

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

使用道具 举报

Lv1.梦旅人

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

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
297 小时
注册时间
2007-5-21
帖子
139
14
发表于 2013-5-15 13:23:59 | 只看该作者
我现在在用的cocos2dx引擎,openGL绘制2d的,你可以自己试下,有专门的贴片地图的。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

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

使用道具 举报

Lv1.梦旅人

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

device-2013-05-17-112553.png (31.39 KB, 下载次数: 14)

device-2013-05-17-112553.png
rm for android (原生开发)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

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

RUBY 代码复制
  1. for z in [email]0...@map_data.zsize[/email]
  2.  
  3. 723.          # Passes Through X Coordinates
  4.  
  5. 724.          for x in x1...x2
  6.  
  7. 725.            # Passes Through Y Coordinates
  8.  
  9. 726.            for y in y1...y2
  10.  
  11. 727.              # Collects Tile ID
  12.  
  13. 728.              id = @map_data[x, y, z]
  14.  
  15. 729.              # Skip if 0 tile
  16.  
  17. 730.              next if id == 0
  18.  
  19. 731.              # Skip If Non-Animated Tile
  20.  
  21. 732.              next unless @autotiles[id / 48 - 1].width / 96 > 1 if id < 384
  22.  
  23. 733.              # Passes Through All Priorities
  24.  
  25. 734.              for p in 0..5
  26.  
  27. 735.                # Skip If Priority Doesn't Match
  28.  
  29. 736.                next unless p == @priorities[id]
  30.  
  31. 737.                # Cap Priority to Layer 3
  32.  
  33. 738.                p = 2 if p > 2
  34.  
  35. 739.                # If Autotile
  36.  
  37. 740.                if id < 384
  38.  
  39. 741.                  # Draw Auto-Tile
  40.  
  41. 742.                  draw_autotile(x, y, p, id)
  42.  
  43. 743.                  # Draw Higher Tiles
  44.  
  45. 744.                  for l in [email]0...@map_data.zsize[/email]
  46.  
  47. 745.                    id_l = @map_data[x, y, l]
  48.  
  49. 746.                    draw_tile(x, y, p, id_l)
  50.  
  51. 747.                  end
  52.  
  53. 748.                  # Save Autotile Location
  54.  
  55. 749.                  autotile_locations[x, y, z] = 1
  56.  
  57. 750.                # If Normal Tile
  58.  
  59. 751.                else
  60.  
  61. 752.                  # If Autotile Drawn
  62.  
  63. 753.                  if autotile_locations[x, y, z] == 1
  64.  
  65. 754.                    # Redraw Normal Tile
  66.  
  67. 755.                    draw_tile(x, y, p, id)
  68.  
  69. 756.                    # Draw Higher Tiles
  70.  
  71. 757.                    for l in [email]0...@map_data.zsize[/email]
  72.  
  73. 758.                      id_l = @map_data[x, y, l]
  74.  
  75. 759.                      draw_tile(x, y, p, id_l)
  76.  
  77. 760.                    end
  78.  
  79. 761.                  end
  80.  
  81. 762.                end
  82.  
  83. 763.              end
  84.  
  85. 764.            end
  86.  
  87. 765.          end
  88.  
  89. 766.        end
  90.  
  91. 767.      end


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

使用道具 举报

Lv2.观梦者 (暗夜天使)

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

贵宾

18
发表于 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也可以轻松得到相应的信息。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
142 小时
注册时间
2013-4-13
帖子
92
19
 楼主| 发表于 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 (原生开发)
回复 支持 反对

使用道具 举报

Lv2.观梦者 (暗夜天使)

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

贵宾

20
发表于 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
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-29 03:57

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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