游戏开发和Web开发不同的地方在于,游戏对象通常是常驻内存的。

当用户登录的时候会一次性把玩家某个模块的数据全部读到内存里面,以后除了维护之外,内存中的数据都不会被释放掉,需要持久化的数据定时批量地写入数据库。

经常要为玩家角色存储一些数据,比如神器,装备,时装,他们都是GameObject,就像这样:

public abstract class GameObject {public enum DataState {......};protected DataState curDataState = DataState.dsModify;......protected abstract int saveInsert();protected abstract int saveDelete();protected abstract int saveModify();public abstract long getId();public abstract void setAllModifyState();public abstract void clearModifyState();public abstract int deleteObject();@JsonIgnoreprotected boolean bSaveDBFlag = false;@JsonIgnorepublic boolean isSaveDBFlag() {return bSaveDBFlag;}@JsonIgnorepublic String getClassFlag() {......}@JsonIgnoreprivate SqlExecuter getExecuter() {......}/*** 标记存库成功,设置对应的状态*/public final void saveDBSuccessed() {......}/*** 如果所存储的Manager容器默认IdMap有记录数组Index索引,那么就可以通过这个index索引来快速找到对象在ArrayList中的位置*/public int arrayIndex = 0;public void autoSave() {......}public void saveToDB() {......}/*** 计划存储* * @return*/public void saveToDBInPlan() {......}public void realSaveToDB() {......}/*** 把对象放入到执行任务中*/public int AddObjToTask() {......}......}

每一个角色都有多个GameObjectMgr,每一个GameObjectMgr存储不同类型的GameObject,存储所有角色的游戏物品的类,可以设计为GameDataHolder:

/*** <pre>* 享元模式* * author 林子豪* </pre>*/
public class GameDataHolder {//<manager.class.name_roleId , manager>public static Map<String, Object> roleMap = new ConcurrentHashMap<>();public static <T extends GameObjectMgr<?>> T getMgr(Class<T> clz, Long roleId, Supplier<T> mgrGenerator) {String key = clz.getSimpleName() + "_" + roleId;Object mgr = roleMap.get(key);if (mgr == null) {mgr = mgrGenerator.get();Object previousMgr = roleMap.putIfAbsent(key, mgr);if (previousMgr != null) {mgr = previousMgr;}}return clz.cast(mgr);}public static <T extends GameObjectMgr<?>> T getMgr(Class<T> clz, Long roleId) {String key = clz.getSimpleName() + "_" + roleId;Object mgr = roleMap.get(key);if (mgr == null) {try {mgr = clz.newInstance();} catch (InstantiationException | IllegalAccessException e) {e.printStackTrace();}Object previousMgr = roleMap.putIfAbsent(key, mgr);if (previousMgr != null) {mgr = previousMgr;}}return clz.cast(mgr);}
}
  1. 使用享元模式,而不是多个单例,代码量大大减少,符合单一职责原则。

  2. java的Supplier<T>的惰性加载。

  3. 外部传入mgrGenerator对象,生成GameObjectMgr对象。

  4. 使用Class对象cast方法,防止对象转换时出现的警告。

Java8与游戏开发(一)相关推荐

  1. Unity 创建2D平台游戏开发学习教程

    了解如何使用C#在Unity中创建您的第一款2D平台游戏 你会学到什么 使用Unity创建2D奥运会 使用可脚本化的对象和单一模式 使用良好的编程实践 创造武器和射弹 使用可脚本化的对象和委托模式创建 ...

  2. Unity2D游戏开发和C#编程大师班

    本课程采用现代游戏开发的最新内容和最新技术(Unity 2D 2022) 学习任何东西的最好方法是以一种真正有趣的方式去做,这就是这门课程的来源.如果你想了解你看到的这些不可思议的游戏是如何制作的,没 ...

  3. UE4蓝图无代码编程游戏开发技能学习教程

    在虚幻引擎4中创建.设计和开发自己的游戏,无需编码 你会学到什么 虚幻引擎4中使用蓝图的游戏开发(无代码编程) 使用行业标准方法的游戏设计 使用Maya进行三维设计 在本课程中创建您的第一个游戏 Ga ...

  4. 面向完全初学者的Unity和C#游戏开发学习教程

    了解如何通过使用Unity游戏引擎和C#制作BomberMan风格的3D游戏来制作您的第一款视频游戏 你会学到: 使用Unity 2021学习3D游戏开发 通过制作你的第一个3D游戏来学习C#编程语言 ...

  5. Unity三维游戏开发C#编程大师班 Masterclass In C# Programing Unity 3D Game Development FPS

    本课程采用现代游戏开发(Unity 2021)的最新内容和最新技术 学习任何东西的最好方法是以一种真正有趣的方式去做,这就是这门课程的来源.如果你想了解你看到的这些不可思议的游戏是如何制作的,没有比这 ...

  6. Unity 3D游戏开发学习教程

    用C#用Unity3D制作游戏 你会学到: 您将学习3D游戏开发基础知识,以使用Unity3D引擎推进事物. 到本课程结束时,他们将可以轻松制作任何类型的游戏,无论是3D还是2D MP4 |视频:h2 ...

  7. Unity空间射击游戏开发教程

    描述 在本课程中,您将学习如何在unity中制作一款太空射击游戏.本课程使用全新的特性和编码实践,并且兼容所有较新版本的unity. 了解如何使用世界领先的免费游戏开发工具Unity创建太空射击游戏. ...

  8. Unity完全学习教程-从初学者到C#中的RPG游戏开发

    打造3款游戏&学习Unity实用方式!从基础开始,以一个RPG游戏结束.使用Unity 2020和C# 你会学到: 通过创建酷游戏的实用方法 游戏开发的基础和核心概念 创建一个拥有大量功能的角 ...

  9. Unity安卓游戏开发:打造7款2D 3D游戏 Unity Android Game Development : Build 7 2D 3D Games

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确) |大小:15.4 GB |时长:32h 55m Un ...

最新文章

  1. OpenStack Ocata版本国内代码贡献盘点
  2. Vue-使用webpack+vue-cli搭建项目
  3. SVN之如何添加默认.a文件
  4. Redis Sentinel
  5. FinalShell SSH工具下载
  6. seo教程之对搜索引擎的研究
  7. 计算机硬盘序列号有什么意义,硬盘序列号会/为什么会改变
  8. python统计汉字和标点_Python处理中文标点符号大集合
  9. 数据链路层的主要功能
  10. wince 德赛西威2413_德赛西威NAV262大众全系通用DVD导航产品介绍
  11. PHP批量上传一次点击选中多个
  12. UnityShader学习教程之<矩阵的左乘还是右乘所导致的效果问题>
  13. 网站打开很卡是为什么?
  14. 第19章 特殊工具与技术【C++】
  15. 中国天气网天气api接口 天气预报调用方法 2020
  16. 海南行,阳光,沙滩,椰树[2007.2.1~2007.2.5]
  17. 深入Vue2.x的虚拟DOM diff原理
  18. 通过镜像反推Dockerfile命令的两种方法
  19. 【案例30】WebSphere诡异宕机
  20. 点阵---点亮一个点(内含硬件设计+软件编程+思路)

热门文章

  1. 为什么要用收费邮箱,免费邮箱和付费邮箱的差别
  2. 今天终于把《100小时学会SAP》看完了
  3. Day06-Esayexcel简介及写、读操作-p95、96
  4. 极简工具,Tekla二次开发--构件图标注工具
  5. 如果宏安全性设置为“禁用所有宏,并且不通知”,将自动禁用所有宏。使用下列步骤可启用宏。
  6. Oracle_本地计算机上的OracleOraDb11g_home1TNSListener 服务启动后停止
  7. usb驱动的基本结构和函数简介【转】
  8. Bootstrap样式之表单样式
  9. 亿发软件:定制WMS(仓储智能管理系统),实现仓库内部精细化管理
  10. 锁相环PLL的工作原理