Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optimize memory issues of BMFont. #4651

Merged
merged 2 commits into from Jun 24, 2019

Conversation

@caryliu1999
Copy link
Contributor

commented Jun 18, 2019

Re: cocos-creator/2d-tasks#

问题说明:

反馈自论坛开发者: https://forum.cocos.com/t/bmfont-demo/79336
用户使用2048*2048的BMFont图片记录大约2800个文字,当创建多个使用该BMFont资源的Label时,会创建多份记录2800个FontLetterDefinition对象数据的FontAtlas,导致占用大量的内存。

解决方案:

  1. 增加FontAtlas的缓存机制,避免多个Label使用相同的BMFont时,仍然会创建多份存储大量FontLetterDefinition数据的FontAtlas对象,保证使用相同的BMFont资源只会存在一份FontAtlas对象数据。

  2. FontAtlas的缓存会进行引用记录,当引用该数据的所有节点组件全部销毁时会清除该FontAtlas对象数据,避免内存占用。另外在场景切换的时候,会去重置掉所有组件使用的对象数据,为了保证不会存在冗余数据,在场景切换时也会清空掉所有缓存的FontAtlas。再次使用BMFont时,如果没有缓存会重新创建FontAtlas。

caryliu1999 added some commits Jun 18, 2019

@holycanvas
Copy link
Contributor

left a comment

感觉没什么问题,只是有个想法,如果fontAtlas不跟着组件走,而是直接放在BMFont资源类里面,在加载BMFont之后,直接初始化一个fontAtlas出来,这样复用BMFont的label都复用了一份fontAtlas,这样貌似连引用都不用做了,在资源被destroy的时候,再去把fontAtlas删除就好了

@caryliu1999

This comment has been minimized.

Copy link
Contributor Author

commented Jun 24, 2019

感觉没什么问题,只是有个想法,如果fontAtlas不跟着组件走,而是直接放在BMFont资源类里面,在加载BMFont之后,直接初始化一个fontAtlas出来,这样复用BMFont的label都复用了一份fontAtlas,这样貌似连引用都不用做了,在资源被destroy的时候,再去把fontAtlas删除就好了

是可以把fontAtlas跟BMFont绑定。不过定义的letterDefinitions字符对象有非资源配置相关的自定义字段,确认没什么用之后,可以删掉,然后在CCBMFont中把缓存数据直接解析为可直接使用的fontAtlas,保证CCBMFont资源与逻辑无关就可以。

@jareguo jareguo merged commit d795408 into cocos-creator:v2.1.2 Jun 24, 2019

1 check passed

ci/circleci: test Your tests passed on CircleCI!
Details
@jareguo

This comment has been minimized.

Copy link
Contributor

commented Jun 24, 2019

先合并,后续优化麻烦再放到下个版本

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
3 participants
You can’t perform that action at this time.