PA2D 图形库

CPU渲染管线优化的轻量级C++图形库,便捷高效图形化应用程序开发的解决方案。

更新:2025.12.20 | 作者: thss192

下载 PA2D v1.0.0-beta1

快速入门

图形化编程可以带来更直观的编程体验,你可以在绚丽多彩的窗口中练习与实践

PA2D 提供了直观易用的 现代C++ API, 无论是初学者还是有经验的开发者,都能快速上手并构建出色的图形应用。

C语言学习者可以在C++环境中从C语法基础开始,无缝使用PA2D的现代功能。

当你准备好时,库的面向对象设计会引导你学习现代编程

适用于

C++入门实践

为希望从编程入门过渡到项目实践的开发者提供平滑的学习曲线。

创意软件开发

构建绘画工具、动画编辑器、数据可视化等创意应用的理想选择。

轻量级游戏开发

适合2D游戏、原型开发、教育游戏等不需要重型游戏引擎的项目。

图形编程学习

帮助理解2D图形渲染的核心原理和现代编程实践。

安装教程:

PA2D提供了十分友好的开发体验,按照安装程序提示完成安装,即可在Visual Studio 中使用。

下载 v1.0.0-beta1 版本

安装程序自动配置以下三个文件:

📁 项目文件 说明
pa2d.h 主头文件
pa2d.lib 发布时库
pa2dd.lib 调试时库

快速开始

Step 1 : 创建Window窗口

创建Window窗口
#include <pa2d.h>
using namespace pa2d;
int main() {
	// 创建一个 640*480 的窗口
	Window window(640, 480, "My first PA2D Window");
	// 显示这个窗口
	window.show();
	// 等待窗口关闭
	window.waitForClose();
    return 0;
}
第一个窗口示例图
第一个窗口示例图 - PA2D图形库

事实上,初次创建窗口并不会立即显示,因为窗口初始化并不代表着显示窗口

我提供了 waitForClose() 堵塞线程,以便展示窗口

Step 2 : 在Canvas上绘制图形

绘制一个圆
#include <pa2d.h>
using namespace pa2d;
int main() {
	Window window(640, 480, "My first PA2D Window");
	window.show();
	// 1. 创建一个画布
	Canvas canvas(640, 480);
	// 2. 在画布上画一个圆
	canvas.circle(100, 100, 60, Green_fill + Red_stroke);
	// 3. 让窗口去渲染画布
	window.render(canvas);
	window.waitForClose();
    return 0;
}
绘制一个圆示例图
绘制一个圆示例图 - PA2D图形库

Step 3 : 了解PA2D的语法

PA2D 采用了一些现代C++的语法特性,让代码更简洁直观
如果你第一次见到这些"黑魔法",不用担心,它们其实很简单!

🔤 字面量样式
  // 传统方式
  Style style{};
  style.fill_ = 0xFF00FF00;    // 不透明绿色(填充)
  style.stroke_ = 0xFFFF0000;  // 不透明红色(线框)
  style.width_ = 3;            // 3像素线宽
  // PA2D的字面量语法(一行解决!)
  Style style = 0xFF00FF00_fill + 0xFFFF0000_stroke + 3_w;
  // 使用样式绘制圆形
  canvas.circle(100, 100, 60, style);

原理:通过后缀 _fill、_w 等将数字直接转换为对象。

PA2D 利用 C++ 的用户自定义字面量特性,实现了简洁的样式定义语法。
PA2D 的颜色定义: 0xAARRGGBB

🔗 链式调用
#include <pa2d.h>
using namespace pa2d;
int main() {
	Canvas canvas(640, 480);
	// 半透明蓝色填充 + 3像素线宽
	Style style = 0x800000FF_fill + 3_w;
	// 传统方式(需要重复对象名)
	canvas.circle(100, 100, 60, Green_stroke + style);
	canvas.rect(100, 100, 120, 80, 0x80FF0000_stroke + 25.0_r + style);
	canvas.text(160, 20, "你好, PA2D!", 60, Green);
	// 链式调用(更流畅!)
	canvas.circle(100, 100, 60, Green_stroke + style)
		.rect(100, 100, 120, 80, 0x80FF0000_stroke + 25.0_r + style)
		.text(160, 20, "你好, PA2D!", 60, Green);
	// 3. 让窗口去渲染画布
	Window(640, 480, "My first PA2D Window")
		.show()
		.render(canvas)
		.waitForClose();
	return 0;
}
链式调用示例图
链式调用示例图 - PA2D图形库

链式调用:每个方法都返回对象自身的引用,可以连续调用。

💡 为什么这样设计?

代码更简洁:减少重复
可读性更高:操作顺序一目了然
符合直觉:像自然语言一样表达

这些语法都是可选的,你也可以使用传统写法。
但一旦习惯,你会发现它们让图形编程变得更加愉快!

PA2D的不同之处

效率优化

PA2D 内部做了许多AVX2优化, 相较标量版本, 可提升近16倍的运行效率, 利用其离屏渲染画布预处理等框架, 仍可进一步优化。

核心理念

  • 🎯 PrismArch
    - 注重接口与整体架构的设计理念
  • Pixel Accelerated
    - CPU端对像素位图进行操作
  • 🏗️ Procedural Algorithm
    - 全过程透明,鼓励用户自己做分支和实验

多种 API 层级

pa2d 提供从底层到高层的完整抽象体系,让开发者根据需求选择合适的编程层级:

底层操作

直接操作位图(Buffer) - 适合自己实现图形算法高效绘图

函数层级

使用画布及其方法(Canvas) - 适合快速开发

面向对象

几何对象及其样式(Shape+Style) - 提供几何变换接口

灵活性:根据需求选择合适抽象层级
可扩展性:易于添加新的几何类型和绘制样式
智能决策:根据需求选择最优绘制方式

显式渲染流程

在PA2D中, 用户控制完全的渲染管道:

显式的渲染管道
// 显式的图像存储单位(颜色数组)
Canvas canvas(400, 300); 
// 显式的图像信息处理(在Canvas上绘制红色圆形)
canvas.circle(50, 50, 30, Red);
// 主动选择窗口显示的时机
window.show(); 
// 主动控制渲染过程
window.render(canvas);
  • 🚀 快速上手,但无黑盒
    - 初学者透彻理解图形编程的每一步
  • 🎓 理解局限性,而非止步不前
    - 逐步引入更现代的解决方案
  • 🔧 深入原理,尝试优化
    - 引导开发者深入理解图形编程的底层机制

更多的功能

快速浏览功能模块
// ==================== 1. 核心模块 ====================
Color halfAlphaRed(128, 255, 0, 0);   // 半透明红色
Buffer buffer(800, 600, White);       // 创建白色背景的缓冲区
Color pixel = buffer.at(100, 100);    // 访问像素数据
Point point(100.5f, 200.3f);          // 几何基础 - 点、向量
// ==================== 2. 几何模块 ====================
// 样式配置 - 流畅式 API
Style style = Red_fill + Black_stroke + 3_w + 10_r;
// Shape 对象 - 面向对象的图形表示
Circle circle(400, 300, 100);       // 圆心(400,300),半径100
circle.translate(50, 0)             // 向右移动50像素
     .scale(1.5f);                  // 放大1.5倍
Polygon polygon = Path::from(0, 0)  // 路径构建器 - 构建闭合多边形
    .moveTo(100, 0)
    .moveTo(100, 100)
    .moveTo(0, 100);  
// ==================== 3. 画布模块 ====================       
Canvas canvas(800, 600);            // 创建画布(代理Buffer)
canvas.draw(circle, style);         // 绘制圆形
     .line(0, 0, 100, 100, style)   // 绘制直线
	 .text(100, 100, "Hello PA2D", 20, Blue)          // 文本渲染
	 .textCentered(400, 300, "居中文本", 24, Black,    // 居中显示
	    FontStyle::Bold | FontStyle::Italic, "Arial") // 字体样式
Canvas image("image.png", 400, 300);         // 图像加载
canvas.alphaBlend(image, 0, 0, 128);         // 半透明混合
canvas.overlayBlend(image);                  // 叠加混合
canvas.drawRotated(image, 400, 300, 30.0f);  // 变换绘制
Canvas rotated = canvas.rotated(45.0f);      // 变换副本
// ==================== 4. 窗口模块 ====================
Window window(800, 600, "PA2D Demo");   // 创建窗口
window.show();                          // 显示窗口
     .setAlwaysOnTop(true);             // 置顶
     .maximize();                       // 最大化
     .onKey([](KeyEvent e) {
        if (e.keyCode == 'A' && e.pressed){/*处理A键按下*/}
    })
     .onMouse([](MouseEvent e) {
        if (e.button == 0 && e.pressed){/*左键点击在(e.x, e.y)*/}
    });
     .render(canvas)                    // 渲染接口

由于PA2D的工作量实在太大,我目前还未做退回版本
当前版本能够支持2013+年代的电脑,可以覆盖大多数环境下的创作
对于硬件不支持的电脑,我也做了友好提示(以下为pa2d.h中的代码)

自动检测AVX2支持
// ==================== CPU REQUIREMENT ====================
// AVX2 hardware requirement check - executes at program startup
// If CPU lacks AVX2 support, displays error message and terminates
static const struct AVX2_Verifier {
    AVX2_Verifier();
}AVX2_CHECK_INSTANCE;
  • 💾 安装PA2D
    - 开始在实际项目中使用 PA2D
  • 🔍 查看程序示例
    - 在"程序示例"分类中查看完整的代码示例
  • 📖 浏览 API 文档
    - 查看其他分类以了解完整的 API 功能
  • 👥 参与社区
    - 加入开发者社区,分享经验和获取帮助
PA2D - 让图形编程更简单! ✨