浅析Sol Survivor

本文介绍了塔防游戏SolSurvivor的游戏特色与编程设计。详细分析了游戏内的塔属性及配置方式,并探讨了游戏背后的Microsoft XNA开发环境及各动态链接库的作用。

    3月份新出了一个塔防游戏,叫做 Sol Survivor (唯一幸存者)。我也试玩了一下,被其精美的画面和优秀的引擎所深深吸引。它的塔很丰富,有专门对空的,也有专门对地的,还有空地结合的。从攻击上来说,专门性的输出要比全面性的高。而且二级塔也远比一级塔的攻击力要来得高,甚至头几关有一关是必须要只用一个塔来守才能获得增加英雄的奖励(通关以后英雄是全的)。从攻击范围来说,大范围的输出一般都是有时间间隔,输出值也比近程输出要低。但是只有远距离的塔中拥有整个游戏中唯一的忽略外部防护能力的塔。从附加属性来说,有电流攻击、激光攻击、减速、反隐、散射。不是每种功能都必须用到才能通关,但是合理的运用可以减少造塔的数量和有效防住敌人。本人比较热衷于生存模式,就是小兵无限出的那种,而且越出越难打的。基本上能防到12分半,然后就很难突破了。大概也就是个入门选手的水平。:-)
    毕竟这是个专业性的论坛,编程知识也少不了讲讲。这款游戏是利用Microsoft XNA专业游戏编程的开发环境。这方面作者也是稀里糊涂的,所以就不讲了。主要还是游戏内部的设计。值得庆幸的是,这个游戏并没有完全加密,所以我们可以用.Net Reflector来查看内部的运行机制。
    在整个游戏中,所有的武器 Turret 的初始化参数设置都来自于 Cadenza.AutoScripts 的 Turrets_CampaignTurretStats。哪个武器的属性不明白,可以直接来这里查查看。:-)在这里面可以看到所有武器的属性都通过一个 TurretStats 来设置。从这里,我们就可以看到这个游戏里的武器都支持什么类型的攻击。( 其实我们也可以把这个dll改了。。。然后做出自己的 Super Turret,然后还不花 Mass 。 -_-! 太恐怖了,不能往下想了。。。 ) 也就是说 Cadenza.AutoScripts.dll 只是完成了一个基本的配置功能。而且还是写死在程序中。( 这个配置文件 4.47MB,够恐怖了。 ) 当然如果你仔细看,里面还有地图信息和各种游戏参数。( 如果你有耐心的话可以一个一个慢慢看。。。 -_-! ) 这就告诉我们一个非常有用的信息,如果你想游戏小巧,不用每个地图都图形化 Map ,用固态配置文件是比较好的选择。当然这方面同样优秀的暴雪公司的优秀产品 War3 也是一个利用配置文件减少单个地图制作的难度的。不过。。。这个 Sol Survivor 更变态些,把所有的物件都写成矢量运算的,这就使得每次运行游戏刷新页面的都是CPU在计算每个点的像素。真是变态至极,无怪乎这个游戏需要非常优秀的显卡。可能就是因为这个吧。
    Cadenza.SolSurvivorLibrary.dll 这个DLL绝对是值得好好研究的。所有游戏中实现的武器的动作,以及物体间的交互作用都是在这里面完成的。我只是粗略的看了一下。发现还是有很多地方值得学习的,因为既然入了程序员这行,还是比较向往简洁和高效的编程模式的。再简单介绍一下其他动态链接库吧:Lidgren.Library.Network 提供局域网连接的基库。 Cronus.dll 图形处理的基库。 steam_api.dll 、 steamworks.dll 、 steamworkswrapper.dll 是一个整体,由于 steam_api.dll 是非.Net编的 ( 具体是什么,自己查吧 ;-) )所以要调用就需要一个 .Net 的对应库。而之所以分成 steamworks.dll 、 steamworkswarpper.dll 可能是因为在使用过程中发现一些功能不能混淆,所以就把他们给分开咯。简单点说就是为了把功能分开放而已。 SolSurvivor.exe 比较有意思,因为它的初始化能够判别是否加了程序侦听功能,然后启动调试部分,而且还有错误处理模式。
相对于这个游戏,我只是简单地把各个程序的功能列举出来而已,其中还有非常多优秀的编程理念在里面。看到这么漂亮的代码,确实像罗百吉唱的《真爱》里说的,“我无法再等候,不够永远爱死不够”。:-) 这个游戏是纯英文的,还有很多国内玩家没能像我一样体验到这个游戏的乐趣。还是比较遗憾的。今天先这样了,后半夜就这样没了,时间过得真快。

在Java垃圾回收机制中,**Survivor Space(幸存者空间)**是Java堆内存中的一部分,主要用于存放从**Eden Space(伊甸园区)**中经过垃圾回收后仍然存活的对象。Survivor Space通常被划分为两个部分:**From Space**和**To Space**,这两个空间在垃圾回收过程中交替使用[^3]。 ### Survivor Space的作用 Survivor Space的存在主要是为了实现**分代垃圾回收**(Generational Garbage Collection)。在Java的堆内存中,对象通常被分为两个主要区域: - **Young Generation(新生代)**:包括 Eden Space 和两个 Survivor Space。 - **Old Generation(老年代)**:用于存放长期存活的对象。 新生代的垃圾回收称为**Minor GC**,它通常发生在 Eden Space 满时。在 Minor GC 过程中,存活的对象会被移动到 Survivor Space 中。如果对象在 Survivor Space 中经过多次垃圾回收仍然存活,它们会被晋升到 Old Generation 中[^1]。 ### Survivor Space的工作机制 1. **初始分配**:新创建的对象通常会被分配在 Eden Space 中。 2. **第一次垃圾回收**:当 Eden Space 满时,会触发 Minor GC。此时,Eden 中存活的对象会被移动到其中一个 Survivor Space(From Space)。 3. **后续垃圾回收**:在下一次 Minor GC 中,Eden 和 From Space 中存活的对象会被移动到另一个 Survivor Space(To Space),并且 From Space 会被清空。 4. **对象晋升**:如果对象在 Survivor Space 中经历了足够多的垃圾回收周期(通常由 JVM 参数控制),它们会被移动到 Old Generation 中。 ### Survivor Space的配置 JVM 提供了一些参数来调整 Survivor Space 的行为: - **-XX:SurvivorRatio**:用于设置 Eden 和 Survivor 的比例。例如,-XX:SurvivorRatio=8 表示 Eden 和每个 Survivor 的比例为 8:1:1。 - **-XX:MaxTenuringThreshold**:用于设置对象在 Survivor Space 中可以经历的最大垃圾回收次数,超过该次数后对象会被晋升到 Old Generation。 ### Survivor Space的优化 合理配置 Survivor Space 可以提高垃圾回收的效率。如果 Survivor Space 太小,可能会导致对象过早地晋升到 Old Generation,增加 Full GC 的频率。反之,如果 Survivor Space 过大,则可能浪费内存资源。因此,需要根据应用程序的特性来调整 Survivor Space 的大小和比例。 ```java // 示例:查看JVM中Survivor Space的配置 public class SurvivorSpaceExample { public static void main(String[] args) { // 获取JVM的内存信息 Runtime runtime = Runtime.getRuntime(); long totalMemory = runtime.totalMemory(); long maxMemory = runtime.maxMemory(); System.out.println("Total Memory: " + totalMemory / (1024 * 1024) + " MB"); System.out.println("Max Memory: " + maxMemory / (1024 * 1024) + " MB"); } } ``` ### Survivor Space与性能调优 在性能调优过程中,Survivor Space 的配置对应用程序的性能有重要影响。通过监控 Survivor Space 的使用情况,可以判断是否需要调整 Eden 和 Survivor 的比例,或者是否需要增加堆内存的大小。JVM 工具如 **VisualVM** 和 **JConsole** 可以帮助开发者实时监控 Survivor Space 的使用情况。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值