游戏服务器设计-脚本系统设计

简介: 游戏服务器设计-脚本系统设计

游戏项目中都会遇到以下的一些需求:

1.从内存里查询数据

2.修复个别玩家的异常数据

如何能最快捷的方式去实现,目前有两种脚本引擎可以选择:beanshell 和groovy.

经过比较得出如下结论:

BeanShell Groovy
官网 BeanShell - Lightweight Scripting for Java The Apache Groovy programming language
介绍 用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简的解释器jar文件大小为175k 是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy也可以使用其他非Java语言编写的库。
执行原理 使用Java反射API以提供Java语句和表达式 的实时解释执行;可以透明地访问任何Java对象和API。 动态地加载一个脚本并执行它的行为。GroovyClassLoader是一个定制的类装载器,负责解释加载Java类中用到的Groovy类
直接访问私有方法 可以 可以
泛型 不支持 支持
评价 专注,小而强大,小强 沉睡的巨人
脚本量 除了目标脚本外面要套一层类的外壳
语言友好性 纯java语言 纯java语言
后遗症 没有 Groovy每执行一次脚本,都会生成一个脚本对应的class对象存放metaspace,
但可以通过每次new GroovyClassLoader或者调用GroovyClassLoader.clearCache()去化解
性能 非常快 GroovyShell执行groovy语言,静态编译情况下速度还可以,
GroovyClassLoader 要相对Beanshell要慢一些
IDE对引擎的支持 更友好,高亮,语法智能插入
社区 不大活跃,目前在谋划beanshell3

BeanShell使用:

script.bsh脚本

import io.gamioo.script.ScriptManager;
for(int i=0;i<10;i++){
    String content="hello world";
    ScriptManager.getInstance().log(content);
}

beanshell执行脚本:

public void init() throws ServiceException {
        logger.info("开始初始化Java Script引擎.");
        // 让所有的非public方法和字段可供调用
        try {
            Capabilities.setAccessibility(true);
        } catch (Unavailable e) {
            throw new ServiceException(e);
        }
        logger.info("成功初始化Java Script引擎.");
    }
    public String execScriptByBeanshell(String script) {
        try {
            Object output = interpreter.eval(script);
            return output == null ? "OK" : output.toString();
        } catch (TargetError e) {
            Throwable able = e.getTarget();
            logger.error(e.getMessage(), e);
            return able.toString();
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            return e.getMessage();
        }
    }

Groovy 使用:

script.groovy脚本:

package io.gamioo.script
public class GroovyScriptExecutor2 implements GroovyScript {
    @Override
    public String execute() {
        for(int i=0;i<10;i++){
            String content="hello world";
            ScriptManager.getInstance().log("Hello ketty");
        }
        return "OK";
    }
}

groovy执行脚本:

/**
 * Groovy脚本接口.
 */
public interface GroovyScript {
    /**
     * 执行逻辑.
     *
     * @return 执行结果
     */
    public String execute();
}
  /**
     * 执行一段Groovy脚本.
     *
     * @param script Groovy脚本
     * @return 执行结果
     */
    public String executeByGroovy(String script) {
        try (GroovyClassLoader loader = new GroovyClassLoader()) {
            //  loader.clearCache();
            return ((GroovyScript) loader.parseClass(script).newInstance()).execute();
        } catch (Exception e) {
            logger.error("groovy script execute exception.{}", e);
            return ExceptionUtils.toString(e);
        }
    }

测试类:

@DisplayName("脚本测试")
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ScriptManagerTest {
    private static final Logger logger = LogManager.getLogger(ScriptManagerTest.class);
    private  static ScriptManager scriptManager;
    @BeforeAll
    public  static void beforeAll() throws Exception {
        scriptManager=ScriptManager.getInstance();
        scriptManager.init();
    }
    @Test
    @DisplayName("BeanShell脚本测试")
    public void testBeanShell() throws Exception {
        File file= FileUtils.getFile("script.bsh");
        String content=FileUtils.readFileToString(file);
        scriptManager.execScriptByBeanshell(content);
    }
    @Test
    @DisplayName("Groovy脚本测试")
    public void testGroovyClassLoader() throws Exception {
        File file=FileUtils.getFile("script.groovy");
        String content=FileUtils.readFileToString(file);
        scriptManager.executeByGroovy(content);
    }
}

后台脚本系统UI设计

参考:

java groovy集成_Groovy与Java集成常见的坑

Groovy or Beanshell 性能比较

Java ImportCustomizer.addStarImports方法代码示例

这篇文章可以研究下有些单例的,已经在容器里的可以不用再import的问题

目录
相关文章
|
6月前
|
机器学习/深度学习 弹性计算 Shell
ecs服务器shell常用脚本练习(八)
【4月更文挑战第6天】shell代码训练(八)
144 0
|
6月前
|
弹性计算 安全 Shell
ecs服务器shell常用脚本练习(七)
【4月更文挑战第5天】shell代码训练(七)
175 1
|
21天前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
29 1
|
3月前
|
运维 监控 数据库
自动化运维:使用Python脚本实现服务器监控
【8月更文挑战第31天】在这篇文章中,我们将探索如何利用Python编写简单的脚本来实现对服务器的基本监控。通过学习和应用这些技术,你可以快速检测服务器的状态,包括CPU使用率、内存占用和磁盘空间等关键指标。这不仅有助于及时发现问题,还能提升运维效率。文章将逐步引导你理解监控的重要性,并展示如何从零开始构建自己的监控工具。
|
3月前
|
监控 数据挖掘 Linux
Linux服务器PBS任务队列作业提交脚本的使用方法
【8月更文挑战第21天】在Linux服务器环境中,PBS任务队列能高效管理及调度计算任务。首先需理解基本概念:作业是在服务器上执行的任务;队列则是等待执行任务的列表,具有不同的资源限制与优先级;节点指分配给作业的计算资源。
371 4
|
3月前
|
网络安全
mac下通过ssh脚本实现免账号密码连接运服务器
mac下通过ssh脚本实现免账号密码连接运服务器
47 3
|
3月前
|
网络协议 安全 Unix
6! 用Python脚本演示TCP 服务器与客户端通信过程!
6! 用Python脚本演示TCP 服务器与客户端通信过程!
|
3月前
|
监控 Linux Shell
"揭秘!一键掌控Linux服务器健康的秘密武器——超实用系统检查脚本,让你的服务器稳如老狗,告别宕机烦恼!"
【8月更文挑战第14天】服务器宕机或资源耗尽会严重影响业务。为此,你需要一个Linux系统检查脚本来守护服务器健康。它可以自动检测潜在问题如磁盘满载、内存泄漏等,避免服务中断。脚本应包括磁盘空间、内存/CPU使用、系统时间准确性、关键服务状态及系统日志分析等检查项。通过编写并定期运行这样的脚本,可以显著提高服务器的稳定性和可靠性。
48 1
|
3月前
|
运维 监控 网络安全
自动化运维:使用Python脚本实现服务器批量管理
【8月更文挑战第2天】在现代IT运维领域,效率和准确性是衡量工作质量的关键指标。手动管理大量服务器不仅耗时且容易出错,因此自动化运维工具的开发变得至关重要。本文将介绍如何利用Python编写一个简单的自动化脚本,实现对多台服务器的批量管理,包括自动更新、配置同步以及日志收集等功能。通过实际案例展示,我们能够看到自动化运维如何提升工作效率并减少人为错误。
|
3月前
|
存储 运维 监控
自动化运维:使用Python脚本进行服务器监控
【8月更文挑战第31天】在数字化时代,服务器的稳定运行对于企业至关重要。本文将介绍如何使用Python编写一个简单的服务器监控脚本,帮助运维人员及时发现并解决潜在问题。我们将从基础的服务器资源监控开始,逐步深入到日志分析与报警机制的实现。通过实际代码示例和操作步骤,使读者能够快速掌握自动化监控的技能,提升工作效率。