android 游戏移植 (一) (文末有福利) | SDL 西游释厄传调试
游戏效果(不是真实画质)
有没有被惊艳到?你的内心肯定会说,我靠,画质这么渣,画面却如此熟悉。对的,就是如此渣渣的画面,却伴随了我们的童年快乐。
下面我们就详细的讲讲这个移植过程,说得更加具体些,就是本身这款游戏的 android
版本并非我移植的,本身模拟器也是有开源项目支持的。西游释厄传有人已经移植 ok
了,但是市面上开源的只有 SDL1.3
版本,而这个版本有个大问题,就是使用的 framebuffer
实现的,这个实现版本,由于没有使用硬件加速,所以性能大大损失。
因此,在原有项目的基础上,进行移植 SDL2.0
,支持 GPU
硬件加速,如此之后,会发现性能直接上升三倍,此游戏在低 CPU
上,就不会出现卡顿,没法玩的问题了。
下来简单讲下整个游戏的流程:
c语言开发的程序,要在android上面跑起来,主要解决以下问题:
主要就是围绕这些,算法,逻辑等等,可以直接使用c语言已经实现的,可以直接使用。
差异部分就是如何和 android
去对接,将事件传递过来,同时响应,将结果输出到屏幕。
c版本的游戏,当前移植到 android
,都不可避免的使用了 surfaceView
,因为此 View
是在 android
的java端搭出一个框架,让事件可以传递给它,同时它又在独立的自己线程会去执行绘制动作,这样保证了它的绘制,不会影响 android
普通 View
的绘制流程,从而使得c语言的绘制变得可行。
c语言开发这边,便可以拿到 surfaceViw
对应的一个绘制buffer,将这个绘制buffer封装,使用一组接口操作,便成了 OpenGL es
啦。如此之后,我们可以使用 opeGL es
的标准方法,进行操作这个buffer,从而将内容绘制到屏幕上了。
声音,按键 ,以及触摸,都是通过标准的 JAVA
和 C C++
语法之间的通道实现,即所谓的 JNI
,用来打通两边的参数传递,方法调用。
SDL
在此款游戏里面,只充当绘制的动作,其余的声音这些,都是通过JNI打通的。同时,游戏模拟器的概念类似虚拟机,也就是我们的apk运行起来,模拟出来我们的16位游戏机当时使用的 CPU
,以及内存地址空间,如此一来,我们将对应的游戏 ROM
,加载起来运行,便可以在此虚拟环境下,正常运行。
俄罗斯方块效果
这个是PC上面的效果,还未移植到android,主要是在考虑,到底该不该用贴图来实现更炫的画质,还是就保持绘制线条的方式,敬请期待吧! 再个原因就是:时间真的不充裕,毕竟这个是周末空闲时间来写的。
下节来分析代码,以及讲解移植过程,想要查看下载代码的,可以先行阅读了。
源码位置:
https://github.com/Cpasjuste/afba
https://github.com/Cpasjuste/libarcade
俄罗斯方块源码:
http://pan.baidu.com/s/1eSH7J6U
- Ruby对象模型总结
- Elasticsearch 管理文档
- Elasticsearch聚合 之 Ip Range IP地址范围聚合
- Elasticsearch聚合 之 DateRange日期范围聚合
- 域名投资大佬Mike Mann以约19.5万美金出售加密货币相关域名
- Elasticsearch聚合 之 Range区间聚合
- Elasticsearch集群管理
- 图m着色问题
- Elasticsearch入门介绍
- Elasticsearch聚合 之 Histogram 直方图聚合
- Elasticsearch聚合 之 Date Histogram聚合
- Elasticsearch聚合 之 Terms
- Elasticsearch聚合初探——metric篇
- AngularJS API之$injector ---- 依赖注入
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Docker-compose 常用命令及网络设置(五)
- HashMap 源码分析
- Java 按位运算符(&,|,^,>>,<<,>>>)
- LinkedList 源码分析
- Logstash:多个配置文件(conf)
- ArrayList 源码分析
- IllegalArgumentException:argument type mismatch
- String equals()方法 源码分析
- centos7宝塔环境安装VeryNginx waf系统实现高级防火墙功能
- 使用curl探测访问响应时长
- dnspod通过接口解析本地ip python脚本
- 如何修复WordPress死亡白屏(WSoD)故障问题
- linux: 添加一个IP地址
- Nginx简易防CC策略规则
- 如何编写和优化WordPress网站的Robots.txt