当我在 youtube 上观看 demoscene 视频时,作者经常吹嘘他们的文件大小是 64kb 或更小,有些只有 4kb。当我用 C++ 编译一个非常基本的程序时,可执行文件总是至少 90kb 左右。这些演示完全是用汇编编写的吗?据我了解,demomakers 也使用了 c/c++。
5 回答
我是Felix 的 Workshop and Immersion的编码员之一(Ctrl-Alt-Test 的 64k 介绍)。现在大多数 64k 介绍都使用 C++(例外:Logicoma使用 Rust)。汇编可能对 4k intros 有意义(尽管它们中的大多数实际上使用 C++),但不适用于 64k intros。
以下是最重要的两件事:
- 不使用标准库进行编译(特别是,STL 会使二进制文件变得非常大)。
- 压缩你的二进制文件(kkrunchy用于 Windows 上的 64k 介绍,Crinkler用于 Windows 上的 4k 介绍)。
现在,您可以在填充 64kB 之前编写大量代码。如何使用它们?程序生成。
- 对于音乐,音乐表被压缩。乐器是用软合成器生成的。一个流行的选择,虽然有点过时,是使用Farbrausch 的 v2。
- 如果您需要纹理,请生成它们。
- 如果您需要 3d 模型,请生成它们。
- 动画和效果是程序性的。
- 对于相机,保存一些关键位置并进行插值。
- 着色器在现代图形中大量使用。缩小着色器可以节省大量空间。
想了解更多关于程序生成和其他技术的信息吗?查看IQ 的文章。
如果你想进一步优化你的代码,这里有一些额外的技巧:
- 你可能使用了很多花车。尝试截断浮点数的尾数(它可以节省很多 kB)。
- 禁用函数内联(它为我节省了 2kB)。
- 试试 fastcall 调用约定(它为我节省了 0.7kB)。
- 禁用对异常的支持。你不需要它们。
- 如果您使用类,请避免继承。
- 使用模板时要小心。
在典型的 4k 介绍中,C++ 代码用于音乐和初始化。图形在着色器中完成。
这些演示不使用标准库(不是 C++,甚至不是 C 标准库),也没有与标准库链接(以避免导入表大小)。它们仅动态链接必要的绝对最小值。
演示的“主函数”通常与入口点相同(不像在普通程序中,入口点是 CRT 初始化函数,该函数执行一些特定于操作系统的设置、初始化全局变量、运行构造函数并最终调用main
)。
通常演示可执行文件不符合可执行格式的规范(省略最小节大小和对齐方式),并使用 exe 打包程序进行压缩。从技术上讲,这些是“损坏”的程序,但它们只是“损坏”太多,以至于它们仍然可以成功运行。
此外,此类演示严重依赖程序生成的内容。
这些超小型程序通常不依赖于任何库或框架,这在传统应用程序开发中很常见。这些程序通常直接访问图形/io 等。
这实际上取决于您的环境,但是如果您不实例化任何模板,并且动态链接所有内容,那么为您的可执行文件实现非常小的大小是相当容易的,因为您实际执行的代码都不会在可执行文件中。
我还不能发表评论,因为我没有 50 个代表点,所以我正在回答。
创建较小程序的一种方法是使用较旧的编译器,例如 Microsoft Visual C/C++ 4.0,它生成的 .exe 文件比 Microsoft Visual Studio 2005 更小。