『博客日志 & 大事祭』
emm 好久好久没写博客了删了点东西就当重新开始吧 😉
加载过慢请开启缓存 浏览器默认开启
超级省流版:
分辨率一般建议缩放为 1080p,略微提高分辨率后期做视频的容错更高,酌情选择
录制帧数 120fps 在进行渲染后基本够用,B 站压缩后与 240fps 的渲染差别应该不大
如果你的内存足够用的话选择 H.264 编码器也无妨。
240fps、1080p 的录制规格下 H.264 的视频码率大约在 100mbps 左右?
240fps、2k 的录制规格下 H.265 编码的视频码率大约在 45mbps 左右,以此类推
目标质量设为 16 为视觉无损,大部分情况也够用,更高的质量带来的视频观感的提升并不明显
blur-weighting 建议选择 vegas(目前观感最好)
插针倍数(interpolated fps)不建议超过 6x,建议使用 svp 而不是 rife 模式进行插针(否则您将会体验到非常慢的速度以及报错的视频)
AI 补帧(pre-interpolation)视个人喜好而定,开启画面会有一种粘腻感。倍数越高,渲染速度越慢
质量(quality)拉到 16 差不多就够了,似乎是因为软件没有进行多次编码导致输出文件过于庞大(如果您不在意内存消耗可以掠过)
如果你遇到了与该 issues 相同的问题,尝试关闭 GPU 编码,如果还是不行,请重置渲染设置
更多详见 README
如果想要偷懒可以直接下载我的配置文件(只提供 Minecraft 和 Optfine 的配置文件,因为 LC 的太乱了):
下载后将这两个文件移动到您的 .mincraft
文件夹中重启客户端即可获得同款效果
options.txt
文件中包含了按键绑定、鼠标灵敏度等因个人习惯而异的选项,酌情替换
亮度可以选择拉满,我拉到 80% 只是因为看着比较舒服(但是这图片截出来感觉颜色好脏)
如果想要良好的迷雾效果,天空和星星选项一定要关闭。迷雾建议选择 Fancy,Fast 模式下的迷雾过度并不是很舒服
在开启动态模糊 / 光影的情况下 Fast Render 不可用。这些选项很多都可开可不开。根据您的需求和实际情况而定
源码见 Github
或直接在以下代码块中直接复制:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <new>
#include <type_traits>
namespace BetterIO {
namespace ExtraType {
inline bool isDigit(const char &ch) {
return '0' <= ch && ch <= '9';
}
inline bool isLetter(const char &ch) {
return 'A' <= ch && ch <= 'Z'
|| 'a' <= ch && ch <= 'z';
}
inline bool isChar(const char &ch) {
return isDigit(ch) || isLetter(ch);
}
inline bool isVaild(const char &ch) {
return '!' <= ch && ch <= '~';
}
}
using std::string, std::is_same_v;
#ifndef BUFFER_SIZE
#define BUFFER_SIZE 1 << 16
#endif
class betterInput {
FILE *stream;
char *buffer, *iter;
int buffer_size, volume;
void input() {
volume = fread(buffer, 1, buffer_size, stream);
iter = buffer;
}
inline void getChar(void) {
if(iter - buffer == volume) input();
else ++iter;
}
public:
betterInput(FILE *stream = stdin) {
this -> stream = stream;
buffer_size = BUFFER_SIZE;
buffer = new char [buffer_size];
iter = buffer;
volume = 0;
}
template <typename _Tp> betterInput& operator >> (_Tp &var) {
if constexpr(is_same_v<_Tp, char> || is_same_v<_Tp, string>) return inputCharType(var);
else {
static bool neg = false;
while(!ExtraType::isDigit(*iter)) {
neg ^= *iter == '-';
getChar();
}
var = 0;
if constexpr(is_same_v<_Tp, float> || is_same_v<_Tp, double>) return inputFloat(var, neg);
else {
while(ExtraType::isDigit(*iter)) {
var = (var << 1) + (var << 3) + (*iter ^ '0');
getChar();
}
if(neg) var = ~var + 1;
}
}
return *this;
}
template <typename _Tp> betterInput& inputCharType(_Tp &var) {
while(!ExtraType::isVaild(*iter)) getChar();
if constexpr(is_same_v<_Tp, char>) var = *iter, getChar();
else {
var.clear();
while(ExtraType::isVaild(*iter)) {
var.push_back(*iter);
getChar();
}
}
return *this;
}
template <typename _Tp> betterInput& inputFloat(_Tp &var, const bool &neg) {
while(ExtraType::isDigit(*iter)) {
var = var * 10 + (*iter ^ '0');
getChar();
}
if(*iter == '.') {
getChar();
_Tp dec = 0.1;
while(ExtraType::isDigit(*iter)) {
var += dec * (*iter ^ '0');
dec /= 10;
getChar();
}
} else getChar();
if(neg) var = -var;
return *this;
}
~betterInput() { delete[] buffer; }
};
class betterOutput {
FILE *stream;
char *buffer;
int buffer_size, volume;
inline void putChar(const char &ch) {
if(buffer_size == volume) flush();
buffer[volume++] = ch;
}
public:
betterOutput(FILE *stream = stdout) {
this -> stream = stream;
buffer_size = BUFFER_SIZE;
buffer = new char [buffer_size];
volume = 0;
}
void flush(void) {
fwrite(buffer, 1, volume, stream);
volume = 0;
}
template <typename _Tp> betterOutput& operator << (_Tp var) {
if(var < 0) putChar('-'), var = -var;
if constexpr(is_same_v<_Tp, float> || is_same_v<_Tp, double>) return outputFloat(var);
else {
static char digit[25];
static short cur = 0;
do digit[cur++] = static_cast<char> (var % 10 + '0'); while(var /= 10);
while(cur) putChar(digit[--cur]);
}
return *this;
}
betterOutput& operator << (const char &var) {
putChar(var);
return *this;
}
betterOutput& operator << (const char *var) {
while(*var) putChar(*var++);
return *this;
}
betterOutput& operator << (const string &var) {
for(auto cur: var) putChar(cur);
return *this;
}
template <typename _Tp> betterOutput& outputFloat(_Tp &var) {
const string str_var = std::to_string(var);
for(auto cur: str_var) putChar(cur);
return *this;
}
~betterOutput() { flush(); delete[] buffer; }
};
#undef BUFFER_SIZE
}
signed main() {
return 0;
}
为了更好地食用模板,请务必仔细阅读以下内容
完整版代码长度4.7k,不考虑写成头文件(毕竟竞赛没有多文件)。或者也可以选择 Lite 版 模板
使用 fread/fwrite
函数实现。默认缓冲区大小为 $2^{16}$,也可以通过更改模板中 BUFFER_SIZE
的值来更改缓冲区大小(不建议超过 $2^{23}$)
重载了 >>
和 <<
,可以像使用 cin/cout
的方式来进行读写
不要与相应的输入输出流混合使用(比如同时使用 fread
和 cin
,fwrite
和 cout
),fread/fwrite
是一次性从缓存中读取 / 输出数据,混合使用会导致变量数据错误等无法解决的问题
支持 Linux 和 Windows 环境,如果可能,会尝试写一个 mmap
版本(Windows下通过 CreateFileMapping
实现)
经调试应该没有什么大的问题,如果有的话可以 Luogu 私信我,会尽快修改
请保证您传入的参数是合法的,出现任何未知的问题概不负责
若要使用此模板,请通过 BetterIO::betterInput in
和 BetterIO::betterOutput out
来创建对象
支持整形、字符、字符串、浮点数的输入,整形、字符、字符串、浮点数、char*
的输出(在现在的竞赛环境下几乎不会用到 char*
类型的输入,故舍弃)
关于 bool
类型的数据,对其单独写一个输入 / 输出函数是没有任何意义的,故舍弃
您可以使用 in >> x;
读入一个以上任意的一个类型的数据,使用 in >> x >> y >> z >> ...;
读入任意个以上支持的数据类型
对于 char
与 std::string
类型的输入,默认有效字符的范围为 ACSII 码表中的 33 至 126
您可以通过更改以上输入类型的判定条件输入特定字符范围的数据
...
template <typename _Tp> betterInput& inputCharType(_Tp &var) {
while(!ExtraType::isVaild(*iter)) getChar(); // 更改 ExtraType::isVaild 函数以输入特定字符范围数据
if constexpr(is_same_v<_Tp, char>) var = *iter, getChar();
...
命令行输入完数据后,使用 ctrl + z
刷新缓冲读入数据。文件流无需注意此项
您可以使用 out << x;
输出一个以上任意的一个类型的数据,使用 out << x << ' ' << y << ' ' << z ...;
输出任意个以上支持的数据类型(带空格)
对于浮点类型的数据(float
和 double
),默认输出精度为 6 位小数,不支持更改精度绝不是我太懒了懒得写
若有其它精度输出的需求请用其它输出方式
待补 —— 25.7.26