Archive

Archive for the ‘游戏开发’ Category

游戏机模拟器的具体原理是什么?

February 8th, 2017 No comments

“游戏机模拟器” 注重的是 “严格模拟硬件”,要精确,可以对照 MAME代码,所有问题都能在里面找到对应答案:

第一:模拟 CPU

MAME里实现了各种 68000, z80,mips, sparc, arm,pic16c5x,nec, alpha,等 100 多款你见过的或者没见过的主从协处理器的模拟,虽然都是 switch case opcode,但是不像 lua虚拟机。MAME的 CPU模拟重点在 “精确实现硬件”,除了指令集实现外,还有各种软硬终端/trap/异常处理/IO实现。举个简单例子,一个游戏主机需要 4MHz 的 z80芯片,你就得给我真的按照 4Mhz来跑,每条指令计算周期,不能多也不能少,你要把 4Mhz跑成 8Mhz,游戏玩起来节奏就不一样了。比如以前老游戏机上敌人一多,就会慢下来,你实现模拟器,也得把这种慢下来给实现了。另外很多街机是双处理器,比如一块 68000 + z80,你不能复原老主机的运行速度,一些写的粗糙的游戏 ROM可能会出错。

模拟 CPU重点是 “精细”,比如浮点数误差最好一致,比如中断优先级你得模拟出来,模拟器由于按照 interval 来运行,更容易产生同时多个硬件中断被触发,比如 “手柄按键” ,多核通信之类各种东西加在一起,某个核满负荷运行的情况下,优先级低的可能永远得不到处理,弄错了可能游戏就没法玩了。

第二:模拟总线

总线也有好多规格需要实现,不同基板的总线链接不同cpu 和外设的方式都不一样,还是需要 “精确模拟”,比如 ROM /RAM / IO 地址映射,一些大容量游戏需要 ROM 的 BANK 切换,还有一些游戏会在卡带上带有扩展内存,除此之外还要正确模拟各种异常,比如某些 RAM,读写奇数地址会出错,要给对应 CPU发送异常信号,某些老点的 RAM只能读写 16bit的 WORD,不能读写 DWORD或者 BYTE,否则都无效。这些你都得模拟到位了,有些有 BUG的游戏,错误的写了内存,在真实主机上,写操作直接被硬件忽略掉了,没有损伤,但软件模拟不注意执行了那条指令结果就不一致了。

第三:外设模拟

音频芯片,I/O,图形加速芯片,随机数发生器,音视频输出,摇杆,时钟等。有些外设是有bug的,你也要把这些历史上的硬件bug给模拟进去,不然游戏可能行为不一致。

第四:调试系统

提供终端和接口可以内存 DUMP,反汇编,修改指令和数据,保存现场之类的。

有史以来出现过的游戏机硬件数不胜数,但是他们用到的芯片或者硬件是有限的,比如z80和 68000这类流行的芯片,具体每台主机其实就是一份配置文件,包含使用那种总线,哪些cpu,分别按照什么速度来运行,内存I/O布局,关联哪些外设,BIOS和启动加载等信息。

总之是个辛苦活,你需要一本硬件手册,然后边查边弄。

如果你嫌 MAME太复杂庞大,再推荐一个 gens 的代码,只针对世嘉16位机的 Windows实现,条理很清晰,很多比世嘉简单的 FC模拟器写的都没有 gens那么结构清晰,简单易读。它就不像MAME那么大而全,很多步骤实现的很直接不需要配置那么多,代码量也不大。

现在新进的模拟器很多,没机会逐一查看他们的实现细节,只记得有几款比较新的模拟器都是直接裁剪 MAME的部分代码来弄的,因为 MAME里面几乎实现了所有游戏能用的芯片了,拿出来改改参数加点指令集就可以用,比如 MAME里面模拟了 mips,我们裁剪出来实现 PSP模拟器,个别指令有些区别需要改一下,然后我们着重自己实现 PSP里面 MAME没有的硬件部分。

Categories: 游戏开发 Tags:

再谈网游同步技术

May 9th, 2015 18 comments

实时动作游戏在近年来得到迅猛的发展。而游戏同步问题,成为大家继续解决的核心问题之一。早在 2004年,国内游戏开发还处于慢节奏 RPG满天飞的情况下,我就开始实时动作游戏研究,分别在 2005-2006期间写了一系列相关文章,被好多网站转载:

帧间同步模式:《帧锁定同步算法》(2007): http://www.skywind.me/blog/archives/131 

玩法规避模式:《网络游戏同步法则》(2005): http://www.skywind.me/blog/archives/112

预测插值模式:《影子跟随算法》(2007): http://www.skywind.me/blog/archives/1145

如今十年过去,网上越来越多的人开始讨论游戏同步技术了,然而很多文章往往只针对某种特定的游戏情况,而观点又经常以偏概全。很多人并没有真正开发过实时动作游戏,更别说了解同步技术的前世今生了。转载别人的观点并加上自己理解的人很多,实际动过手的人很少。避免给更多人造成无谓的误导,我今天基于先前的实践和对欧美动作游戏,战网游戏,主机游戏(PSN,XBox Live等)网络技术的了解,来对这个问题做一个简单总结:

网速的变化

开发快速动作游戏,首先要对公网的网络质量数据有详细的了解。这里所说到的网速,是指 RTT,数据往返一周的毫秒时间,而非每秒传送多少 KB/s。我写这篇文章是基于我 2005-2006年开发的东西来说的,当时国内公网质量比国外差很多:

clip_image003

上图为 2005-2006年国内的网络环境,某三个省级 IDC的情况采样。当时公网 RTT平均值基本在100ms,120ms左右徘徊。所以我文中引用了很多 100ms。这个情况在2009 年以后已经好了很多(60ms的rtt)。到了2012年以后,公网平均 RTT已经降低到平均 40ms-50ms,省内平均10ms以内了:

image

上图为 2015年某省级 IDC的全国延迟情况,如若全国多布点以及区别电信联通的话,平均延迟能控制在20ms以内,延迟基本接近国外水平(当然带宽还差很多),比我当年文章中提到的网络情况好了不少。

Read more…

Categories: 游戏开发, 网络编程 Tags: ,

游戏服务端架构发展史(下)

May 4th, 2015 16 comments

(占位符)

 

Read more…

Categories: 游戏开发, 网络编程 Tags:

游戏服务端架构发展史(中)

April 26th, 2015 11 comments

《游戏服务端发展史》转载请著名出处:http://www.skywind.me/blog/archives/1301

类型4:第三代游戏服务器 2007

从魔兽世界开始无缝世界地图已经深入人心,比较以往游戏玩家走个几步还需要切换场景,每次切换就要等待 LOADING个几十秒是一件十分破坏游戏体验的事情。于是对于 2005年以后的大型 MMORPG来说,无缝地图已成为一个标准配置。比较以往按照地图来切割游戏而言,无缝世界并不存在一块地图上面的人有且只由一台服务器处理了:

image

Read more…

Categories: 游戏开发, 网络编程 Tags:

游戏服务端架构发展史(上)

April 24th, 2015 No comments

手游页游和端游,本质上没有区别,区别的是游戏类型:

《游戏服务端架构发展史》转载请著名出处:http://www.skywind.me/blog/archives/1265 

类型1:卡牌,跑酷等弱交互服务端

卡牌跑酷类因为交互弱,玩家和玩家之间不需要实时面对面PK,打一下对方的离线数据,计算下排行榜,买卖下道具即可,所以实现往往使用简单的 HTTP服务器:

image

登录时可以使用非对称加密(RSA, DH),服务器根据客户端uid,当前时间戳还有服务端私钥,计算哈希得到的加密 key 并发送给客户端。之后双方都用 HTTP通信,并用那个key进行RC4加密。客户端收到key和时间戳后保存在内存,用于之后通信,服务端不需要保存 key,因为每次都可以根据客户端传上来的 uid 和 时间戳 以及服务端自己的私钥计算得到。用模仿 TLS的行为,来保证多次 HTTP请求间的客户端身份,并通过时间戳保证同一人两次登录密钥不同。

Read more…

Categories: 游戏开发, 网络编程 Tags:

你为什么会离开游戏行业?

April 18th, 2015 35 comments

这个题目本来不想讨论,现实生活中我是一个尊重他人的人,而尊重他人最重要的是尊重他人的选择,尊重他人的价值观和梦想。但是身边太多惨痛的教训,让我有种不吐不快的想法,大家偶尔也该停下忙碌的脚步来想想自己要走的路,也是一件很有意义的事情,所以如果言语中我伤害了你的梦想,请你绕道而行:

下有地雷,玻璃们请小心绕路:

Read more…

Categories: 大浪淘沙, 游戏开发 Tags:

二十年前是怎样开发游戏的?

April 10th, 2015 8 comments

知乎上有人问:“贴吧都是十五六岁就用引擎写游戏的天才,大家怎么看?”,感觉现在做游戏真实一件幸福的事情呀,不尽想起当年开发游戏的各种艰辛。

现在做游戏很简单,大把代码给你参考,大把框架给你使用,Windows帮你作完了大部分事情。我们那个年纪写游戏时,家里还没有Internet,什么资料都查不到,什么开源引擎都没有,95年左右你要写一个游戏,你起码面临:

  • 同显卡打交道,显卡著名的 ModeX显示模式,估计现在没几个人听过了吧,直接写显卡端口,N多trick才能初始化成功。
  • 直接访问显存,记得当年有个优化是,((char*)0xa0000L)[x + (y << 8) + (y << 6)]=c,把y两次左移相加代替y * 320。
  • 用调色板绘图,256色的调色板,建立若干索引表,来快速索引两个颜色混色的结果。
  • 保护模式编程,自己初始化GDT和LDT,后来找到 dos4gw,牛逼的 watcom c++。
  • 自己实现线程,编程8254时钟控制器,给CPU的IRQ0发中断,来调度不同最多32个任务,到时间靠一条IRET指令实现切换。
  • 自己控制声卡,通过220端口控制声卡(估计也没几个人用过吧),再用DMA传送音频,实现声音播放。
  • 自己实现混音,同时播放多个音源时,需要重采样成声卡格式,并且每次DMA中断时混音后给声卡。
  • 自己播放音乐,利用声卡338端口的 FM Synth合成器来播放MIDI音乐里面不同音轨的乐器音符,并用之前实现的线程系统,在后台线程运行。
  • 大量汇编代码,图形拷贝,图块缩放,RLE,显卡控制,多边形填充,键盘中断接管。
  • 自己绘制字体,HZK16,估计听过的人也没几个了。
  • 自己读取图片,GIF,PCX, BMP。
  • 自己播放视频,自己实现解码播放 animator, 3ds输出的 FLC视频格式的视频。
  • 自己实现脚本,没有LUA,没有PYTHON,但是你需要给你的游戏实现脚本来描述一些简单的剧情,没见过其他游戏是怎么做的,没有任何参考代码的情况下,意识到开发游戏需要靠脚本来提高效率,然后自己实现一套脚本系统。
  • 凭空实现游戏,从来没见过任何一款游戏代码的情况下,自己想想状态机应该怎么写,游戏对象应该怎么同时移动,图像前后遮挡该怎么做,游戏各种逻辑该如何写。
  • 学习美术设计,虽然没有美术功底,但得熟练应用当时常用的animator,3ds,等软件,自己制作一些简单的界面和角色,自己能对其他图片进行二次加工,画像素图,合并调色板。

Read more…

Categories: 大浪淘沙, 游戏开发, 随笔 Tags:

TINY-GOBANG 最精简的五子棋人机对战

November 8th, 2012 No comments

国庆没事,想看看最少多少行可以写一个人机对战起来游戏,于是有了这个Python版五子棋人机对战,仅仅几百行。

http://www.skywind.me/mw/images/7/7f/Gobang.7z

https://github.com/skywind3000/gobang

下面是代码(点击More展开)

Read more…

Categories: 人工智能, 游戏开发 Tags:
Wordpress Social Share Plugin powered by Ultimatelysocial