一个完整Java后端js前端游戏项目源代码,部署运行
运行效果
视频加载中…
一、开发工具、语言、框架
开发工具:Cocos Creator 2.3.2
开发语言:Java + JavaScript
服务端框架:Spring Boot + MySQL5.1.43 + JPA + TIO
客户端语言:Cocos Creator/JavaScript
二、源码
(一)源码下载
链接: https://pan.baidu.com/s/1tzMV35U6QrhXorGGX7e20w
提取码: 关注后私信领取
(二)源代码结构图
1.服务端
2.客户端
三、Maven下载配置
(一)maven下载
https://downloads.apache.org/maven/maven-3/3.8.5/binaries/
(二)maven配置
1.将下载的maven解压至自己想要的路径,并创建repository文件夹作为本地存储路径
2.对conf目录下的settings.xml进行配置本地资源存储路径,并配置阿里的镜像(下载时会快一些)
3.配置maven系统的环境变量
4.测试maven配置(事先要配置好JDK)
这样就说明maven已配置好了
四、MySQL下载安装配置
(一)下载安装及初始化
这里下载的是mysql-5.1.43-winx64 、mysql-workbench-community-6.2.5-winx64,数据库创建及初始化如下,sql脚本位于源码script文件夹下的beimi.sql
(二)游戏源码配置,把MySQL密码修改成自己的,需要修改源码中的application.properties中的信息:
五、部署源码
(一)部署服务端
1.在cmd(命令行)中切换到源码目录下
依次执行以下命令;
1.本源码有2个依赖包需要手动安装
执行命令:
(1)
(2)
命令执行结果如下:
2.执行编译命令:mvn compile
结果如下:
3.执行服务启动命令:mvn spring-boot:start
结果如下:
没有启动成功,再次执行mvn spring-boot:start
启动成功
登录后台服务:地址127.0.0.1:80 用户名:admin密码:123456
如下图:
六、前端部署
(一)下载cocos creator 2.3.2,下载地址https://www.cocos.com/creator
(二)安装好后创建一个空项目
退出cocos creator,将源码client\\version\\chess目录下的asset和settings复制到新建空项目目录下替换asset和settings两个文件夹,
启动cocos creator,找到下载的login,然后运行
Java代码优化秘籍:单例模式与静态变量的正确使用,提升程序性能
首先,良好的编码实践非常重要。在Java程序中,访问速度、资源限制等问题的原因大多是由代码不规范引起的。
单例使用场景
单例模式在减少资源占用、提高访问速度方面有很多好处,但并不是所有场景都适合单例。
简单来说,单例主要适用于以下三个方面:
多线程场景下,通过线程同步来控制资源的并发访问。
多线程场景控制数据共享并允许多个不相关的进程或线程之间进行通信(通过访问同一资源来控制)。
控制实例的生成,单例只实例化一次,节省资源;
不要随意使用静态变量
当一个对象被定义为变量时,GC通常不会回收该对象所占用的内存。
示例如下:
A类{
B b = 新 B();
此时,静态变量b的生命周期与A类同步,即如果A类不被卸载,则对象b将驻留在内存中,直到程序终止。
创建Java对象时需要注意的事项
根据业务使用场景,尽量避免循环新增对象。
这是因为系统需要时间来创建对象,也需要时间来管理和垃圾收集这些对象。因此,在控制范围内,尽量保证对象的最大复用。最好用基本数据类型或数组替换对象。
使用final修饰符时的注意事项
带有final修饰符的类不是派生的,即不能被继承。在核心Java代码中,有很多被final修饰的类,例如java.lang。班级。
如果一个类是final的,那么该类的所有方法都是final的。 Java编译器会寻找机会()所有final方法,这与具体的编译器实现有关。这样做可以平均提高 50% 的性能。
A类{
无效(整数大小){
this.size = 大小;
整数大小;
//方法变为final,性能更好
A类{
最终无效(int大小){
this.size = 大小;
整数大小;
将/访问实例变量的方法设为final:一个简单的/方法应该设为final,它告诉编译器这个方法不会被重载,可以设为“”。
使用局部变量的规范
调用方法时传递的参数以及调用过程中创建的临时变量都保存在栈(Stack)中,速度更快;其他变量,如静态变量、实例变量等,都是在堆(Heap)中创建的,速度较慢。
处理包装类型和使用场所的基本类型
基本类型:byte、short、int、long、float、、char、
对应的封装类型:Byte、Short、Int、Long、Float、、、
基本类型和包装类型在使用过程中可以相互转换,但它们生成的内存区域完全不同。基本类型的生成和处理都是在栈上处理的。包装类型是引用类型,它的对象是在堆中生成的实例。
在集合类对象中,处理需要处理的对象时适合使用包装类型,其他情况建议使用基本类型进行处理。
使用原始数据类型而不是对象
s1 =“你好”;
这个方法会创建一个“hello”字符串,JVM的字符缓冲池会缓存这个字符串。
s2 = new(“你好”);
除了以这种方式创建字符串之外,s2引用的底层对象还包含一个char[]数组,该数组依次存储h、e、l、l、o。
使用说明
实现同步需要大量的系统开销作为代价,甚至可能会造成死锁。所以尽量避免不必要的同步控制。
调用该方法时,会直接锁定当前对象。在该方法执行完毕之前,其他线程无法调用当前对象的其他方法。更灵活的用法是使用代码块同步,而不是在方法中同步。
使用说明
不要将资源清理放在方法中。这种方法很少使用。
由于GC的工作量很大,特别是在回收Young代内存时,常常会导致应用程序暂停。如果选择使用方法来清理资源,就会增加GC的负担,使程序的运行效率变差。
线程同步不是必需的,应尽可能使用。
等使用同步机制,导致减少。
使用说明
创建较大的对象时,应该使用带参数的构造函数来创建对象。
示例如下:
(整数,浮点数);
哈希扩展是一个非常消耗性能的事情。默认构造函数仅创建 16 个对象,即 0.75。最好准确估计所需的最佳尺寸。对于 也是如此。
减少变量的重复计算
for (int i = 0; i < list.size(); i++) {…}
// 应改为
for (int i=0, l=list.size(); i < l; i++) {…}
避免不必要的对象创建
A a = 新A();
如果(我==1){
列表.add(a);
// 应改为
如果(我==1){
A a = 新A();
列表.add(a);
使用说明
在try-catch中,所使用的资源必须能够被释放,以避免资源泄漏,这最好以块的形式进行。无论程序执行过程中是否出现异常,中的代码都会被执行,从而保证资源被正确关闭。
使用说明
无参构造函数创建一个字符数组,默认大小为16。在使用过程中,如果数组长度超过16,则需要重新分配内存,创建一个更大容量的数组,并复制原数组,旧数组必须被丢弃。
大多数情况下,可以在创建时指定大小,以避免容量不足以提高性能时自动增长。
sb=新的(int);
显式释放空间并让gc回收对象
大多数情况下,方法内部局部引用变量所引用的对象会变成垃圾,并在方法结束时被回收。因此,不需要在程序中显式地将局部引用变量设置为null。
示例如下:
空白 () {
obj = new();
……
对象=空;
随着()执行完毕,程序中局部引用变量obj的作用域结束,此时不需要执行obj = null。
反例如下:
空白 (){
obj=new();
……
对象=空;
//耗时、耗内存的操作
……
这时候就需要尽快释放不再使用的空间,执行obj = null显式释放局部引用变量obj。
二维数组使用规范
二维数据比一维数组占用的内存空间大约多 10 倍。
分割使用场景
尽量避免使用 split。 split使用正则表达式,效率相对较低。频繁的调用会消耗大量的资源。
如果确实需要频繁调用split,最好使用.split(,char),它可以缓存结果。
及使用规格
对于线性表和链表来说,随机查询的操作比移动指针的操作要好。添加和删除操作优于需要移动数据的操作。
.() 使用指南
尝试使用 .() 来复制数组,它比通过循环复制数组要快得多。
缓存对象
当缓存经常使用的对象时,可以使用数组或者其他容器来缓存。这种方法需要您自己管理这些容器,可能会导致系统占用过多的缓存并降低性能。
您还可以使用一些第三方开源工具(例如 )进行缓存。它们基本上实现了 FIFO/FLU 等缓存算法。
尽量避免非常大的内存分配
有些问题并不是堆内存不足造成的,而是内存分配失败造成的。 (gc会对内存进行碎片整理)
如果分配的内存块必须全部是连续的,那么随着堆变满,找到更大的连续块将变得越来越困难。
try/catch 使用场景
不要在循环中使用 try/catch 语句。将 try/catch 放在循环的最外层。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。