首页 > 其他分享 >游戏服务器设计-脚本系统设计

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

时间:2022-12-27 19:32:00浏览次数:76  
标签:Groovy 脚本 Java 游戏 script 服务器 设计 public String


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

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设计

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

参考:

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

​​Groovy or Beanshell 性能比较​​

Java ImportCustomizer.addStarImports方法代码示例

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

标签:Groovy,脚本,Java,游戏,script,服务器,设计,public,String
From: https://blog.51cto.com/u_4176761/5973447

相关文章

  • 如何用JAVA调用服务器系统指令
    java在企业级项目开发中,无论是强制性的功能需要,还是为了简便java的实现,需要调用服务器命令脚本来执行。在java中,RunTime.getRuntime() .exec() 就实现了这个功能。 用法:......
  • Selenium35-模块化设计
    模块化设计模块化用来分隔,组织和打包软件每个模块完成一个特定的子功能,所有的模块按某种方法组装起来,成为一个整体,完成整个系统所要的功能在系统结构中,模块是......
  • SecureCRT 设置代理服务器
    SecureCRT的proxy的网络代理,可以跳出局域网,具体步骤如下:1.打开SecureCRT的软件界面,点击Options-->GlobalOptions-->Firewall-->Add,如下图所示。支持多种类型的代理,包括......
  • 从涂鸦到发布——理解API的设计过程(转)
    英文原文:​​FromDoodlestoDelivery:AnAPIDesignProcess​​要想设计出可以正常运行的WebAPI,对基于web的应用的基本理解是一个良好的基础。但如果你的目标......
  • PPT 表格设计
    顶级商业图表在哪找​​https://www.mckinsey.com.cn/​​​麦肯锡图表​​​https://www.cbnweek.com​​​第一财经​​​https://data.163.com/​​​DATABLOG数......
  • 设计模式之“状态模式(State)”(未完整)
    一、状态模式(State)状态模式是当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 二、状态模式的作用状态模式主要解决的是当控制一个对象状态转......
  • LNMP架构环境之Nginx项目1:搭建游戏网站
    1)配置站点目录cd/usr/share/nginx/rm-frhtml/通过SCP工具将gamme.zip上传到/usr/share/nginx/html/目录下#上传游戏程序unzipgame.zipcd /usr/share/nginx/sbin/2)......
  • Arthas 查询服务器内存数据
    1、打开Arthas所在位置eg:/home2、java-jararthas-boot.jar运行jar包3、选择要执行的javajar包eg:14、执行查看命令vmtool--actiongetInstances--classNameco......
  • windows server 2016域服务器升级到server 2019
    问题1:windowsserver2016域无法升级到windowsserver2022见下图不知道各位技术大佬是否也遇到同样的问题,还请协助!问题2:windowsserver2016域服务器无法获取WSUS补丁更新......
  • 机器人主轴设计参考
    一、砂轮机主轴I.基本参数介绍在打磨砂轮机设计过程中,针对现有砂轮机基本结构进行拆解分析,基本拆卸图如下:图1.为完整砂轮情况图2.为砂轮保护外壳,采用螺母收紧......