虽然这个软件是用java语言编写,面向对象,可是总要有个开始的入口,这里关心的就是,main函数在哪里。

似乎java中也可以没有main函数,也可能是我的错误认识。暂且不管,jpcsp中是有main函数的。位置是:源包-->jpcsp-->MainGUI.java,在这个文件中搜索main即可找到。

public static void main(String args[])

///

java科普:

public指这个函数是公共的。公共的意思就是,这个类的实例对象可以使用这个方法。private的则只有这个类的函数中可以使用这个方法,这个类的实例对象不能使用。

static指这个方法是静态的。静态就是说,这个方法属于这个类本身,而不是属于这个类的某个特定实例。具体到使用上,用这个类的名字加“.”就可以引用这个方法,而不需要先将这个类实例化,再通过实例化的对象来引用这个方法。

类定义中的static成员变量同理,这种成员一共只有一个实例,而不是对每个对象都生成一个实例。

///

当正式进入到源码中,有必要说一个原则,当追踪源码到达了非jpcsp工程目录的文件,说明那是系统提供的库,而不是jpcsp的源码,此时就没有必要继续向下追踪。通常这样的库函数见名知意,接口含义清晰,不用细究。

比如main函数中可以见到这样一行代码:

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

光标定位到UIManager上,右击,选 导航,转到源,发现打开的是c盘下某个文件,而不是jpcsp目录下,此时就可以停止深入了。

这行代码的含义很清晰,取得当前系统的外观风格,并且把模拟器的图形界面也设置成这种风格。

///

main函数的行为是:(暂且忽略掉调试和测试相关目的的代码)

1.设置图形界面外观风格。

2.实例化MainGUI,得到maingui对象,并将这个对象设置为可见,也就是在屏幕上显示出来。

然后,然后就没有然后了。。。

因为程序的主体是那个图形界面,后面的工作都由用户事件触发。比如,用户点击了图形界面上的某个图标。这个动作会被那个图标的监听器收到,然后这个监听器来执行相应的动作。

///

在main函数中实例化MainGUI时,会自动调用这个类的构建函数。MainGUI的构建函数中包含了大量初始化操作。

public class MainGUI extends javax.swing.JFrame implements KeyListener, ComponentListener, MouseListener, IMainGUI

说明这个类是javax.swing.JFrame的子类,实现了几个listener,也就是监听器。

swing是java图形的一个类库。JFrame是图形框架,这个框架里面可以放进各种组件,比如 按钮 画布 等。

来看一下MainGUI这个类的成员变量:

MemStickBrowser memstick;                                   //存储卡浏览器

Emulator emulator;                                            //模拟器

UmdBrowser umdbrowser;                                     //umd浏览器

UmdVideoPlayer umdvideoplayer;                              //umd视频播放器

InstructionCounter instructioncounter;                      //

File loadedFile;                                                        //已经载入的文件

boolean umdLoaded;                                               //umd光盘是否已经加载

boolean useFullscreen;//是否要全屏

JPopupMenu fullScreenMenu;                                 //全屏菜单,因为全屏时主界面上的菜单等都没有了,所以需要另外做这些界面出来

private Point mainwindowPos;                                 // 窗口位置stores the last known window position

只截取了其中一部分,因为其余的我也没仔细看呢,这些都比较明显,就先注释上了。而且其中包含了比较关键的成员,比如加载了的umd光盘镜像文件,模拟器类,等。

///

MainGUI的初始化流程:

1.首先是一些关于日志的,忽略

2.打开三个用户目录

3.实例化Emulator

4.Screen类启动,这个类的规模很小,行为已经解读完毕,将在下一篇文章中具体说明。

5.设置语言

6.配置窗口位置

7.设置分辨率

8.创建界面中的图形组件

createComponents这个函数的实现部分是自动生成的,所以不用细看

9.设置日志窗口的位置,忽略

10.设置软件的Title,也就是软件名称

11.向图形界面中添加画布canvas,这个画布相当于游戏机的显示器了

12.取得组件的外部填充,即组件与其显示区域边缘之间间距的最小量,再用这个量结合游戏机屏幕的尺寸,得到最小尺寸。

13.将调试用的控制台置于主窗口下方

///

以上只是大体的初始化流程,可以看到这份源码的一个粗略框架。至少大概知道这个图形界面是怎么出现在屏幕上的了。

之后的事情就交给了各个事件的监听器。

可以想见,当用户点击了载入umd的按钮,会触发监听器等待用户以某种方式输入一个光盘镜像文件,然后软件记录下这个镜像文件。

之后,当用户点击了运行游戏的按钮,监听器监听到之后,会从刚才记录下的镜像文件中得到游戏的可执行文件,并解释执行,这样模拟器就真正运转起来了。

jpcsp源码解读之二:main函数与jpcsp的初始化流程相关推荐

  1. jpcsp源码解读之一:源码的获取与编译,以及psp详尽硬件信息文档

    是我心血来潮的想法,要解读一下psp模拟器的源码,并添加详尽的中文注释.这个博客则成为文档. 本文面向java语言零基础的程序员,因为我本人的java基础就是零. 水平所限,疏漏错误之处欢迎指正.也欢 ...

  2. JPCSP源码解读14:动态二进制翻译2

    JPCSP源码解读14:动态二进制翻译2 IExecutable 上一篇中提到,我们现在有CodeInstruction,代表单条指令,以及其两个子类,分别代表无分支基本块和本地码序列.另外,有cla ...

  3. jpcsp源码解读9:指令的抽象描述与指令的译码

    本文尝试说明jpcsp中译码器单元的实现方式. / 首先是对指令的一个抽象描述,Instruction类: public static abstract class Instruction / jav ...

  4. x264源码解读(二)- VCL和NAL那些事

    目录 ANNEXB vs. AVCC VCL vs. NAL signal函数响应键盘事件 收尾清理工作 x264的编码 ANNEXB vs. AVCC 今天我们继续来说一下x264结构中非常重要的属 ...

  5. print python 带回车_python标准库threading源码解读【二】

    紧接着上一篇文章继续解析源码 甘蔗:python标准库threading源码解读[一]​zhuanlan.zhihu.com 目录 Event的介绍和用法 Event源码解析 以后的内容尽量少一点并且 ...

  6. jpcsp源码解读5:umd光盘镜像(.iso)

    这次的状况稍显复杂. 首先说一下umd光盘镜像文件的内部组织方式.注意,这些内容全部是从源码解读而来,而不是来自关于这种文件格式的标准文档. java科普之文件操作: fileReader = new ...

  7. jpcsp源码解读6:PSF文件

    当你运行了模拟器,通过模拟器菜单选择并加载一个umd镜像,模拟器就用这个umd镜像实例化一个UmdIsoReader(见上一篇,源码解读5). 通过这个UmdIsoReader,从光盘提取的第一个文件 ...

  8. CesiumJS 2022^ 源码解读[7] - 3DTiles 的请求、加载处理流程解析

    3DTiles 与 I3S 是竞争关系,可是比起生态开放性.数据定义的灵活性与易读性来说,3DTiles 比 I3S 好太多了.由于数据生产工具的开发者水平参差不齐,且数据并不存在极致的.万能的优化方 ...

  9. jpcsp源码解读10:指令的执行

    这次要说的是处理器类: public class Processor 主要的成员变量: public CpuState cpu = new CpuState(); public static fina ...

最新文章

  1. 327 - Evaluating Simple C Expressions
  2. 微生物基因组分类数据库GTDB和软件GTDB-Tk
  3. PHP严重致命错误处理:php Fatal error: Cannot redeclare clas
  4. 压缩跟踪Compressive Tracking
  5. MongoDB 文档的更新操作
  6. 计算机安全原理与实践_《计算机图形学原理及实践》学习笔记之第三章
  7. 计算机科学与导论期末论文,计算机科学与导论论文3
  8. ServletContext对象、ServletConfig对象
  9. 腾讯整治扫码点餐强制关注公众号问题
  10. 菜鸟系列之C/C++经典试题(七)
  11. 当手机访问时自动跳转到手机网站
  12. TrueType字体结构
  13. 中国智慧VS西方智慧-看中国IT风云
  14. altium summer 9导入orcad dsn文件的方法
  15. matplotlib 配色之内置 colormap
  16. 偏振器件传输矩阵matlab编程,关于传输矩阵法模拟光子晶体的MATLAB编程
  17. 7、Java基础——从控制台输入:Scanner类的的用法、数据类型转换、字符型的运算、print与println的区别、Java中的转义字符
  18. Eclipse中出现-访问限制由于对必需的库XX具有一定限制,因此无法访问类型
  19. rgb sw 线主板接口在哪_纯白信仰打造RGB主机,四件套提升100%性能-Thermaltake
  20. KNN(k-nearest neighbor的缩写)最近邻算法原理详解

热门文章

  1. win7系统搭建svn服务器,Win7系统如何使用VisualSVN Server搭建SVN服务器?
  2. Redis String数据类型
  3. 二、交换机的基本配置及管理
  4. 腾讯股票接口API(2)——根据股票代码获取K线数据
  5. 滑动验证码识别----解决天眼查自动登录问题
  6. STM32教程(4)-最小系统的设计
  7. 物理真机上LUKS结合TPM的测试 —— 使用随机数密钥
  8. 清华大学云盘使用指南
  9. 掌财社:北向资金买入的股票一定涨吗?
  10. 【Unity】 Spine渲染原理解析与源码解读