如何利用亨元模式优化内存占用

  引言

        亨元模式又叫蝇量模式,英文名字是Flyweight,一看这名字就是要给对象进行瘦身的,通过共享内存的方式,减少对象的内存占用量。它用来解决“大量且重复的对象”的管理问题。随着计算机设备的不断升级,我们的内存越来越大,CPU频率越来越高,我们渐渐遗忘了在内存受限制的环境下对每一个字节(Byte)都很计较的程序编写方式。但是随着移动互联网的兴起,在手持设备上运行的程序所面临的内存大小受限制的问题又成了我们必须考虑的问题。虽然我们的手机性能也在不断的攀升,但是为了我们在手机端展现的程序效果更加丰富多彩,我们也需要更大的内存,因此在编写程序时对于内存的节约利用的编程技巧,在任何情况下都不会过时。

定义

        使用共享的方式,让拥有大量细粒度对象的系统能够高效的运行。

类图

        

  说明

FlyweightFactory(工厂类)

  1. 负责产生和管理Flyweight的组件。
  2. 内部通常使用容器类来存储共享的Flyweight组件。
  3. 提供工厂方法产生对应的组件,当产生的是共享组件时,就加入到Flyweight管理容器内。

Flyweight(组件接口)

  1. 定义组件的操作接口。

ConcreteFlyweight(可以共享的组件)

  1. 实现Flyweight接口
  2. 产生的组件是可以共享的,并加入到Flyweight管理器中。

UnsharedConcreteFlyweight(不可以共享的组件)

  1. 实现Flyweight接口,也可以选择不继承自Flyweight接口。
  2. 可以定义为单独的组件,不包含任何共享资源。
  3. 也可以将一些共享组件定义为类的成员,成为内部状态;并另外定义其他不被共享的成员,作为外部状态使用。

实例讲解

        在cocos2游戏开发中,当我们有大量的节点需要渲染时,引擎会帮我们自动进行合批处理。如果结点使用相同的纹理,相同的混合函数,相同的shader,就可以合并为一个drawcall。这样可以减少相同的数据从内存向GPU的传输次数和数量。当然这也需要图形API和显卡支持这一功能。

关于自动合批的详细讲解参见Cocos2dx3.0的自动批次渲染原理_yangchangda1的专栏-CSDN博客_cocos2dx批量渲染

在游戏编程模式一书中举了一个例子:

渲染拥有大量树木的森林场景,每一个树的实例可能拥有相同的网格和纹理数据。这时我们就可以把网格和纹理单独放到一个类里面实例化一个对象。把树的位置,颜色,高度,缩放比这些决定了每颗树对象的形态的属性放到树相关的类中。这样所有的树对象就不用在内部都保存一份网格和纹理数据,只需要维护一个指向包含网格和纹理数据的对象引用即可。这样就可以向GPU只发送一份网格和纹理数据,然后再单独地将每颗树实例的特有数据--位置,颜色,高度,缩放比推送到GPU。最后告诉GPU使用那个共享的网格和纹理模型来渲染每一个实例。

        将有可能散布在程序代码中,零碎的游戏对象属性进行统一管理,是亨元模式应用在游戏开发领域带来的好处之一。

参考:Flyweight · Design Patterns Revisited · Game Programming Patterns

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值