• unity3d客户端框架 基于类对象池的可回收变量 代码实现


    1 类对象池介绍

            因为原先已经写过一篇文章了,里面已经写明白了类对象池是什么?具体特征是什么?优缺点都有什么?大家如果有兴趣可以点下面的文章去细看一下。如果懂原理直接看代码即可。

    类对象池设计思想与代码实现:

    类对象池设计:​​​​​​Unity3d框架搭建 使用 类对象池技术 优化 C#语言 GC_天才小熊猫oo的博客-CSDN博客

    2.基于类对象池的可回收变量设计
     

            可回收变量 是基于引用计数去做的管理,基类实现了引用计数增加,和释放功能,当调用引用计数增加函数时,引用计数+1;当调用释放函数时候,引用计数-1,当引用计数==0的时候,类对象池会把该可回收变量对象回收。

    2.1已支持的类型

    目前一共封装了一些常用的类型:bool、byte、byte[]、float、gameobject、int、long、string、transform。这个如果有新的常用数据结构也可以自行封装。

    2.2 函数设计 

            每个封装的变量内都有无参Alloc构造函数,这个构造主要是从类对象池取出对象并且重置具体数据,引用计数+1。有参Alloc构造函数,这个函数会调用无参Alloc构造函数,取出池中的数据后,会将传入的数据赋值给封装变量的真实数据。隐式类型转换,使用c#中的operator关键字和 implicit关键字,可以直接将等号右边的封装结构,直接转换成真实数据类型。

    3.代码设计实现

    VariableBase.cs代码实现

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using YouYou;
    7. namespace Myh
    8. {
    9. //变量基类
    10. public abstract class VariableBase
    11. {
    12. public abstract Type Type
    13. {
    14. get;
    15. }
    16. //引用计数
    17. public byte ReferenceCount
    18. {
    19. private set;
    20. get;
    21. }
    22. //保留对象(引用计数+1)
    23. public void Retain()
    24. {
    25. ++ReferenceCount;
    26. }
    27. //释放对象(如果引用的对象数量==0,则把this回池)
    28. public void Release()
    29. {
    30. --ReferenceCount;
    31. if (ReferenceCount < 1)
    32. {
    33. //回池,入队列
    34. GameEntry.Pool.EnqueueVarObject(this);
    35. }
    36. }
    37. }
    38. }

    Variable.cs代码实现

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using YouYou;
    7. namespace Myh
    8. {
    9. public class Variable<T>:VariableBase
    10. {
    11. //当前存储的实例的类型(T类型的实例)
    12. public T Value;
    13. //变量类型
    14. public override Type Type
    15. {
    16. get
    17. {
    18. return typeof(T);
    19. }
    20. }
    21. }
    22. }

    VarByte.cs 代码实现

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using YouYou;
    7. namespace Myh
    8. {
    9. //byte变量
    10. public class VarByte:Variable<byte>
    11. {
    12. //分配一个对象
    13. public static VarByte Alloc()
    14. {
    15. VarByte var = GameEntry.Pool.DequeueVarObject();
    16. var.Value = 0;
    17. var.Retain();
    18. return var;
    19. }
    20. //分配一个对象 根据传入的byte
    21. public static VarByte Alloc(byte value)
    22. {
    23. VarByte var = Alloc();
    24. var.Value = value;
    25. return var;
    26. }
    27. //VarByte->byte 声明隐式转换,编译期间编译器忽视这种类型的隐式转换
    28. public static implicit operator byte(VarByte value)
    29. {
    30. return value.Value;
    31. }
    32. }
    33. }

    VarByte.cs 代码实现

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using YouYou;
    7. namespace Myh
    8. {
    9. //bool变量
    10. public class VarBool : Variable<bool>
    11. {
    12. //分配一个对象
    13. public static VarBool Alloc()
    14. {
    15. VarBool var = GameEntry.Pool.DequeueVarObject();
    16. var.Value = false;
    17. //持有数量+1,+1+1+1~
    18. var.Retain();
    19. return var;
    20. }
    21. //分配一个对象
    22. public static VarBool Alloc(bool value)
    23. {
    24. VarBool var = Alloc();
    25. var.Value = value;
    26. return var;
    27. }
    28. //声明的隐式转换,如果这样写编译期间就不会对转换的类型进行检查
    29. public static implicit operator bool(VarBool value)
    30. {
    31. return value.Value;
    32. }
    33. //还缺一个直接把VarBool赋值成具体值的函数
    34. }
    35. }

    VarBytes.cs代码实现

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using YouYou;
    7. namespace Myh
    8. {
    9. //byte[] 变量
    10. public class VarBytes : Variable<byte[]>
    11. {
    12. //分配一个对象
    13. public static VarBytes Alloc()
    14. {
    15. //从类对象池里取出varBytes对象
    16. VarBytes var = GameEntry.Pool.DequeueVarObject();
    17. //初始值为null
    18. var.Value = null;
    19. var.Retain();
    20. return var;
    21. }
    22. //分配一个对象(by 传入的 byte[])
    23. public static VarBytes Alloc(byte[] value)
    24. {
    25. VarBytes var = Alloc();
    26. var.Value = value;
    27. return var;
    28. }
    29. //Varbytes->byte[]
    30. //把真实数据的指着赋给byte[] ,赋值完之后,回收也没关系,因为下一次Alloc的时候会把Value赋值成null
    31. public static implicit operator byte[](VarBytes value)
    32. {
    33. return value.Value;
    34. }
    35. }
    36. }

    VarFloat.cs代码实现

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using YouYou;
    7. namespace Myh
    8. {
    9. //float变量
    10. public class VarFloat:Variable<float>
    11. {
    12. //分配一个对象
    13. public static VarFloat Alloc()
    14. {
    15. VarFloat var = GameEntry.Pool.DequeueVarObject();
    16. var.Value = 0f;
    17. var.Retain();
    18. return var;
    19. }
    20. //分配一个对象(value使用传入的float值)
    21. public static VarFloat Alloc(float value)
    22. {
    23. VarFloat var = Alloc();
    24. var.Value = value;
    25. return var;
    26. }
    27. //VarFloat -> float
    28. public static implicit operator float(VarFloat value)
    29. {
    30. return value.Value;
    31. }
    32. }
    33. }

    VarGameObject.cs代码实现

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using YouYou;
    7. using UnityEngine;
    8. namespace Myh
    9. {
    10. //GameObject
    11. public class VarGameObject:Variable<GameObject>
    12. {
    13. //分配一个GameObject对象
    14. public static VarGameObject Alloc()
    15. {
    16. VarGameObject var = GameEntry.Pool.DequeueVarObject();
    17. var.Value = null;
    18. var.Retain();
    19. return var;
    20. }
    21. //分配一个GameObject对象
    22. public static VarGameObject Alloc(GameObject value)
    23. {
    24. VarGameObject var = Alloc();
    25. var.Value = value;
    26. return var;
    27. }
    28. public static implicit operator GameObject(VarGameObject value)
    29. {
    30. return value.Value;
    31. }
    32. }
    33. }

    VarInt代码实现

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using YouYou;
    7. namespace Myh
    8. {
    9. //int变量
    10. public class VarInt:Variable<int>
    11. {
    12. //分配一个对象
    13. public static VarInt Alloc()
    14. {
    15. VarInt var = GameEntry.Pool.DequeueVarObject();
    16. var.Value = 0;
    17. var.Retain();
    18. return var;
    19. }
    20. //分配一个对象(value使用传入的int值)
    21. public static VarInt Alloc(int value)
    22. {
    23. VarInt var = Alloc();
    24. var.Value = value;
    25. return var;
    26. }
    27. //VarInt -> int
    28. public static implicit operator int(VarInt value)
    29. {
    30. return value.Value;
    31. }
    32. }
    33. }

    VarLong.cs代码实现

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using YouYou;
    7. namespace Myh
    8. {
    9. //int变量
    10. public class VarInt:Variable<int>
    11. {
    12. //分配一个对象
    13. public static VarInt Alloc()
    14. {
    15. VarInt var = GameEntry.Pool.DequeueVarObject();
    16. var.Value = 0;
    17. var.Retain();
    18. return var;
    19. }
    20. //分配一个对象(value使用传入的int值)
    21. public static VarInt Alloc(int value)
    22. {
    23. VarInt var = Alloc();
    24. var.Value = value;
    25. return var;
    26. }
    27. //VarInt -> int
    28. public static implicit operator int(VarInt value)
    29. {
    30. return value.Value;
    31. }
    32. }
    33. }

    VarString.cs代码实现

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using YouYou;
    7. namespace Myh
    8. {
    9. public class VarString : Variable<string>
    10. {
    11. //分配一个对象
    12. public static VarString Alloc()
    13. {
    14. VarString var = GameEntry.Pool.DequeueVarObject();
    15. var.Value = string.Empty;
    16. var.Retain();
    17. return var;
    18. }
    19. //分配一个对象(value使用传入的int值)
    20. public static VarString Alloc(string value)
    21. {
    22. VarString var = Alloc();
    23. var.Value = value;
    24. return var;
    25. }
    26. //VarString -> string
    27. public static implicit operator string(VarString value)
    28. {
    29. return value.Value;
    30. }
    31. }
    32. }

    VarTransform.cs代码实现

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using UnityEngine;
    7. using YouYou;
    8. namespace Myh
    9. {
    10. public class VarTransform : Variable<Transform>
    11. {
    12. //分配一个对象
    13. public static VarTransform Alloc()
    14. {
    15. VarTransform var = GameEntry.Pool.DequeueVarObject();
    16. var.Value = null;
    17. var.Retain();
    18. return var;
    19. }
    20. //分配一个对象(value使用传入的float值)
    21. public static VarTransform Alloc(Transform value)
    22. {
    23. VarTransform var = Alloc();
    24. var.Value = value;
    25. return var;
    26. }
    27. //VarTransform -> Transform
    28. public static implicit operator Transform(VarTransform value)
    29. {
    30. return value.Value;
    31. }
    32. }
    33. }

  • 相关阅读:
    软件工程复习笔记
    浅谈express框架
    在Java的JSP中返回JSON格式数据
    为什么做生意可以让双方生活的更好?
    Flink系列之Flink 流式编程模式总结
    华为机试真题 C++ 实现【积木最远距离】【2022.11 Q4 新题】
    【车间调度】基于matlab混合蛙跳算法 (SFLA) 求解简单调度问题【含Matlab源码 2247期】
    Spring的BeanDefinition的作用和使用方法
    徐童:视频人物社交关系图生成与应用
    Linux上如何部署SpringBoot项目——手把手教会你
  • 原文地址:https://blog.csdn.net/qq_33531923/article/details/127876367