码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 23.亨元模式


    1.什么是共享模式?

    共享模式是一种结构型设计模式,它丢弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让我们能在有限的内存容量中载入更多的对象。

    1.1 共享模式解决的问题

    首先抛出一个问题:
    假如我们要开发一个真实的粒子系统,开发完成后, 你推送提交了最新版本的程序, 并在编译后将其发送给了一个朋友进行测试。 尽管该游戏在你的电脑上完美运行, 但是你的朋友却无法长时间进行: 粒子系统总是会在他的电脑上运行几分钟后崩溃。 在研究了几个小时的调试消息记录后, 你发现导致程序崩溃的原因是内存容量不足。 朋友的设备性能远比不上你的电脑, 因此游戏运行在他的电脑上时很快就会出现问题。
    真正的问题与粒子系统有关。 每个粒子 都由包含完整数据的独立对象来表示。 当程序运行导某一时刻, 粒子系统将无法在剩余内存中载入新建粒子, 于是程序就崩溃了。

    1.1.1 重现上面的问题

    下面我们来做一个粒子系统并重现上面的问题(内存消耗严重):
    参考博客: Java粒子系统(烟花篇)_DwLuffy的博客-CSDN博客
    在这里插入图片描述

    在这里插入图片描述

    可以看到现在的内存消耗已经突破1G了,对于这样的一个小程序,这样的内存消耗是不是有点太大了。

    通过检查程序我们发现主要问题在这里:

    while (true) {
        // 画背景
        g = panel.getGraphics();
        // 生成粒子放入链表
        Particle tp = new Particle();
        tp.position = new VecT(startX, startY);
        tp.velocity = new VecT(10, -20);// 速度向量
        tp.acceleration = sampleDirection();
        tp.life = 30;
        tp.age = 1;
        tp.color = new Color(255, 0, 255);
        tp.size = 12;
        particleArrayList.add(tp);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在程序里的循环里不断新建Particle对象,且Partcle中的成员也都是用新建对象的方式来填充的,而新建这样的对象进行使用是需要内存的。
    代码地址如下:设计模式/src/main/java/FlyweightPattern/first · 严家豆/Head first 设计模式学习 - 码云 - 开源中国 (gitee.com)
    那么如何解决呢? 答案是共享模式,我们可以用共享模式对这个问题进行解决。

    1.2 解决方案: 共享模式

    通过观察上面的代码,我们发现每次新建Particle对象都会重新创建一些相同的VecT对象和Color对象。

    我们是不是可以通过共享模式:丢弃在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让我们能在有限的内存容量中载入更多的对象。 来节省内存使用
    也就是说,对于那些已知取值范围且可列举的部分对象(不变),我们可以使用先创建,然后使用引用的方式将其填充到新建的对象中。
    以Color为例,我们可以像下面这样做:

    private final List<Color> colorList = new ArrayList<>();
    //先创建10个Color对象
    for(int i=0;i<10;i++){
        int r = c.getRGB();
        colorList.add(new Color((int) (r-(int)1000*(Math.random()))));
    }
    //需要Color对象的时候,直接根据随机条件进行取出,无需创建
    tp.color = colorList.get((int) (Math.random() * 10));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这样的话,我们就可以减少new Color()的次数,从而减少内存的占用,也能达到和前面相同的效果。
    在这里插入图片描述

    地址如下:
    设计模式/src/main/java/FlyweightPattern/betterFirst · 严家豆/Head first 设计模式学习 - 码云 - 开源中国 (gitee.com)

    最后本文的内容主要吸收总结与一个很好的设计模式学习网站:
    设计模式学习网站 (refactoringguru.cn) 推荐大家访问学习

  • 相关阅读:
    保障网络安全:IP代理识别API的作用与应用
    A. Almost Equal
    rust 生命周期的问题请教 slqx fromRow的问题
    智慧养老整体解决方案
    2023-09-09 LeetCode每日一题(课程表)
    SpringBoot读取Resource下文件
    OPPO 一加 真我 vivo iQOO手撕 10 11 12系统 都可以开
    RANKGEN: Improving Text Generation with Large Ranking Models论文
    基于深度学习的人脸识别闸机开发(基于飞桨PaddlePaddle)
    cpu负载4800,根目录磁盘100%,问题排查和解决
  • 原文地址:https://blog.csdn.net/c1776167012/article/details/126448364
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号