铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 9630|回复: 20

[通用] 极限减少程序的内存消耗

  [复制链接]
发表于 2013-3-4 17:46 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
最近做android版本,发现内存真的很吃紧,原来的版本消耗了太多不必要的内存。经过一系列优化之后,原本消耗50M内存的游戏,现在只需要不到30M。

思路一:尽可能的不使用全局变量
在任何的程序语言都是一样,全局变量是永远不会被释放内存的。
苍炎LUA里定义了大量的全局变量,这是不合理的,应该把每一个变量应用到它应当拥有的作用域里,而不能贪图方便
修改这一块花了四个多小时,总体优化有1M多
主要一个大的修改,是把自定的事情移到文件中去读取,类似于鱼儿的oldevent,不再使用全局变量来保存了

思路二:优化贴图文件
常用的贴图文件,wmap.grp  smap.grp   mmap.grp  ,苍龙增加了  thing.grp
我觉得增加thing.grp是非常有必要的,不然每增加一个物品都得修改三个贴图,这比较麻烦
但是增加了thing.grp之后, 另外三个贴图里对应的物品贴图没有意义了,应当删除,但是却没有人去做
删除物品的贴图花了两个多小时,中间有一次被覆盖错了,纠结。  总体优化2M多

思路三:头像图片优化
目前使用整个头像有8M多,每一次都是把全部加载到内存里,但是在一个场景下实际使用的头像其实很少,造成极大的浪费
现在我的做法是把这些头像全部做成一张张的PNG图片,放到head目录里,编上号,每次读取只拿一张图片放入内存。
总花费六个小时,但是很值,这样起码可以节约7M多的内存。 以后图片多了效果会更明显
在这里不得不吐槽一下强强,这导出现的PNG图片,为啥不是从0开始,而是从1开始,这不是让人纠结么

思路四:集气小头像优化
原来的苍炎使用的小头像,是从大头像里压缩,这不科学啊,白白浪费8M的内存
首先第一步肯定是很用工具把大头像全部变小,然后再采用大头像的读取方式,放到一个文件目录里mhead
大头像处理完,小头像就比较简单了,大约花费一个小时,相比节约了8M的内存


思路五:战斗效果优化
现在的战斗效果都是保存到eft.grp, eft.idx,金前的例外
那么同样的一次性加载肯定是不合理,把每个战斗效果拆出来,需要到才读取
并且设置最大的读取范围,我现在设置的是20,超过20个前面的就会被替换释放。
总体花费三个多小时,因为得把eft.grp拆出来,另外还得改显示的方式和C语言底层的战斗绘制函数,增加了v5变量
节约2M的内存


20M的内存,相对现在512M的手机内存来讲,真的很重要

其实做游戏,不管是在什么平台下开发,任何的优化都很重要,把性能提高到极致是每个程序员应当追寻的目标







点评

KA
甚好  发表于 2013-3-4 20:02

评分

参与人数 2声望 +24 收起 理由
winson7891 + 12 追加,不容呀
KA + 12 啊狠人。

查看全部评分

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-4 17:53 | 显示全部楼层
蓝大辛苦了!
在下256M内存的入门机,玩龙人十分流畅,完美无跳出
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-5 00:37 | 显示全部楼层
要把游戏移植到手机平台
对一些不必要的全局变量的设置和贴图加载方法的优化,当然是要改动一下的

而对PC平台来说,这些可以说就无足轻重了
10多M的内存占用量,对现在的PC机配置来说算得了什么
改不改对游戏的运行根本不会有任何影响
这也就是为什么在加了单独的道具贴图文件后那么久也没人去把原来三个地图文件中的相关贴图删掉这种类似问题的原因

当然要说编程时尽量做到资源占用的优化是肯定没错的
但有时也就是图一时之便,过后也就没管了
因为对现在的使用平台来说影响甚微

题外话:
文中提到的改动第二项花费两小时和第三项花费六小时,是不是耗时过多了?

点评

KA
估计编辑器不太给力  发表于 2013-3-5 08:56
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-5 08:49 | 显示全部楼层
蓝大辛苦了,感谢你能够让我们可以在手机上完的到这么好的金庸MOD
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2013-3-5 08:59 | 显示全部楼层
回复 tsmdsyp 的帖子

为什么要做这么久,其实只能做了才知道
优化是没有例子可以参考,所有的思路都要经过自己去思考,做一个步骤都要去摸索,花费的时间自然是长一些。做完之后还要测试,去对比。

把这些思路发出来,就是让别人一个方向,减少弯路。

我们不能因为自己手头资源多就随意的浪费,这是我比较不能忍受的事情。我更喜欢像愤怒的小鸟这种比较极致的优化

花最小的代价做最多的事情,不是很舒服的事么
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-5 13:23 | 显示全部楼层
本帖最后由 weyl 于 2013-3-5 13:26 编辑

回复 蓝烟清 的帖子


相比之下,如果资源限制可以放开,我认为效率和代码重用比较重要。相同的功能能用一个代码段就尽量不要复制粘贴,比如AI和自己的相关算法,大部分应是同一段代码的复用。

老实说,我最早写pascal复刻的时候完全没有考虑资源占用的情况,甚至有大量的空间换时间的方法。目前pascal语言在移动平台编译是有办法的,但是这个问题解决不了,移植了也很难跑起来。

那时候SDL,游戏响应思路等,改善绘图速度等,我都是现学的,有的是自己搞出来的。如果减少资源,必然增加数据结构和代码段的复杂程度,这东西直到现在我还不会……

点评

减少资源,没有过多的去修改原来的代码,比如删除没用的贴图,这总不至于影响。  发表于 2013-3-5 15:17
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2013-3-5 15:16 | 显示全部楼层
回复 weyl 的帖子

代码重用是另外一个方面, 而且说到代码重用并不是所谓的CTRL+C  CTRL+V 代码重用在国内根本没有几个设计师有这样的水平,能力不多说,国内最悲摧的一点就是没有写文档的习惯

说实在的,wely所说的重用,顶多就是多定义几个函数

一个软件,从策划到生命的终止,每人环节都很重要

代码的可读性,简洁性,运行效率都是很重要的, 不能说因为windows有很多的资源就可以随意的挥霍
这种是一个人的态度问题,运行效率这东西就是一点一滴积累起来的。就好比物品整理的功能,原来的在手机上要运行1~2秒,所以必须得优化。
每写一段代码,都要为你所写的代码负责,这才能更好的提高自己的编程水平,更好的积累经验。不然等你哪天想写个大一点的程序,才想起要学优化,那已经晚了

我提到的几点思路,对你的pascal复制也是很有帮助的。


另外金前的运行效率还有待提高, 我用老式的笔记本,跑不起来。


【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-5 16:17 | 显示全部楼层
蓝烟清 发表于 2013-3-5 15:16
回复 weyl 的帖子

代码重用是另外一个方面, 而且说到代码重用并不是所谓的CTRL+C  CTRL+V 代码重用在国内 ...

作为业余的,计算机专业的东西大部分我都不懂,我只有一些比较粗浅的看法。

代码重用,我大概只能理解成就是把最基本的函数弄成像微软的API一样,参数搞得非常多,需要用时自己看着办。而整体的鼠标响应,连封装的思路都没有。
资源节省我是没能力和精力搞,就像我连把人物数据搞成动态数组都觉得费劲,现在看代码也能看到,完全都是静态数组。贴图也是现在这种没效率的方式。目前的更新主要是以修正bug为主。

前传绘图的方式与其他的pascal版是不同的,属于全屏重绘,而且pascal版全部是软件绘图。

编程文档是啥东西?据说游侠那个有在搞。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2013-3-5 16:56 | 显示全部楼层
回复 weyl 的帖子

那理解就不对了,并不是多定义API就是重用啊,还要考虑它的扩展性和独立性,越基层越好其实微软的每一个API内容是由很多个函数所组成的
而且只能比较高效的代码才值得保留啊

对于没有重载的语言,多定义函数参数是可以理解的

金前的代码我也看过,确实是鼠标事件都是在每个人key获取的时候判断。。。

其实可以考虑封装一套GUI界面。。。。像按钮是比较容易做的。。

前段时间做GUI界面,感觉要吐血,特别是窗口,巨复杂




【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-5 17:23 | 显示全部楼层
本帖最后由 weyl 于 2013-3-5 17:28 编辑

回复 蓝烟清 的帖子


软绘图的时候,图片资源的解码,是效率的一个瓶颈。从编译语言来看,这段代码几乎没有优化的余地了,或者考虑有没有高手用汇编把这部分搞出来?

点评

这样不好吧。。。。读取图片的算法不能控制,但是图片资源的大小至少可以控制  发表于 2013-3-5 17:28
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-5 22:10 | 显示全部楼层
公司项目写文档写跪了做自己的东西就略微随便放松点了。。反正没人继承瞎糊弄。。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-21 10:45 | 显示全部楼层
顶吧,都是好建议
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-27 11:53 | 显示全部楼层
回复 蓝烟清 的帖子

android版的也是用c+lua做的吗?
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2013-3-27 13:07 | 显示全部楼层
回复 roc_hgh 的帖子

不全的。 有JAVA的内容,必须用这个才能打成APK包
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-27 13:14 | 显示全部楼层
回复 蓝烟清 的帖子

那渲染部分还是用SDL吗?还是改成了OpenGl?我想用unity3d做个demo,主地图的素材用了论坛的Bt编辑器导出。但是主地图的贴图坐标不知道在哪个文件里面。
我也是玩金庸群侠传长大的,很有感情啊。最近才无意中发现大侠们把游戏复刻出来,还提供了源代码,很是佩服!

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-27 13:18 | 显示全部楼层
回复 蓝烟清 的帖子

看了这个帖子http://www.txdx.net/thread-1972-1-56.html貌似是:
BUILDING_002_______460,800__外景地图建筑贴图数据(树、山、房屋等)
BUILDX___002_______460,800__外景地图建筑覆盖x坐标(一个建筑可能覆盖几个地块坐标)
BUILDY___002_______460,800__外景地图建筑覆盖y坐标
EARTH____002_______460,800__外景地图底层贴图数据(地面、江河湖海、雪地、沙漠等)
SURFACE__002_______460,800__外景地图表面贴图数据(道路,花花草草等)

这些002文件,那里面的数据规则是什么呢,还请大神赐教!
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2013-3-27 13:21 | 显示全部楼层
回复 roc_hgh 的帖子

还是用SDL。 主地图坐标由 Building.002, Buildx.002, Buildy.002, Earth.002 几个文件组成

详细查看这个帖子
http://www.txdx.net/forum.php?mod=viewthread&tid=390512&highlight=%B4%F3%B5%D8%CD%BC


【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-27 13:46 | 显示全部楼层
LZ有心了~

不过把内存减到极致跟把效率提升到极致还是有区别的~
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2013-3-27 14:47 | 显示全部楼层
回复 winson7891 的帖子

运行效率和内存使用,两者之间其实没有太多关联减少只是去掉那些不必要消耗的内存,减少对资源的浪费而已。特别是对于手机程序的开发,因为本身手机的内存就比较小
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-28 10:37 | 显示全部楼层
回复 蓝烟清 的帖子

昨天看了002文件的教程,地板已经拼出来了,多谢!地图素材中有很多只有一个像素的图片,我随机查了几个,貌似在位置索引文件中没有用到,这些素材应该是没用的吧?

点评

有几个地方存在这些图片的数据,例如蝶谷附近的小丘陵。但是从显示效果看是多余的。  发表于 2013-3-28 12:50
没有用的。。可以忽略  发表于 2013-3-28 11:23
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-30 13:18 | 显示全部楼层
我只想说后人都是站在巨人的肩膀上,weyl说的复刻是非常谦虚的,本质上是重开发的不过是利用了金庸的资源。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-11-23 16:07

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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