享元模式引發的關于ECS和對象池的思考記錄

文章目錄

  • 概念概述
  • 解決了什么
  • 區別與聯系
  • 享元模式的某個例子的細節分析

概念概述

  • ECS(Entity-Component-System)
    1、Entity(實體):唯一標識符。
    2、Component(組件):純數據容器(提一嘴UI實例,UI實例的引用可以作為數據放這里,system便可以使用)。
    3、System(系統):負責邏輯處理。
  • 享元模式(Flyweight Pattern)
    1、核心思想:通過共享技術來高效地支持大量細粒度對象的復用。
    2、它通過將對象的內在狀態(不變部分)和外在狀態(可變部分)分離,減少內存占用和對象創建開銷。
  • 對象池(Object-Pool)
    1、維護一組可復用的對象實例。
    2、使用從池中取用完放回,避免頻繁創建和銷毀對象。

解決了什么

  • ECS
解耦與靈活性性能優化代碼可維護性
傳統面向對象繼承會導致復雜的類層次結構(如 Monster -> FlyingMonster -> BossMonster )數據連續性:同類型組件在內存中連續存儲,適合批量處理(如所有 PhysicsComponent 一起更新)邏輯集中在 System 中,避免分散在多個類里
ECS 通過組合(Component)替代繼承,動態組裝實體行為(如給實體添加 FlyComponent 即可飛行)多線程友好:不同 System 可以并行處理(如渲染和物理計算分離)新增功能只需添加新組件和系統,無需修改現有代碼。

slfnte:ui&btl_uni_one_frm.

interface UIComponent {uiInstance: Laya.Sprite;isVisible: boolean;
}

復雜類設計關鍵區別說明

特性容器類設計ECS設計
實體表示包含組件的對象簡單的數字ID
組件訪問character.healthcomponents.health.get(id)
系統處理對象調用自己的方法系統批量處理所有同類組件
內存布局組件分散存儲同類型組件連續存儲
添加組件需要修改類定義動態注冊到組件Map
  • 享元模式
內存消耗問題對象創建性能問題數據冗余問題
當需要創建大量相似對象時(如游戲中的樹木、子彈、NPC等),直接實例化會導致內存爆炸。頻繁創建/銷毀對象會引發GC壓力(如JavaScript的垃圾回收)多個對象包含重復數據(如相同紋理、模型)
享元方案:共享相同的內在狀態,僅存儲一份。享元方案:通過對象池復用已有實例。享元方案:將重復數據提取為共享部分
  • 對象池
性能開銷問題內存碎片問題實時性要求
問題頻繁實例化和銷毀對象(如子彈、敵人、粒子效果)會導致高CPU和內存開銷(尤其是構造函數復雜或GC壓力大的語言)。反復分配/釋放內存可能引發內存碎片(尤其在C++等手動管理內存的語言中)游戲或實時系統中,突發需求(如爆炸產生100顆爆炸碎片)可能導致瞬時卡頓。
解決通過復用已有對象,減少 new/delete 或 instantiate/destroy 調用對象池保持內存塊連續,提升內存訪問效率預初始化對象池,確保快速響應。

區別與聯系

  • 享元模式 vs 對象池
特性享元模式對象池
目標共享不可變數據復用可回收完整對象
適用場景紋理、配置、模型等靜態資源/共同的邏輯函數子彈、敵人等動態游戲對象
狀態管理分離內在/外在狀態對象完全一致,無狀態分離/對象需重置后復用
  • 高頻復雜大量可復用對象=> ECS+對象池+享元模式 === [王炸]

享元模式的某個例子的細節分析

  • 側重記錄這部分是因為思考是被享元模式引起的
    享元模式與普通的繼承模式對比節省內存的例子之一分析如下:
  1. 場景:
  • 需要100個精靈實例,每個精靈實例有n個屬性和3個函數
  • 方式1:通過繼承模式組織類(有1個ExtCls1
  • 方式2:通過享元模式+組合關系(有一個ExtCls2和一個享元類ThreeMthCls,ExtCls2引用了ThreeMthCls
  1. 對比依據(V8 需要為每個實例維護方法訪問路徑):
純繼承模式繼承+引用享元類模式
指針 vs 方法副本100 個 24 字節方法引用包裝100 個 8 字節指針
實例創建100個ExtCls1100個ExtCls2 + 共同引用1個ThreeMthCls

說明:雖然繼承后創建的實例的函數時共享原型鏈上的,但是每個實例都要維護對應的方法訪問路徑(消耗38 * 100 =2400(B));分離后只需要共享1個內在狀態類即可(消耗18*100=800(B))

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95982.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95982.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95982.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STM32驅動SG90舵機全解析:從PWM原理到多舵機協同控制

一、SG90舵機核心特性 1.1 基本參數與選型 SG90作為??微型舵機的代表??,憑借其??輕量化設計??(僅9g)和??高性價比??,在機器人、智能小車和云臺系統中廣泛應用: ??關鍵參數對比??: ??參數?? 180定位舵機 360連續旋轉舵機 ??控制目標?? 精確…

goland怎么取消自動刪除未使用的包

1.settings-Go-Imports-取消勾選Optimize imports on the fly2.settings-Tools-取消勾選Optimize imports

halcon基于透視的可變形模型匹配

算子1,create_planar_uncalib_deformable_model_xld***基于平面未校準的輪廓模型算子2,find_planar_uncalib_deformable_model***查找平面未校準可變形模型算子3,projective_trans_contour_xld***將輪廓進行透視變換附加算子 算子4read_conto…

Flink Stream API - 源碼開發需求描述

概述 本文介紹如何基于Flink源碼進行二次開發,實現一個動態規則引擎系統。通過自定義算子和算子協調器,實現數據流的動態規則計算和協調管理。以此更好理解前面介紹的源碼相關文章 項目需求 核心功能 實現一個動態規則引擎,具備以下特性&…

「 CentOS7 安裝部署k8s」

一、Linux系統部署K8s還是非常便利的,只需要掌握Linux常用命令,便可以迅速部署,一起來學習一下吧1、運行以下命令更新系統并安裝必要工具:yum update -y yum install -y yum-utils device-mapper-persistent-data lvm22、安裝Dock…

Disbursement on Quarantine Policy(概率、逆元計算期望)

題目描述There is a train with n rows, and there are m seats per row. All seats are occupied. For some passengers, we know they are being infected with COVID-19 or not. However, for other passengers, we are not sure about their status, and we assume each of…

AI 在金融領域的落地案例

目錄 引言 一、信貸風控:基于 LoRA 的 Qwen-7B 模型微調(適配城商行審批場景) 場景背景 核心代碼 1. 環境依賴安裝 2. 金融數據集加載與預處理(城商行信貸數據) 3. LoRA 微調 Qwen-7B 模型 4. 模型推理&#xf…

平衡二叉樹的調整

平衡二叉樹的定義平衡二叉樹(balanced binary tree),又稱AVL樹(Adelson-Velskii and Landis)。 一棵平衡二叉樹或者是空樹,或者是具有下列性質的二叉排序樹:① 左子樹與右子樹的高度之差的絕對值小于等于1;…

深入解析:如何設計靈活且可維護的自定義消息機制

深入解析:如何設計靈活且可維護的自定義消息機制 引言 在現代軟件開發中,組件間的通信機制至關重要。無論是前端框架中的組件交互,還是后端服務間的消息傳遞,一個良好的消息機制能顯著提升代碼的可維護性和擴展性。本文將深入探討…

PostgreSQL——用戶管理

PostgreSQL用戶管理一、組角色管理1.1、創建組角色1.2、查看和修改組角色1.3、刪除組角色二、角色的各種權限2.1、LOGIN(登錄)2.2、SUPERUSER(超級用戶)3.3、CREATEDB(創建數據庫)3.4、CREATEROLE&#xff…

東軟8位MCU使用問題總結

簡介用的單片機為ES7P7021,采用8位RISC內核,2KB的FLASH,128bit的RAM。編譯器使用東軟提供的iDesigner,開發過程中編譯器和單片機有一些地方使用時需要注意下。1.RAMclear()函數注意問題/****************************************…

深度學習在訂單簿分析與短期價格預測中的應用探索

一、訂單簿數據特性及預處理 1.1 訂單簿數據結構解析 在金融交易領域,訂單簿是市場微觀結構的集中體現,它記錄了不同價格水平的買賣訂單信息。一個典型的訂單簿由多個層級組成,每個層級包含特定價格上的買單和賣單數量。例如,在某…

Hashmap源碼

目錄 HashMap底層原理 JDK1.8及以后底層結構為:數組鏈表紅黑樹 默認參數 擴容機制 數組 鏈表 紅黑樹 HashMap為什么用紅黑樹不用B樹 HashMap什么時候擴容 HashMap的長度為什么是 2的 N 次方 HashMap底層原理 JDK1.8及以后底層結構為:數組鏈表紅…

【JAVA 字符串常量池、new String的存儲機制、==與equals的區別,以及字符串重新賦值時的指向變化】

系列文章目錄 提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加 提示:寫完文章后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄系列文章目錄代碼原理解錯誤邏輯理解理解與修正&#xff1a…

博客項目 Spring + Redis + Mysql

基礎模塊1. 郵箱發送功能最初設計的接口 (雛形)public interface EmailService {/*** 發送驗證碼郵件** param email 目標郵箱* return 發送的code* throws RuntimeException 如果發送郵件失敗,將拋出異常*/String sendVerificationCode(Stri…

前端處理導出PDF。Vue導出pdf

前言:該篇主要是解決一些簡單的頁面內容導出為PDF1.安裝依賴使用到兩個依賴,項目目錄下運行這兩個//頁面轉換成圖片 npm install --save html2canvas //圖片轉換成pdf npm install jspdf --save 2.創建通用工具類exportPdf.js文件可以保存在工具類目錄下…

【GM3568JHF】FPGA+ARM異構開發板燒錄指南

1. Windows燒錄說明 SDK 提供 Windows 燒寫工具(工具版本需要 V3.31或以上),工具位于工程根目錄: tools/ ├── windows/RKDevTool 如下圖,編譯生成相應的固件后,設備燒寫需要進入 MASKROM 或 LOADER 燒寫模式,準備…

C++ 多進程編程深度解析【C++進階每日一學】

文章目錄一、引言二、核心概念:進程 (Process)功能與作用三、C 多進程的實現方式四、核心函數詳解1. fork() - 創建子進程函數原型功能說明返回值完整使用格式2. wait() 和 waitpid() - 等待子進程結束函數原型參數與返回值詳解3. exec 系列函數 - 執行新程序函數族…

一周學會Matplotlib3 Python 數據可視化-繪制面積圖(Area)

鋒哥原創的Matplotlib3 Python數據可視化視頻教程: 2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程講解利用python進行數據可視化 科研繪圖-Matplotlib,學習Matplotlib圖形參數基本設置&…

北京JAVA基礎面試30天打卡11

1.索引創建注意事項 適合的場景 1.頻繁使用where語句查詢的字段 2.關聯字段需要建立索 3.如果不創建索引,那么在連接的過程中,每個值都會進行一次全表掃描 4.分組和排序字段可以建立索引因為索引天生就是有序的,在分組和排序時優勢不言而喻 5…