游戏开发和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();
@JsonIgnore protected boolean bSaveDBFlag = false; @JsonIgnore
public boolean isSaveDBFlag() { return bSaveDBFlag; } @JsonIgnore
public String getClassFlag() { ...... } @JsonIgnore
private 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); } }
*
使用享元模式,而不是多个单例,代码量大大减少,符合单一职责原则。

*
java的Supplier<T>的惰性加载。

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

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

 

友情链接
ioDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信