Cocos2dx项目--动作类游戏内存优化--Spine结构分析

项目接近尾声,需要做加载效率优化和内存优化。

在加载Spine制作的资源时候,我们需要将文件(.json)进行解析,然后创建对象

spAtlas* t_atlas = spAtlas_createFromFile(altas_name.c_str(), 0);    第一步 //加载纹理文件

spSkeletonJson* json = spSkeletonJson_create(t_atlas);         第二步 //根据上步产生的对象穿件JSON骨架

spSkeletonData* skeletonData = spSkeletonJson_readSkeletonDataFile(json, ske_name.c_str());  第三步 //根据骨架和名称加载骨架数据(真正的骨架)

spSkeletonJson_dispose(json);   第四步 //析构JSON骨架

SkeletonAnimation* t_ani = SkeletonAnimation::createWithData(spSkeletonData* skeletonData);  第五步 //创建对象

有经验的同学,应该知道,必须你程序当中需要10只黄色的小鸡。首先美术人员要通过Spine工具来创建一个黄色小鸡的工程文件,然后程序加载(A),创建10个对象(B)。

注意,每次创建一个小鸡对象的时候,都需要解析文件,然后创建对象。

解析文件(我们暂且叫A)是指:把(.JSON)文件从磁盘加载到内存,上述第一步到第四步,都是在干这件事。这地方,我们自己制作的动作文件,在windows上加载耗时高达2000ms,而在手机上加载达到100ms。手机和PC相差近20倍

根据加载后的数据创建对象(我们暂且叫B)。这地方耗时在PC和手机上基本一致,大概2ms

假设我们不做任何处理,想在PC上创建10只小鸡,那就是

A(2000ms)B(2ms), A(2000ms)B(2ms),A(2000ms)B(2ms), A(2000ms)B(2ms),A(2000ms)B(2ms), A(2000ms)B(2ms),A(2000ms)B(2ms), A(2000ms)B(2ms),A(2000ms)B(2ms), A(2000ms)B(2ms), = 2000*10+2*10 = 20020ms

很显然,我们在解析过程A浪费了大量时间,所以,我们希望的是一次加载,多次创建。这在原理上是可以行的通的。

A(2000ms)B(2ms)B(2ms)B(2ms)B(2ms)B(2ms)B(2ms)B(2ms)B(2ms)B(2ms)B(2ms) = 2000ms + 2*10 = 2020ms

这样,我们的事件可以大幅度降下来。

好了,我们一款游戏当中,肯能有小鸡,小鸭,小猫,小狗,几百种动物。那我们就直接在游戏开始时候,将所有动物的JSON文件都解析加载好。把它交给Loading吧,哈哈。然后在程序实时过程中,动态创建对象,就可以秒创建了。

而且有一点可以肯定的是,骨架文件解析后,占有内存特别小。在游戏中最占内存就是纹理了。所有想优化内存,我们要在纹理上想办法。

遗憾的是,spine的骨架加载完(A步),其实纹理就已经持有并一直存在了,如果想把纹理内存干掉,必须要把加载的骨架(A步的产物)干掉。但是如果把骨架干掉了,在创建对象的时候,可以需要重新加载对应的骨架文件(json),就很耗时了。

那就没办法了,我们既不想反复加载骨架而导致耗时,也不想在不渲染骨骼动画的时候,让纹理占有内存。忘了说一下,PC和手机在加载一张512*512的纹理时候,只需要60ms左右,但是其纹理内存确实有1M。所以,我们就想能不能再渲染前加纹理加载到内存,然后在使用完毕后,在将纹理内存卸载掉。

比如从主场景,进入战斗,需要加载技能特效,这些纹理,需要在使用时候加载,然后退出战斗就卸载掉。如果有频繁的操作,可以做纹理cache。本着这个目的,我们想怎么去改spine来达到这个目的呢。

改库很容易出现各种各样的错误和内存泄露,首先,我们必须要了解库的结构。然后在能从中做最小的最安全的修改来达到我们的目的。

这篇有点长,下边分析spine的数据结构

时间: 2024-10-24 04:30:59

Cocos2dx项目--动作类游戏内存优化--Spine结构分析的相关文章

Cocos2dx项目--动作类游戏内存优化--Spine结构分析1

SPine数据组织 spAtlas:这个是从.atlas文件中解出来的结构,其中包含了纹理 struct spAtlas { spAtlasPage* pages; spAtlasRegion* regions; void* rendererObject; int ref; }; 先不要管,看它的数据组织,spAtlasPage,spAtlasRegion,rendererObject都是什么东西?往下看 struct spAtlasPage { const spAtlas* atlas; co

笔记:利用Cocos2dx 3.3 lua 做一个动作类游戏(一)

在这之前,声明一下: 做不完我是小狗. 没办法,没毅力和恒心,之前的那个Quick Cocos2dx做的横版过关游戏的demo已经转成了3.3的版本了,其实也算是个半成品,战斗,UI啥的都有了,呵呵. 本次DEMO要达成的目的如下: 1 熟悉Cocos2dx 3.3 - lua 2 使用Joystick 3 完成简单的怪物AI 4 尝试扩展现有的api(可选) 嗯,差不多就以上了. 今天第一次笔记. 当前完成的任务有如下: 1 使用新的player新建项目 2 在场景中添加Sprite以及其帧动

即时动作类网络卡牌游戏开发真的很难

我的<凤舞三国>--即时动作策略类网络手机戏从策划到实施如今已经过了16个月了,终于到今年4月(2016年4月)有望出一个内测包给众多期望代理偶家产品的发行们.蓦然回首才发现,偶从2011年3月进入手游开发行业如今已经过去5年了- 不由发出一声感叹:"光阴如梭.人生苦短啊." 我们也像其他众多小游戏公司,在2014年确定了开发三代即时动作类网络卡牌游戏的目标,因为先找到了一个非常好的美术外包合作伙伴,所以当时我们非常有信心8个月能够定搞定该游戏.我们当时认为:就游戏产品开发

即时动作类网络卡牌游戏开发真的非常难

我的<凤舞三国>--即时动作策略类网络手机戏从策划到实施现在已经过了16个月了.最终到今年4月(2016年4月)有望出一个内測包给众多期望代理偶家产品的发行们.蓦然回首才发现,偶从2011年3月进入手游开发行业现在已经过去5年了- 不由发出一声感叹:"光阴如梭.人生苦短啊. " 我们也像其它众多小游戏公司.在2014年确定了开发三代即时动作类网络卡牌游戏的目标.由于先找到了一个很好的美术外包合作伙伴,所以当时我们很有信心8个月可以定搞定该游戏. 我们当时觉得:就游戏产品开发

转 cocos2dx内存优化 (之二)

一.cocos2dx之如何优化内存使用(高级篇) 本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=93 一.内存优化原则 为了优化应用内存,你应该知道是什么消耗了你应用的大部分内存,答案就是Texture(纹理)!它几乎占据了90%的应用内存.那么我们应该尽力去减小我们应用的纹理内存使用,否则我们的应用进程可能会被系统杀死. 为了减少内存警告,这里我们给出两个普遍的关于cocos2dx游戏内存优化的指导原则. 1)了解瓶颈,然后解决掉 什么样的纹

如何解决FPS/RTS/赛车类游戏的同步问题

算法简述 动作类游戏如何在高延迟下实现同步?不同的客户端网络情况,如何实现延迟补偿?十年前开始关注该问题,转眼十年已过,看到大家还在问这类问题,旧文一篇,略作补充(关于游戏同步相关问题还可以见我写于2005年的另外两篇文章,帧锁定算法 和 网游同步法则): 影子跟随算法由普通DR(dead reckoning)算法发展而来,我将其称为"影子跟随"意再表示算法同步策略的主要思想: 1. 屏幕上现实的实体(entity)只是不停的追逐它的"影子"(shadow). 2.

unity3d游戏开发经验之对于关卡类游戏的技巧

过关类游戏在单机类游戏中出现会比较多,但多以休闲为主,比如<Candy Crush>.<Angry Birds>.<P V Z>.<小鳄鱼顽皮爱洗澡>.<Tiny Thief>等经典休闲游戏,鉴于很多圈内人士预测2014年是手游爆发年,且重点在ARPG类型,似乎会冒出很多横版过关或者全3D的过关动作类游戏,我们就针对此类型的游戏进行分析. 首先,此类型的游戏需要关注的是每关卡的独立玩家数量,即玩家ID数量,目的是为了监测玩家主要集中在哪个阶段.比

Redis系列--内存淘汰机制(含单机版内存优化建议)

https://blog.csdn.net/Jack__Frost/article/details/72478400?locationNum=13&fps=1 每台redis的服务器的内存都是有限的,而且也不是所有的内存都用来存储信息.而且redis的实现并没有在内存这块做太多的优化,所以实现者为了防止内存过于饱和,采取了一些措施来管控内存. 文章结构:(1)内存策略:(2)内存释放机制原理:(3)项目中如何合理应用淘汰策略:(4)单机版Redis内存优化注意点. 一.内存策略:先来吃份官方文档

cocos2dx 游戏中内存优化

全文如下: 我目前正完成我的最后一个合约项目.在这个项目的最后阶段,我需要考虑的一件事情就是如何优化游戏的内存使用. 在今天的iDevBlogADay文章中,我将向大家讲述,我是如何减少25-30MB游戏内存消耗的(现在游戏消耗内存90-95MB,我还通过这个过程,消除了一些由于内存警告而引起的程序崩溃问题).同时,我还将游戏程序的大小从25MB减少到了20MB以下(如果苹果没有在不久前将蜂窝网下载应用的限制从20MB提高到50MB的话,那么我这个小的优化就太棒了,它可以潜在地给我带来更多的下载