(源码依旧在Jar中)
源码下载地址:http://code.google.com/p/loon-simple/downloads/list
老实说,延迟下载游戏资源及调用只是一种辅助手段,与游戏开发本身关系并不大,实质也无非只是文件下载及文件读取的混用。但考虑到上周有网友问及此类问题,笔者觉得与其回邮件单独解释,倒不如写篇博文看起来更具体清晰,还能令大家帮助笔者斧正刊误,故成此文,仅供参考。
一般来讲,我们之所以会需要通过下载方式加载游戏资源,无非是出于如下几种目的:
1、精简游戏体积:
假设我做了个100MB的游戏,却非想把它宣传成仅有1MB的精巧程序,这时我该怎么办呢?
去欺骗用户,用大量复杂的技术名词忽悠他们说1MB和100MB等值吗?——用户不是傻子,至少不都是傻子,无论你的话术多么巧妙,也很难让绝大部分人都相信1MB和100MB是一样的。但大话已然出口,始终要想办法解决。
其实呢,在现有技术体系下,要搞定他们好简单的,只需将游戏初始界面混合下载器打包成1MB的文件发布,再“骗”他们下载执行,而后——就让他们慢慢等待系统加载剩下那99MB吧!毕竟没人说过这个游戏不需要额外的网络资源同步嘛……
2、网游资源的延迟加载需要:
目前的网络游戏——特别是网页游戏,为了尽可能的减少不必要的资源损耗,提高运行效率,大多数时候并不会一口气将所有资源都加载到游戏中,而是“大而化之,分而治之”,将游戏资源构建成一个个小小的资源包,仅仅在需要时,才或同步、或异步的加载到游戏中。这也正是我们在很多网游中所见到的,当角色过屏、读取新地图或遭遇新怪物时,画面会出现稍候字样或者部分马赛克乃至停顿的原因。
故此,通过网络适时地去加载需要的资源,几乎已成为网游开发中必不可少的技巧之一。
3、融入特殊的加密解密机制:
我们都知道,但凡是人所做出的程序,就没有人所不能破解掉的。但是——却很可能发生一个人做出来的程序,另一个人数年之内无法破解的现象。而当数年之后,另一个人破解出来时,这段程序却早已过气,白送都没人要了。
因此,当你极端的不想自己游戏被反向工程——尤其是想保护Java这种极好反编译的代码时,通过网络下载的另一种意义便显现出来了。你可以将下载的jar或class乃至其它种种保存到一个不同于执行目录的“隐秘”场所,并且无论密钥也好,特殊结构也罢,总之变着方的将资源加密混淆,就算混淆到连你自己都不知道这是什么东西也无所谓——能解释成字节码就好,最大限度的增加反向难度。而当你执行完毕,再一删了事——下次还可以再下嘛。这样做的话,虽然不能彻底杜绝代码被他人盗用,但,至少也可让反向我代码那哥们累掉层皮(^^)。
4、本地程序及资源合法性验证:
在大多数网络游戏中,为了保证用户不做出一些诸如使用外挂的“犯规”行为,是会对系统环境乃至封包数据进行合法性验证的,而一旦发现“非法”的东西存在,则会令“违法”玩家吊线或者干脆封号以示惩罚。
但这些验证,主要都只针对程序“外部”,即当“犯规”对象“不是我的游戏时”才能发挥功效,但万一“犯规”者“来自游戏本身时”或者“验证程序认为来自游戏本身时”,则变得无能为力,这也是为什么大多数网游都“内挂”泛滥的缘故。
幸运的是,Java程序由于其“天资所限”,是很难在虚拟机外部被攻破利用的,如果用Java制作网游,原则上大可不必担心“内挂”问题——但,这也有个大前提,那就是在“内挂”运行于虚拟机之外时才行的通。
而如果“内挂”运行在虚拟机之内呢? 如果我的“内挂”是一小段插入原始游戏中的代码呢? 要知道,动态加载class,动态修改字节码,早就不算什么事情了。
这时,就需要校验Java程序的合法性。
本来要验证这种事情是比较耗费时间的,但如果我们善于利用每次下载资源(比较大的,比如过图或者游戏更新),如果不单单“下载”,更同步“上行”,利用空档同服务器校对本地Java程序的合法性及完整性,便能很大程度上避免这种无意义的校验时间浪费。这时有缺少的文件便添加,有多余的——也就是出现不该存在的Jar或class乃至原始字节码修改,便借机强行“咔”掉它,免得它“为祸人间”。
5、系统升级:
通常来说,大多数的程序是不可能一个版本用到底的,游戏也不例外,无论是功能的增加或者Bug修正都离不开系统的更新。为了避免每次升级都令用户面临重装的苦恼,通过网络下载更新资源并自动更新系统也就变得非常必要。
如何实现:
下面我给出一个简单的资源延迟下载Java实现示例,分别加载我以前博文中出现的两个示例程序,并运行其中之一。(PS:由于本例加载的资源为Jar,所以进行了动态类加载操作,当我们下载其它资源类型,比如仅包含图片的zip压缩文件时,下载的步骤还是一致,只不过要将操作换成读取压缩文件及加载压缩文件资源而已。)
DownloadTool.java(这是一个简单的下载工具类,内置有下载状态显示及下载条绘制)
DownloadCanvas.java(下载条及背景显示用画布)
Main.java(主类,用以启动此下载示例)
程序执行效果如下图所示:
下载完毕后后将自动加载并执行下载的Java2.5D行走示例,画面如下图:
(源码依旧在Jar中)
源码下载地址:http://code.google.com/p/loon-simple/downloads/list
分享到:
相关推荐
在给定的文件列表中,“DHTest.rar”可能是大华提供的SDK或者示例代码,而“java封装接口智能交通DEMO.zip”很可能是包含了Java接口封装的示例代码,这些代码可能已经完成了与大华摄像头的通信接口,实现了连接和...
在这个“kafka安装相关文件以及java调用kafka示例项目”中,我们包含了几个关键组件和示例,以便于理解和实践Kafka的使用。 首先,我们有Kafka的安装包,这通常包含服务器端的二进制文件,配置文件,以及必要的脚本...
本篇将基于标题"java实现一个小程序语句的延迟执行的小demo"和描述,深入讲解如何在Java中实现这样的功能,并通过实际的代码示例来阐述其工作原理。 首先,Java提供了多种方式来实现延迟执行,例如使用`java.util....
在Java编程领域,分布式系统和远程方法调用(Remote Method Invocation, RMI)是关键的高级概念,它们允许不同计算机间的程序协同工作,提高系统的可扩展性和灵活性。本篇文章将探讨如何使用Java来实现简单的分布式...
在内网环境中进行调用,意味着服务器与摄像头都在同一个内部网络中,不需要通过公网进行通信,这有助于减少网络延迟并提高数据传输的安全性。不过,这也要求开发者对网络配置有一定的理解,确保服务器能够正确找到并...
长连接在高并发、低延迟的场景下尤为重要,比如实时聊天、在线游戏和大数据传输等。本示例将探讨如何在Java中实现长连接,并结合心跳检测来保持连接的活性。 首先,让我们了解TCP长连接的概念。TCP是一种面向连接的...
在JAVA中调用SDK,我们首先需要引入必要的库文件,这通常涉及到JNA(Java Native Access)或者JNI(Java Native Interface)技术。JNA允许JAVA程序直接调用C/C++级别的函数,而JNI则需要编写C/C++的本地方法库,然后...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
本资源包含了一个名为`jdbcPool`的手写数据库连接池源码以及一个`jdbcPoolTest`的调用示例,支持Oracle和MySQL数据库。 首先,我们来看`jdbcPool`连接池的实现。在Java中,连接池通常由以下几个核心组件组成: 1. ...
在本项目中,我们主要探讨如何使用JAVA编程语言调用海康威视(Hikvision)的SDK,以便实现摄像头的内网预览功能,并将视频流推送到阿里云服务。这一过程涉及到多个技术栈,包括后端开发、网络通信以及云端服务的集成...
在本文中,我们将深入探讨`Timer`类的基本使用和示例,帮助你理解如何在Java程序中实现简单的定时任务。 首先,`Timer`类提供了计划任务的能力,它可以按照预定的时间间隔安排任务执行。创建一个`Timer`对象后,你...
标题中的“JNI调用IE,延迟一段时间关闭”指的是在Java程序中通过JNI(Java Native Interface)技术调用本地系统资源,比如Internet Explorer浏览器,并且在指定的时间延迟后自动关闭浏览器。这种技术通常用于自动化...
本文将详细介绍如何使用Java Runtime类中的`getRuntime().exec()`方法来调用系统命令,并提供一些实际应用场景的例子。 ### Java Runtime.getRuntime().exec() `java.lang.Runtime`类提供了运行时系统的表示形式,...
在本文中,我们将深入探讨如何使用Java调用科大讯飞的离线语音识别DLL来实现Windows系统的离线语音识别功能。首先,我们要理解几个关键概念:JNA(Java Native Access)是Java平台上的一个库,它允许Java代码直接与...
标题中的“Flex与Java交互 远程调用方式”指的是在Adobe Flex应用程序中与Java后端进行通信的技术。Flex是一种基于ActionScript的开源框架,用于构建富互联网应用程序(RIA),而Java是后端开发的常用语言。两者之间...
总结一下,SNMP4J异步调用示例主要涵盖了以下几个关键点: 1. 使用`AsynchronousCommandResponderEngine`进行异步操作。 2. 实现`CommandResponder`接口以处理异步响应。 3. `SnmpSingleValueTest`和`...
这个简单的示例展示了如何快速集成讯飞Java语音识别SDK到项目中,并进行基本的语音识别操作。然而,为了实现更复杂的功能,如语音唤醒、关键词搜索等,开发者需要深入研究SDK文档,理解更多的接口和参数设置。 在...
这个“java版本websocket实例下载”包含了使用Java实现WebSocket的一个示例项目,我们可以从以下几个方面来理解和学习这个实例: 1. **WebSocket协议基础**:WebSocket是一种在TCP基础上建立的持久连接协议,它的...
比如,在爬虫项目中抓取网页中的图片资源,或者在构建图片分享应用时需要从远程服务器下载图片显示在客户端等场景。本文将通过一个简单的示例来介绍如何使用Java语言编写程序来下载指定URL地址的图片。 #### 二、...
这里我们将深入探讨两种主要的方法:Java的`java.util.Timer`类和Java 5及以上版本引入的`java.util.concurrent.ScheduledExecutorService`接口。 首先,我们来了解`java.util.Timer`类。这个类允许开发者创建一个...