自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 资源 (5)
  • 收藏
  • 关注

原创 NES 模拟器中音画同步问题

本文探讨了模拟器中的音画同步问题,分析了各个原因,并提供了相应的解决方案。对模拟器开发,或者游戏循环开发有兴趣的朋友可以一读。

2024-01-12 23:26:03 878

原创 NES 系统架构

NES(FC、红白机、小霸王)的系统架构可用下图表示:系统中最核心的组件是 CPU,其它组件都可以算作 CPU 的外设。CPU 的外设包括:PPU(图像处理器)、APU(音频处理器)、WRAM(内存)、IO 设备(手柄、键盘等)、CART(卡带)。这些外设分别占据 CPU 地址空间中的一部分,CPU 通过设置 CPU 地址总线选中相应的外设,然后通过 CPU 数据总线与外设交换数据。CPU 与外设的这种通信方式也叫“内存映射 IO”,外设占用的地址空间可以到上查阅。系统中第二核心的组件是 PPU。

2023-06-02 16:49:09 338

原创 JS 实现简单 Parser

通过本文读者将学到如何实现一门领域特定语言(DSL),并使用这种 DSL 完成文本解析任务,例如 JSON 解析、表达式求值等。

2023-04-09 16:35:55 638

原创 6502 寻址时序

6502 共有 13 种寻址模式,我把每个寻址模式的时序整理成了表格,以便清晰地看出 CPU 内每个时钟周期的工作状态,对于理解 6502 的工作原理应该有所帮助

2023-03-24 13:25:53 303

翻译 【译文】NTSC 2C02 技术参考

PPU(2C02)是 NES(FC、红白机、小霸王)的重要组件,正确理解它显然能让开发模拟器的工作快速进行。本文是对 Brad Taylor 所写文档 “NTSC 2C02 technical reference” 的中文翻译,是本人逐字逐句翻译而来,并非中文网上流传的机翻版本,希望对有兴趣的人有所帮助。

2023-03-17 22:04:00 269

原创 Mapper 档案:MMC1

NES(FC,红白机,小霸王)内存映射控制器(Mapper)MMC1 相关资料

2023-02-24 11:13:09 122

原创 Mapper 档案: MMC3

NES(FC,红白机,小霸王)内存映射控制器(Mapper)MMC3

2023-02-24 10:54:12 180

原创 NES APU Replayer

做了一个网页版的 NES(FC、小霸王、红白机)APU 可视化 UI,欢迎体验

2022-07-21 21:29:11 666

原创 NES APU

NES(小霸王、FC)模拟器开发中,各部分其实都不简单。而 APU 和声音系统的难点在于,我们可能缺乏相关的知识。desdev 上虽然有硬件各部分的详细说明,却不成系统,很零散。本文将围绕 “声音的产生”、“NES APU 的组成”、“播放 APU 声音” 三个知识点并结合代码的方式介绍如何实现 NES APU。.............................................

2022-07-13 17:27:59 1629 11

原创 C++ 消息循环

消息循环是非常有用的工具,各平台都能见到它的身影,比如 CFRunLoop、Android Looper、Windows 消息循环等。有时候出于一些原因,我们并不想使用平台相关 API 或者三方库,就想自制一个简易的消息循环将就用,该怎么实现呢.........

2022-06-10 13:49:36 1310

原创 Graphviz + Dot 经验分享

Graphviz + dot 经验分享,不定期更新。

2021-12-30 15:39:02 621

原创 JS 使用协程处理事件

ES6 引入了一个新的关键字 `yield`,用它可以实现发生器(generator)和协程(coroutine)。其中,协程有个很有趣的应用是用作事件循环。有了协程,对于事件的处理,除了传统的 “回调函数+状态” 方案外,我们又多了一个选择。

2021-12-29 18:55:38 1326

原创 React 防抖动(debounce) Hook

防抖动 (debounce)是常见的需求,本文将演示两种方案应用 React Hooks 实现防抖。

2021-12-16 13:52:30 5498

原创 JS 绘制 Cardinal 样条曲线

Cardinal 曲线可以参考一下我另一篇文章 Cardinal 与三阶 Bezier 相互转换。根据定义,给定点集 {Pk−1,Pk,Pk+1,Pk+2}\{ \mathbf {P}_{k-1}, \mathbf {P}_k, \mathbf {P}_{k+1}, \mathbf {P}_{k+2} \}{Pk−1​,Pk​,Pk+1​,Pk+2​} , 则 Pk\mathbf {P}_kPk​ 到 Pk+1\mathbf {P}_{k+1}Pk+1​ 之间的曲线可以由如下方程生成:P(u)=au3

2021-12-08 22:01:43 966

原创 Cardinal 与三阶 Bezier 相互转换

Cardinal 曲线与三阶 Bezier 曲线同为 3 次曲线,理论上可以相互转换。Cardinal 曲线根据定义,给定点集 , 则 kkk 点到 k+1k+1k+1 点之间的曲线可以由如下方程生成:P(u)=[u3u2u1][−s2−ss−2s2ss−33−2s−s−s0s00100][Pk−1PkPk+1Pk+2]P(u) = \begin{bmatrix} u^3& u^2 & u & 1 \end{bmatrix}\begin{bmatrix}-s &

2021-11-30 21:28:52 838

原创 数值分析算法

因研究一个新项目,了解到一些数值方法,记录下来,避免忘记。前向欧拉法 (FE)前向欧拉法可用于计算微分方程数值解。根据导数的定义,当 hhh 足够小时,有:y(x0+h)−y(x0)h=y′(x0)\frac {y(x_0+h) - y(x_0)}{h} = y'(x_0)hy(x0​+h)−y(x0​)​=y′(x0​)稍加变换,可得:y(x0+h)=y(x0)+hy′(x0)y(x_0+h) = y(x_0) + hy'(x_0) y(x0​+h)=y(x0​)+hy′(x0​)设

2021-11-28 14:04:50 1049

原创 从 Git 提交历史生成 Release Note

git log --format='%(trailers:key=Type,valueonly,separator=%x20)%x1c%s [%(trailers:key=Issue,valueonly,separator=,)]' $FROM..HEAD | awk -F "\034" ' { gsub(/\[\]$/, "", $2); if (length($1) == 0) $1="MISC"; if (!($1 in item_count))

2021-08-02 15:40:50 1608

原创 boardgame.io 五子棋(三):增加趣味

太长不看:点击这里查看源代码上一篇我们做了一个自己的蒙特卡洛 AI,今天我们给我们的游戏增添一点趣味。对称性我们知道五子棋游戏具有对称性,包含旋转和轴对称总计 8 种对称。纵使一个局面有这么多的对称局面,而 AI 却不见得可以利用这种对称性。由于 AI 不懂对称性,总是下相同的着法,咱们可以在游戏中把局面进行对称变换,让 AI 下出来的着法看似有所不同,从而增加一点趣味。大致思路就是,把人类的着法进行变换,然后把 AI 思考出来的着法进行反变换。首先,咱们要有变换函数。新建 src/Symmetry

2021-06-21 23:24:19 209

原创 boardgame.io 五子棋(二): AI 改造

太长不看: 点击这里查看完整代码。上一篇我们使用 boardgame.io + wgo.js + React 制作了一个简单的五子棋游戏,虽然引擎给我们搭配了 AI,不过 AI 实在太弱且效率不高,今天我们就自己做一个AI。蒙特卡洛!通过 Debug 面板我们看到,boardgame.io 搭配的 AI 是基于蒙特卡洛的,只是它的实现因为抽象和架构的原因,效率不高且不支持神经网络评估器,我们做一个自己的蒙特卡洛。我们的蒙特卡洛需提供如下功能:自定义评估器。这样我们就能实现神经网络评估和随机模拟评

2021-06-20 14:32:00 497

原创 BoardGame.io 五子棋(一)

BoardGame.io 是一个专门为回合制游戏打造的游戏引擎。无需一行网络或存储相关的代码,只需要编写简单函数描述游戏动作如何影响游戏状态,即可自动帮你生成一个支持多人在线的完整游戏。它支持游戏状态管理、多人、AI、阶段或回合管理、游戏大厅等诸多功能。今天我们就用它结合 React 制作一个网页五子棋游戏。准备首先,我们准备一个 React 项目,并添加 BoadGame.io 依赖。npx create-react-app gomokucd gomokunpm install boardgam

2021-06-02 11:05:40 975 1

原创 C++ Random Pick with Weight

在做五子棋 AI 的时候,遇到要根据权重从一组数里边选出一个这个问题。这个问题恰好也是 leetcode 第 528 道题,可以自己写算法解题,幸运的是,标准库就有这个功能:#include <random>int random_pick(double const* w, int k) { std::random_device rd; return std::discrete_distribution<int>{w, w+k}(rd);}自己写大概如下

2020-10-13 23:03:12 266

原创 C++ Dirichlet 分布

在做五子棋 AI 的时候,遇到一处要使用 dirichlet 分布。查阅了一下资料还挺复杂的,不过好在可以使用 gamma 分布来生成:#include <random>void dirichlet(double* out, int k, double a) { std::gamma_distribution<double> gamma(a); std::random_device rd; double *y = alloca(sizeof(doub

2020-10-13 21:50:31 374

原创 五子棋AI - 局面状态

上一篇文章已经有了蒙特卡洛树搜索算法了,再加上五子棋的局面状态的话,基本就是一个简单的 AI 了。这篇文章主要介绍如何实现局面状态。根据五子棋的玩法,我认为五子棋的局面状态应该包含如下数据:当前行棋方 当前局面是否终结 输赢结果 当前棋盘的状态(棋子位置)对于行棋方的表示,我采用 1 表示黑方,-1 表示白方,这样我就可以使用 player = -player 来交换行棋方(有点符...

2020-10-12 00:21:04 1473 13

原创 LMAX Disruptor

LMAX Disruptor 已经是好几年前的框架了,无论是官方还是网上已经有不少其原理分析的文章了,都2020年了,为什么还要写关于它的文章呢?几年前了解到 LMAX Disruptor 架构后,我便产生了将它移植到 C++ 上的想法。一方面是想看如此高性能的框架,移植到 C++ 会不会性能更高;另一方面是想通过源码移植了解它架构中更为基本的东西。后来虽然移植也完成了,文章也看了,但我发现它框架中最基本的东西依然没有理解。网上的文章,包括官方的,对于其无锁队列设计的解析,都是围绕它本身的结构(ring

2020-09-30 00:40:37 728

原创 五子棋AI - 蒙特卡洛树搜索

动机自高中时代做了一个带简单AI的五子棋游戏后,一直以来实现一个更加厉害的五子棋AI算是我的小目标。之前也尝试过使用 MinMax 算法,最终结果不甚理想。当然并不是算法问题,而是搭配这个算法需要许多领域知识,这些知识我并不了解,以至于结果与我的期望相去甚远。我心目中满意的五子棋AI是这样的:不需要像 MinMax 那样去编写一个局面评估函数 算法看上去很简单很傻也没关系,但可以通过...

2019-12-17 19:16:14 3574 3

原创 C++ 二进制转BCD码

二进制转BCD码, 进而可以转为十进制字符串表示.templatestd::vector bcd( const std::bitset& bits ){ std::vector buf; buf.push_back( 0 ); for( auto i = bits.size(); i-- != 0; ) { int carries0 = bi

2017-02-09 18:14:38 2021 2

原创 支持三态CheckBox的 MFC TreeCtrl 控件扩展

前言: 如果选择 MFC 来做界面, 那么, MFC 中各种功能有限的控件一定让你蛋疼不已. 比如, TreeCtrl 的 CheckBox 居然不支持三态以及 CheckBox 居然不能垂直居中对齐. 下面我将为大家介绍如何实现一个支持三态 CheckBox 的 TreeCtrl 控件, 谨作抛砖引玉.首先, 从 CtreeCtrl 派生一个类, 姑且命名为 CExTreeCtrl.

2012-08-26 19:57:36 2519 2

VC/MFC 布局类

已经厌烦在WM_SIZE里面写一堆布局计算的代码了么,或许这份代码可以帮助你。 这是一些用C++写的布局类,包含Border,Box,Flow,Grid,Stack五种布局,它们可以嵌套,通过结合Margin可以完成一些常见的界面布局效果,如居中,拉伸,居左,居右等。 各个对象布局的机制很简单(主要包括calc和adjust两个阶段),因此复杂的布局效果得要自己扩展。 另外,所有对象均自己管理内存,通过各个类的create函数来创建对象。 资源2分就当是鼓励吧。

2014-04-17

C++json解析库

自己实现variant时无意弄的,所以源码包里面包含 variant 和 json 两部分的代码,使用json请包含"json.h". 要使用这份代码需要一个支持C++0x的编译器,对visual studio来说VS2010及以上版本就可以。 IO部分使用C++的流来实现,因此你可以使用 cin >> jobject; fout << jobject; 这样的写法。对于中文的支持也是采用C++的本地化策略。包里面有测试代码,包含了文件流和标准IO流的输入与输出。 不足: 没有实现‘\uXXXX’的解析与转义 输出是不换行的,如果需要请行写一个格式化输出 效率没有测试过,但我觉得它应该是易用的。

2014-03-31

C++ 实现的 MD5 算法

自己写的 MD5 的 C++ 实现,在 vs2008,和 GCC 上编译通过 内附测试程序 main.cpp 具体使用参见 main.cpp

2011-08-13

json解析库(json-c-0.8,windows版)

编译好的 windows 版的 json-c-0.8 库。压缩包里面包含三个文件夹..\include,..\lib,..\src,”lib\“下有.lib和.dll。要使用该库,需要包含 json.h, json_object.h, json_tokener.h.

2010-07-25

《windows 程序设计》(非影印版,清晰)

*.chm 格式的《windows 程序设计》 ,中文版,该书之经典就不用说了

2009-08-20

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除