Dust Loong
Dust Loong
### 自己常用的小技巧 打通了游戏赶紧再写一篇. 这里列出了自己常用的一些c/c++小技巧, 有些会有不足, 可以简单探讨一下. ### 函数指针类型 分类: 解决方案 c里面可以使用```typedef```的方式声明一个函数指针的‘类型’, 非常方便.但是c++11出现的```noexcept```修饰符就出现了不方便的地方. ```cpp #include #include using func1_t = void(*)(int) noexcept; using func2_t = void(*)(int); int main() { const bool same...
一开始看成Innocent File算是职业病? ---- 现在没有通关的游戏真的是堆成山了, 能完整通关的游戏越来越少了, 简单纪念一下.  ---- 好友列表一堆的大表哥2, 自己还真是一股清流. ---- 感谢名单看到自己的id还是挺感动的, 原以为是印在本子上结果是在游戏结尾的感谢名单:  ----  原来主角姓金田一. ----  过了! ----  女装dalao惹不起惹不起 ----
### 自己常用的小技巧 这里列出了自己常用的一些c/c++小技巧, 有些会有不足, 可以简单探讨一下. ### 接口 分类: 标准 这个是一个几乎为标准的一个东西, c++端将所有函数声明为纯虚函数, 而且不含成员变量, 如: ```cpp #if defined(_MSC_VER) && defined(__cplusplus) #define NOVTABLE __declspec(novtable) #else #define NOVTABLE #endif struct NOVTABLE IObject { //...
### 自己常用的小技巧 这里列出了自己常用的一些c/c++小技巧, 有些会有不足, 可以简单探讨一下. ### 大小端 分类: 简单讨论 "大小端"这一名称来自很有意思. 不过, 在这里, 大致就是怎么处理"字节序"的. 我们用```char```, ```char16_t```以及```char32_t```描述'A'的话就是这样的: ``` (按地址增长方向排列) 小端序 大端序 混合序 char 'A' 'A' 'A' char16_t 'A',0 0,'A' (?) 'A',0 char32_t...
### 自己常用的小技巧 这里列出了自己常用的一些c/c++小技巧, 有些会有不足, 可以简单探讨一下. ### 32位/64位等 分类 分类: 小技巧 同理可以用于其他位, 比如16位什么的. 由于不同位的平台指针的大小可能是不同的, 所以导致一些逻辑必须分别讨论. 很多时候我们可能不会在意是移动平台还是桌面平台, 但是肯定会在意指针的大小. c++的话可以使用模板特化方便地处理, 模板特化也是c非常难以模拟的特性之一. 最简单的, 比如我们想在32位平台是用单精度浮点而64位平台使用双精度浮点: ```cpp template struct float_helper_t{ }; template struct float_helper_t { using...
### 自己常用的小技巧 这里列出了自己常用的一些c/c++小技巧, 有些会有不足, 可以简单探讨一下. ### 颜色混合 分类: 小技巧 有一个可能很常用的操作, 或者说函数: 平均数. 通过基础数学我们可以知道```(a+b)/2```, 如果用c中无符号整型表示: ```c uint32_t avg(uint32_t a, uint32_t b) { return (a+b)/2; } ``` 一般情况下没问题, 但是在两个数足够大时可能会产生溢出, 由于乘法分配律可知, 我们可以实现为: ```c...
### 更多的算法 像素风格缩放算法还有非常多, 光维基那种对照图就还有LQx和xBR系列, 有机会的话再介绍吧! 下面就是音频的部分了, 不过在介绍滤波器之前, 先讨论一个问题: 我们加入这些额外处理部分是为了提升用户体验程度. 与视频部分不同的是, 我们能拿到音频更基础的信息. 就像第一个音频播放状态机一样, 我们能知道音频在某一刻的信息. 那我们能不能根据这些提高音质呢? ### 方波 这个没什么好说的, 不是0就是1. ### 三角波 这个就有的说了, 从之前的实现我们知道: FC的三角波实际上是一个伪三角波, 从0到15, 再通过混频. 可以看作是一个深度为4bit的(伪)三角波, 我们可以通过额外的处理来加深三角波的深度, 或者调整算法逼近真正的三角波. 那么问题来了, "音质"提高了吗?...
### HQx 进入[HQx](https://code.google.com/archive/p/hqx/)族了, HQx系列有一个特别的地方: 抗锯齿. 根据维基的介绍, HQx大致分为两个, 原版Maxim Stepin的HQx以及效果稍微差但是省空间的ScaleHQ. 前者, 作者形式发布的代码, 就算出现问题, 我们可以派生出一个LGPL实现分支, 然后直接使用预编译的二进制码即可. 后者, 则是由不同的作者实现, 然后被误以为是原版的HQ. ### 2xScaleHQ 那就先说说简单版的ScaleHQ吧, 似乎由guest(r)实现的. 根据libretro的文档, 有两个放大率的, 这里称为scalehq2x 和scalehq4x. 2x应该是在public domain, 而4x是GPL. 代码上根本看不出算法, 只有数学运算,...
### Eagle 下面继续讨论一些关于像素风格缩放算法. Eagle本身是一个比较初级的想法[Eagle (idea)](https://everything2.com/index.pl?node_id=1859453), 称不上真正的算法, 但是有些后续的算法就是基于Eagle的. Eagle是放大至2倍, 这里称之为eagle2x. Eagle想得很简单, 放大两倍后, 那个像素旁边原本3个像素颜色一样的话就设定为该颜色, 否则就是最邻的. ``` first: |Then . . . --\ CC |S T U --\ 1 2 . C ....
### 滤镜与滤波器 这一步就来讲讲滤镜与滤波器, 都可以叫做filter, 总的来说可以提升用户体验. ### 滤镜 滤镜有很多种, 比如模拟CRT显示器, 但是这里不是说的这么一类. 由于原生分辨率只有256x240, 对于现在来说太小了, 我们可以把它放大一点, 使用的算法称为缩放算法(scaling algorithms), 处理后效果就简单地称为滤镜了. 这里采用被维基标注为public domain测试用卡片:  ### Filter 例如```D3D11_FILTER```有这么一个枚举```D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR```, 其中```POINT```和```LINEAR```就是代表了两种最基础的过滤方式: 点过滤和线性过滤. 一般缩放算法会采用插值, 这两个过滤方式对应的就是最邻插值和线性插值了. ### 最邻插值 也是之前采用的插值算法, 下面是放大3倍后效果...