DFPSR
使用David Forsgren Piuva创建的SSE/NEON的现代软件渲染C ++ 14。如果您正在寻找最新的主流时尚,请查看其他地方。这是一个用于高质量软件的图书馆,该图书馆旨在在数十年内开发,并以最少的维护能够在孙子孙女身上幸存下来。就像将您的遗产刻成石头一样,掌握技能的努力需要更多的努力,但由于不依靠遥远的图书馆而带来了更强大的结果。最大的用户体验和最小系统依赖性。
创作者的背景
DXOMARK世界在移动行业的数字视频稳定中记录。与安全临界机器人愿景合作,以实现民用机场交通管制。在移动,医疗和游戏行业的不同公司优化中举行演讲。在GPU,CPU,DSP,ISP,FPGA和ASIC上进行了优化。
优化需要良好的工具来节省您的时间
优化代码最重要的部分是掌握高算法和低硬件限制,因为您不能让科学家设计算法和程序员对其进行优化,而没有任何更改手写汇编器的空间(最常见的错误)。直到质量和性能之间进行良好的权衡以及所有优化,算法设计才能完成。可以通过以较低的成本提高质量来增加质量,以提高速度和质量,从而节省时间。您可以更快地创建算法的最佳矢量化,您可以迭代设计过程的速度就越快。考虑一下您真正近似的内容。您的目标是绘制尽可能多的完美直角多边形,还是使用任何技术近似复杂的现实世界形状的目标?
官方网站:dawoodoz.com
您的游戏可能使用等值CPU渲染

实时动态光带有基于深度的铸造阴影和正常映射,在CPU上运行的800x600像素中的每秒453帧。更高的分辨率将破坏复古风格,并且实际上看起来更糟,但是游戏逻辑还有很多时间和其他效果。通过预先渲染3D模型来扩散,正常和高度图像,读取数据在现代CPU上的缓存效率要高于使用自由透视图。这也允许在屏幕上的像素比像素更多,并进行静态几何形状的被动更新。低详细的3D模型用于铸造动态阴影。
传统的3D用多边形渲染也得到了支持

3D渲染不如CPU上的2D或等距渲染快,但对于低详细图形,在1920x1080像素中通常达到60 Hz。要获得更高的细节水平和更多功能,建议复制和修改渲染管道,以使其仅针对您想要的功能进行硬编码,然后简化特定渲染引擎的数学,如用于沙盒示例所需的数学,其中仅需要顶点颜色才能无透视地添加颜色,从而可以通过将颜色计算而不是从深度上进行插图来计算,从而使颜色可以插入深度划分。
当GPU这么快时,为什么要使用开源软件渲染器?
- 使用软件渲染器的鲁棒性在犯错时可能不会破坏您的系统,这与易于使用蓝屏的GPU的图形API不同。
- 确定性如果它在一台计算机上起作用,它可能会在另一台计算机上工作,而操作系统之间的差异很小。但是,如果您删除任何驱动程序实现中具有错误的所有内容,则OpenGL的功能剩下零。
- 当您想要视觉样式或机器人视觉的低分辨率时,低顶开销时,当GPU变慢时,您不妨将其保持在静态链接的软件渲染器时保持最低。
- 轻松调试所有数据在软件渲染器中处理时,在调试过程中查看出了什么问题要容易得多。
- 易于修改,除了CPU周期和内存外,没有其他硬件限制,因此您可以通过复制和粘贴代码来修改整个渲染管道。
- 像素精确的2D,而不是对多边形进行奇怪的解决方法,而是让您使用整个像素来开始使用。
为什么使用此软件渲染器?
- 最小的系统依赖项将与特定系统API相关的所有内容都放置在单独的包装器模块中,该模块集成了最小的基本功能,这些功能应易于集成到未来的操作系统上。与其他软件渲染器不同,该渲染器不需要任何图形驱动程序,因为当大多数核心无论如何都闲置时,您可以通过将画布上传到背景线程上,从而获得相同的性能。
- 没有二进制文件整个库是从源代码自动编译的。甚至构建系统都在构建项目之前都在自行编译。这可以确保未来没有人在试图构建程序时必须逆转工程师世纪的二进制文件,并且在所有可读代码都可以检查所有内容时,它也使对恶意软件变得更加安全。
- 静态链接整个库与您的程序静态链接,就像您自己编写了代码一样。仅存活数十年的核心系统API被依靠为依赖性,没有GPU驱动程序,没有外部媒体层。从如何编码Unicode字符和渲染字体到对深度缓冲区的多边形如何栅格化的所有内容都将在您编译的C ++程序中存在,以获得最大的可靠性和确定性。构建系统允许在可能的情况下静态地链接C ++标准库。
- 创建您的遗产制造软件,使后代可以在不需要模拟器或专有图形驱动程序的反向工程的情况下进行端口,编译和运行。
该库中的功能
- 全自动C ++构建系统不再需要项目中的源文件列表。随附的构建系统将自动找到包含的标题及其按名称对应的源文件。只需告诉它从Main爬网,然后自动找出其余部分即可。通过包括图书馆的项目标头来处理库的不同后端,并告诉每个平台使用哪个后端。校验和仅用于构建已更改的内容,因此无需为代码的一部分创建静态库。
- 2D绘图像素精确的标准绘图呼叫线,矩形,实心图像副本,alpha滤波的图像绘图,深度缓冲绘图和模板图。
- 3D渲染大致相当于Direct3d 7,使用BI线纹理采样,MIPMAPPING,LIGHTMAPS和ALPHA过滤时,如果您可以使用盒子,但是如果您将阴影涂在纹理上,则可以更类似于直接3d 9(可以将SIMD应用于具有多线程的SIMD,并基于观看距离进行安排)。
- 遮挡系统多线程的渲染任务收集还包含一个遮挡网格,如果您的引擎实现了用于剔除和闭合测试的宽相似,则可以绘制遮挡形状以跳过三角形,对象或整个组的绘图。然后,可以使用有关从每个相机位置可以看到哪些区域的信息,将这种完全动态的阻塞与特定游戏的静态优化结合使用。
- 可选的远剪辑,因为此图形API仅使用浮点深度缓冲区进行透视图,因此无需将任何基于整数表示的深度值正常化。如果您能够一次负担得起整个场景,则可以在创建相机时选择无限的远夹距离。
- 媒体层跨平台介质层设计用于鲁棒性。 ALSA和Winmm声音后端可以完全控制声音混合,而不必将任何特定于系统的系统调用。窗口管理使用多线程来上传画布,因此您不需要GPU图形驱动程序和重型依赖项就可以上传结果。使用无边界窗口进行全屏,因此,如果您在后台收到重要的电子邮件或即时消息,则可以轻松访问其他程序。在CPU上进行了升级,以便与任何屏幕分辨率一起使用,而无需依赖可能使像素插值错误或不存在的图形驱动程序。当没有安装图形驱动程序并且显示器不接受任意选择分辨率时,为CTR显示的较旧媒体图层可能会导致频率超出范围错误。使用隐形光标图标隐藏鼠标,因此在试图杀死该过程时,崩溃的程序不会带走光标。
- 图形用户界面框架使用一行读取布局文件或字符串的代码行加载视觉界面到窗口。使用名称或名称和索引的组合获取构件的通用处理。通过将lambda功能附加到组件和窗口回调来添加事件。
- 计时器获得以来第一次呼叫计时器以来的双重精度秒,因此您不必担心一天中的午夜错误。
- SIMD抽象层使用SIMD.H自动从完全可读的数学语法中生成高效的SSE,AVX和霓虹灯。您的向量代码看起来像是一个未知目标体系结构的参考实现和编译,将产生标量操作,可以通过编写算法来提供性能提升,这些操作与基本操作中最常在CPU硬件中直接支持的基本操作,从而访问与高速缓存线相处的记忆,并与任务相似,并使其与Autive autive autive autiands相似,并使其与此相似,并使其具有相似的范围,并与之相似。
- 安全的指针使用SafePointer.h来通过告诉指针可能会使用哪个部分来捕获更多错误。发行版中没有丢下开销,这样您就可以随时用SafePointer替换原始指针,并知道当发生不好的事情时,您将获得带有指针名称和详细信息的信息性错误消息。
- 字符串使用UTF-32将字符存储在内存中,以确保所有算法都与非拉丁蛋白字符(与u“”字符串文字兼容)。保存在用BOM(明确说出使用哪种格式的)和CR LF线结尾(以便在任何地方都可以读取任何地方的文本文件)的BOM(明确说出使用哪种格式)默认为UTF-8(紧凑型存储)。自动使用共享存储器缓冲区,以允许将其分成字符串列表,而不会淹没小型分组。
- 缓冲区所有文件均通过缓冲对象保存和加载。这样可以确保您设计的所有文件格式只需要担心如何编码字节,而不涉及文件系统的外部副作用,回归测试将很容易,并且可以使用相当于保存功能的缓冲区来将任何文件捆绑到您的自己中。
- 文件管理大致相当于C ++ 17的STD ::文件系统,但可与C ++ 14一起使用,在所有平台上使用相同的字符串和可REDABLESTRING类型,并且可以在 /(POSIX)和(MS-Windows)之间自动更正文件夹分离器。
- 流程管理可以启动其他应用程序并跟踪其状态,以便您可以像将结果写入文件一样调用应用程序。
许可摘要
该库主要使用ZLIB开源许可证,但还包括用于保存和加载图像的STB映像库,该图像具有允许的双重许可证(MIT /不执行)。由于STB映像库可以用作公共领域,因此它对在ZLIB开放源代码许可下整体使用库没有任何法律效果。所有均包含及其许可证的源代码允许商业和非商业用途,包括未公开的源代码修改。如果您不重新分发源代码,则不必告诉任何人使用此库,因为Insincere认可没有价值。
仍然是公共Beta
主题,GUI,字体和声音API仍在积极开发中,并且在准备就绪的1.0版之前可能会发生重大变化,因为某些代码只是一个原始的占位符,直到高级实施可以替换它,并且必须在明显的可用性问题变得明显之前尝试实际使用库。但是,缓冲区,文件,图像,绘制,过滤,字符串和时间API已经很稳定。您可以选择使用每个新项目的特定版本,继续进行最新更改,或等待稳定版本1.0。
您如何提供帮助
- 使用相同的最小依赖性原则到Macintosh或Wayland的端口。
- 测试此Beta版本,并在发布1.0版之前对设计进行反馈。
- 使用开源工具创建不同类型的游戏引擎。
支持的CPU硬件:
- Intel/AMD使用SSE2内在和可选扩展。
- 使用霓虹灯内在的手臂。
- 未知的CPU体系结构,没有SIMD矢量化作为后备解决方案。
平台:
- Linux ,在薄荷,伴侣,Manjaro,Ubuntu,Raspberrypi OS,Raspbian(Buster或更高版本)上进行了测试。 Linux Mint需要编译器和X11标头,因此在编译之前运行“ sudo apt install g ++”和“ sudo apt install libx11-dev”。目前计划为将来的版本提供支持X11和Wayland。
- Microsoft Windows ,但比Linux上的慢,因为Windows具有许多背景过程以及较慢的线程和内存管理。
也可能正在努力:
- BSD和Solaris的代码针对fileapi.cpp中的平台以获取应用程序文件夹,但是运行构建脚本可能缺少一些应用程序。如果有X11服务器,未来的POSIX系统只能有几个怪癖。
- 如果在全球范围内启用DSR_BIG_ENDIAN宏观,那么从理论上讲,Big-Endian得到了支持,但是由于与现代编译器瞄准这样的旧系统的困难,这实际上从未进行过测试。
尚未移植到:
- Macintosh不再使用X11,因此需要进行一些移植工作。 Macintosh没有指向运行过程二进制的符号链接,因此在询问应用程序文件夹时,它会落在当前目录上。
不会针对:
- 手机。因为不断变化的移动平台上的向后兼容性破坏了使用长期寿命框架的目的。移动平台需要自定义的C ++编译器,访问信号处理器,屏幕旋转,节省电池,知道何时显示虚拟键盘,安全许可,强迫全屏...试图同时做到这两种工作,最终都会出现两个目的的折衷,例如Microsoft Windows 8或Ubuntu的Unity Lock屏幕,因此可以将其构建为新的,因此可以将其构建为新的库。
- 网络前端。此库上的包装器将无法获得SIMD Intrinsics来定义您自己的图像过滤器的力量,因此您最好从浏览器中定位GPU阴影语言,这更适合动态脚本。