从销售角度来看,你的全新手机游戏总是应该适用于今天人们所使用的大多数设备。“大多数设备”可能会让开发者感到惊讶。在2015年1月,世界各地的手机用户数已经达到36亿人。所以开发者的工作便是让游戏/应用能够适应这些设备的种种硬件约束条件。开发者们在开发像游戏等需要耗费内存的软件时需要进行更多思考。通过编写这篇文章,我希望能够帮助一些不了解技术的人进一步理解一些内存问题,而这也是他们在致力于2D游戏项目时需要考虑的内容。
1)内存泄露:
内存泄露指的是未被释放的分配内存块。
类比:让我们想象你在一个拥有3个方形储物柜的房间寻找一个储物柜。
1.John和Danny“需要”储存自己的装备,而一个储物柜便足以满足他们每个人。所以现在我们拥有2个已被使用的储物柜,以及1个闲置的储物柜。
2.这时候John需要储存他的头盔,并且不再需要他之前储存的装备。所以现在最理想的情况是他应该拿出之前的装备并将头盔装进去。但是他却向管理者请求另一个储物柜并希望将头盔放在全新储物柜中。从逻辑上看,在这之后所有的储物柜便都满了。而现在的John会忘记自己储存在第一个储物柜中的装备。
3.现在Danny需要储存2个头盔并需要2个储物柜,所以他决定拿掉自己的装备并空出1个储物柜。然后他向管理者申请了一个新的储物柜,但是因为所有储物柜都满了所以遭到了管理者的拒绝。
在这里,即使John从储物柜中拿掉无用的装备,Danny也不能再使用多出来的储存空间。
2)相同纹理的多个例子:
一个纹理将占用宽度*高度*4(游戏邦注:红色,绿色,蓝色和透明度各占据1个字节)的储存空间。所以一张512×512规格的图像将占据1.05兆的内存。而同样的纹理将占据其3倍的储存空间,也就是3.15兆。所以如果我们想要使用这些图像作为纹理的话我们便需要准备多出3倍的内存。
类比:让我们以一张呈现出你最喜欢的角色“buttman”并且不能无限次使用的方形贴纸为例。
2.这时候John需要储存他的头盔,并且不再需要他之前储存的装备。所以现在最理想的情况是他应该拿出之前的装备并将头盔装进去。但是他却向管理者请求另一个储物柜并希望将头盔放在全新储物柜中。从逻辑上看,在这之后所有的储物柜便都满了。而现在的John会忘记自己储存在第一个储物柜中的装备。
3.现在Danny需要储存2个头盔并需要2个储物柜,所以他决定拿掉自己的装备并空出1个储物柜。然后他向管理者申请了一个新的储物柜,但是因为所有储物柜都满了所以遭到了管理者的拒绝。
在这里,即使John从储物柜中拿掉无用的装备,Danny也不能再使用多出来的储存空间。
2)相同纹理的多个例子:
一个纹理将占用宽度*高度*4(游戏邦注:红色,绿色,蓝色和透明度各占据1个字节)的储存空间。所以一张512×512规格的图像将占据1.05兆的内存。而同样的纹理将占据其3倍的储存空间,也就是3.15兆。所以如果我们想要使用这些图像作为纹理的话我们便需要准备多出3倍的内存。
类比:让我们以一张呈现出你最喜欢的角色“buttman”并且不能无限次使用的方形贴纸为例。
你需要将这个新角色呈现给3个不同的人。所以你能够:
1.获得2张一样的贴纸,获得3个木质框架能够在上面贴贴纸,并且你将把这些木制框架递交给那3个人。
2.让那3个人去获得属于自己的木制框架并让他们将贴纸贴到框架上。
第2个例子适合我们,因为我们可以反复使用同样的贴纸。这也适用于软件程序中,即所有人可以同时想到buttman。
3)不必要的迭代:
比起多次调用,在资源中调用for/while循环更简单。你可以在一个循环中处理多个任务。
类比:你是一个间谍,并需要向3个遥远的不同场所运输包裹。并且你需要从这3个不同场所的不同boss那收集到重要的秘密信息。
因为你是从不同boss那接到这些任务,所以你可以:
1.根据不同boss去分配你的任务。例如你可以驾车前往所有的这3个场所并先完成bossA所分配的任务,然后再驾车前往同样的3个场所完成BossB所分配的任务。反之亦然。
2.根据不同场所去分配你的任务。例如你可以先驾车前往第一个场所,递交包裹并获得信息,然后再驾车前往下个场所。
如果你所制定的任务计划是像第1种情况那样的话你便是一个愚蠢的间谍,因为你需要花费更多时间和资源去完成同样的任务。
4)在内存中保留未使用的对象:
任何时候都只有一定的对象能够被使用或出现在屏幕上。因为我们拥有优先的内存空间,所以任何被留在内存里的额外对象都是在耗费资源。
类比:你需要将一辆马车从A点推到B点。让我们假设如果马车未负载任何东西或者载着最轻的东西,这便是一个较简单的任务。但是因为你喜欢啤酒,所以你选择用马车去载一桶啤酒,从而加重了自己任务的难度。
所以在这里的最佳解决方法便是放弃你所深爱的啤酒。
这里所列出的问题绝对超过我在一篇文章中能够写下的内容。作为一名开发者,你应该尽快识别这些问题并使用有效的解决方法。先克服这些挑战再发行产品是真正让人兴奋的游戏开发过程。每个人每一天只拥有24个小时。对于我们而言,人们能够花费这些宝贵的时间去尝试我们所创造的内容便是推动着我们去开发游戏的最佳动力。
1.获得2张一样的贴纸,获得3个木质框架能够在上面贴贴纸,并且你将把这些木制框架递交给那3个人。
2.让那3个人去获得属于自己的木制框架并让他们将贴纸贴到框架上。
第2个例子适合我们,因为我们可以反复使用同样的贴纸。这也适用于软件程序中,即所有人可以同时想到buttman。
3)不必要的迭代:
比起多次调用,在资源中调用for/while循环更简单。你可以在一个循环中处理多个任务。
类比:你是一个间谍,并需要向3个遥远的不同场所运输包裹。并且你需要从这3个不同场所的不同boss那收集到重要的秘密信息。
因为你是从不同boss那接到这些任务,所以你可以:
1.根据不同boss去分配你的任务。例如你可以驾车前往所有的这3个场所并先完成bossA所分配的任务,然后再驾车前往同样的3个场所完成BossB所分配的任务。反之亦然。
2.根据不同场所去分配你的任务。例如你可以先驾车前往第一个场所,递交包裹并获得信息,然后再驾车前往下个场所。
如果你所制定的任务计划是像第1种情况那样的话你便是一个愚蠢的间谍,因为你需要花费更多时间和资源去完成同样的任务。
4)在内存中保留未使用的对象:
任何时候都只有一定的对象能够被使用或出现在屏幕上。因为我们拥有优先的内存空间,所以任何被留在内存里的额外对象都是在耗费资源。
类比:你需要将一辆马车从A点推到B点。让我们假设如果马车未负载任何东西或者载着最轻的东西,这便是一个较简单的任务。但是因为你喜欢啤酒,所以你选择用马车去载一桶啤酒,从而加重了自己任务的难度。
所以在这里的最佳解决方法便是放弃你所深爱的啤酒。
这里所列出的问题绝对超过我在一篇文章中能够写下的内容。作为一名开发者,你应该尽快识别这些问题并使用有效的解决方法。先克服这些挑战再发行产品是真正让人兴奋的游戏开发过程。每个人每一天只拥有24个小时。对于我们而言,人们能够花费这些宝贵的时间去尝试我们所创造的内容便是推动着我们去开发游戏的最佳动力。