- 博客(1385)
- 收藏
- 关注
原创 CppCon 2025 学习:Reflection C++‘s Decade-Defining Rocket Engine
程序能“看见”自己这并不是指运行时反射(reflection),而是:程序可以生成程序因此,这类程序叫做元程序你这句话非常关键运行时发生了什么?什么都没发生示例 2:等价于:https://godbolt.org/z/bK1ajavfE程序整体在“做什么”?1⃣ 编译期发生的事情(最关键)在编译阶段:→ 编译器展开两次循环,相当于生成:没有运行期反射没有字符串解析没有 RTTI运行期只是简单执行:这段代码的“技术意义”✓ 真正的 零成本反射(zero-cost re
2026-02-01 12:48:04
257
原创 CppCon 2025 学习:AI Agents Unbound: Scaling up Code Quality, Reliability, Product Iteration(续)
fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;'Tag': ...UI流程图描述了的数据流和处理步骤,从代码变更到最终用户界面展示。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;
2026-01-31 19:47:38
448
原创 CppCon 2025 学习:AI Agents Unbound: Scaling up Code Quality, Reliability, Product Iteration
Refactoring at Scale: LLM‑Powered Pipelines for Detecting Code Smells, Hardening Tests, and Modernizing Legacy C++理解:这一侧描述了传统的开发模式:这一侧描述了使用 ChatGPT 等工具后的现状,也是该梗(Meme)的讽刺点:这张图精准地抓住了当前开发者使用 AI 工具时的几个痛点:这张图从工程架构的角度对比了不同人群对 AI 的预期与现实。这两张图共同揭示了目前 AI 编程的几个真相:Ch
2026-01-31 19:46:42
501
原创 CppCon 2025 学习:Pragmatic CMake
这是一个**从“空机器”到“可交付产物”**的标准流程。读取 查找依赖(find_package)生成构建系统(Makefile / Ninja / VS solution)3⃣ Build / Compile(构建)编译 链接可执行文件 / 库4⃣ Test(测试)单元测试(gtest / catch2 / doctest)CI 自动化验证5⃣ Install / Package(安装 / 打包)安装到系统生成 / / 二、什么是 Provisionin
2026-01-31 14:16:53
557
原创 CppCon 2025 学习:Practical Reflection
使用指针 + 枚举 + 预分配 + SoA是大型对象池/游戏实体列表常用的优化方案如果你的Animation数据很大,共享指针而非拷贝可以节省几十 MB 内存枚举 + 紧凑布局使 CPU cache 利用率更高对 10,000 个对象的循环构建:最慢的操作通常是内存分配/扩容CPU 对循环计算的开销几乎可以忽略AoS每个对象连续存储遍历对象快单字段访问可能浪费缓存SoA每个字段连续存储访问单字段快,支持 SIMDpush_back 操作复杂。
2026-01-30 18:46:16
778
原创 CppCon 2025 学习:Performance of stdexpected with Monadic Operations
错误处理是指:你列出的四类非常经典:函数通过返回值表示成功或失败特点✓ 简单✗ 容易被忽略✗ 错误信息表达能力弱把函数当成映射:f:X→Y∪Ef : X \to Y \cup Ef:X→Y∪E但错误被“塞进”YYY 里,语义混乱。把错误信息通过额外参数返回:特点✓ 不污染返回值✗ 接口复杂✗ 可读性下降调用者必须记得:3⃣ 异常(Exceptions)是什么?当错误发生时,立即中断当前执行路径,并向上“抛出”错误:调用者:三、异常(Exceptions)——What & W
2026-01-30 17:23:12
708
原创 CppCon 2025 学习:Performance Is Not a Number Avoiding Microbenchmarking Pitfalls(续)
1⃣ Bar Plot(柱状图)理解作用:比较不同类别(benchmarks)之间的性能指标度量:通常使用平均延迟(ns/op)或总耗时适用场景:直观展示哪种算法/函数更快(lower is better)比较不同输入分布或不同配置的性能数学表示:假设有 kkk 个 benchmark,每个 benchmark 的平均延迟为 tˉi\bar{t}_itˉi:Bar height for category i=tˉ∗i=∑∗j=1niti,jni\text{Bar height f
2026-01-30 13:34:27
1003
原创 CppCon 2025 学习:Performance Is Not a Number Avoiding Microbenchmarking Pitfalls
一、Frequency(频率)——已经接近物理极限1⃣ 频率区间的现实情况这不是“Intel 不努力”,而是物理约束。CPU 频率 fff 本质上受三个因素限制:f≤1tlogic+twire+tclockf \le \frac{1}{t_{logic} + t_{wire} + t_{clock}}f≤tlogic+twire+tclock1其中:Boost(睿频)成立的前提是:既然频率上不去,性能只能从这里来:Moore 定律的今天版本已经不是:最直观的用途:吞吐能力(Thro
2026-01-30 13:33:42
724
原创 CppCon 2025 学习:Parallel Range Algorithms The Evolution of Parallelism in C++
【evolution】 n. 进化, 发展, 进展, (气体)放出, 开方 [医] 进化, 演化, 旋出 名词复数形式C++17 引入了并行算法:特点:特点:二、Parallel Range Algorithms 是什么?核心定义Parallel Range Algorithms 是:三、对比:串行 vs 并行(Ranges 版本)1⃣ 串行 Range 算法语义:语义:五、Execution Policy 在 Ranges 中的设计意义1⃣ Execution Policy 变成“
2026-01-25 17:48:03
613
原创 CppCon 2025 学习:MSVC C++ Dynamic Debugging How We Enabled Full Debuggability of Optimized Code
C++ Dynamic Debugging 可以让你在 优化(Release /O2)代码中调试,就像调试 未优化(Debug /Od)代码 一样。在 Release 下,编译器优化会带来以下问题:高性能执行Debug breakpoint or step-in→Load deoptimized binary调试优化前代码\text{Debug breakpoint or step-in} \xrightarrow{\text{Load deoptimized binary}} \text{调试优化前
2026-01-25 14:39:44
540
原创 CppCon 2025 学习:More Speed & Simplicity Practical Data-Oriented Design in C++
Entity Emitter Rocket Particle SmokeEmitter FireEmitter SmokeParticle FireParticle Entity(实体)数据导向设计中的核心概念,代表游戏或系统中的对象。不包含逻
2026-01-24 18:47:39
565
原创 CppCon 2025 学习:Modern C++ for Robust Bundle Adjustment From Outliers to Optimization(续)
理解:HybridPipeline 是一个策略模式 + 模板工厂,通过模板参数组合不同策略实现 BA 流水线。Pipeline 的作用:生成分块窗口 (windowing)空间滤波 (SpatialFilter)异常值剔除 (OutlierRejection)窗口优化 (Optimization)数学公式:世界坐标到相机坐标:Pc=R(Pw−t)P_c = R (P_w - t)Pc=R(Pw−t)投影到像素平面:u=fxXcZc+cx,v=fyYcZc+cyu =
2026-01-24 13:13:31
582
原创 CppCon 2025 学习:Modern C++ for Robust Bundle Adjustment From Outliers to Optimization
问题描述:对每种传感器/格式实现派生类避免硬编码格式,使新数据集可以轻松接入目标:支持 RGB、深度、LiDAR、IMU 等多种输入保证接口一致性,方便后续算法调用2⃣ Flexible Filtering(灵活的滤波/鲁棒处理)要求:提供可插拔的滤波方法,如:RANSAC外点剔除(Outlier Rejection)设计思路:使用 策略模式(Strategy Pattern) 或 函数对象/Lambda 支持算法插拔数学公式:以 RANSAC
2026-01-24 13:12:34
538
原创 CppCon 2025 学习:Modern C++ for Embedded Systems From Fundamentals to Real-Time Solutions
注释总结构造函数(Constructor): 默认构造函数把点放在原点 。 可以用指定的坐标初始化点。使用 初始化列表()提高效率。成员变量(Member variables): 和 表示点的坐标。用 注释标明每个成员的意义。成员函数(Member function): 计算点到原点的欧几里得距离。用 修饰,表示函数不会修改类成员。使用数学公式:distance=x2+y2\text{distance} = \sqrt{x^2 + y^2}distance=x2
2026-01-23 18:59:34
662
原创 CppCon 2025 学习:Mastering the Code Review Process
Critique 是“为了变得更好而进行的理性评价”,而不是“为了否定而进行的指责”。类型是否推荐核心特征✓ 强烈推荐指问题 + 给方案✓ 推荐教知识、扩视野✗ 不推荐否定、无帮助代码评审不是找茬,而是让代码、团队和系统一起变得更好。代码评审不是执行某一条规则,而是在多条冲突原则之间做出专业判断。糟糕的代码评审不会“节省时间”,它只是把问题留给未来,并放大代价。代码评审不是“让别人帮你找错”,而是“在你已尽力做到最好之后,请他人提供第二双眼睛”。
2026-01-23 12:31:55
629
原创 CppCon 2025 学习:LLMs in the Trenches Boosting System Programming with Al
这是一个 离网(Off-grid)无线中继与定位追踪设备,主要应用场景包括:因此系统必须:用途:用途:功能:若模块只工作 1010%10 时间:Pavg=0.1⋅Pon+0.9⋅PsleepP_{\text{avg}} = 0.1 \cdot P_{\text{on}} + 0.9 \cdot P_{\text{sleep}}Pavg=0.1⋅Pon+0.9⋅Psleep这是 0.3 W 可实现的根本原因 CR1025 ESP32-WROOM-32E
2026-01-22 20:29:30
562
原创 CppCon 2025 学习:Knockin‘ on Header‘s Door An Overview of C++ Modules
先回顾 C++ 的编程习惯。编译流程:在单文件程序中,一切都在同一个源文件里,所以编译器在处理 的调用时直接能看到其定义。假设我们把 放到一个单独的文件 :问题:原因: 里定义 :3⃣ 编译流程(多文件)每个源文件独立编译为目标文件(.o)链接器(Linker)把所有目标文件组合生成最终可执行文件每个 名字 必须在使用它的 TU(单元)中声明定义(definition)必须只有一个,否则会报链接错误4⃣ 链接错误示例如果 修改了函数签名:会出现链接错误:原因:创
2026-01-21 20:00:41
583
原创 CppCon 2025 学习:Instrumenting the Stack Strategies for End-to-end Sanitizer Adoption
CMake RE = 不改工程结构的“分布式 Bazel 能力”不要问“要不要安全”,要问“在哪个阶段用哪种安全”。int x;if (x > 0) { // ✗ 读取未初始化的 xx的值是不确定的可能来自:之前栈上的旧数据寄存器残留值这是未定义行为(Undefined Behavior)编译器可以:优化掉代码生成你完全想不到的结果MSan 是唯一能系统性发现“未初始化内存读取”的工具它用 shadow memory + 编译器插桩,把“不可见的不确定性”变成了。
2026-01-19 19:50:22
475
原创 CppCon 2025 学习:Inherently Unsafe Practical Approaches for Writing Safer C++
p = 43;程序做了不允许的事,后果我们不管。程序正常运行值没有被修改程序崩溃写入被忽略写到只读内存 →段错误编译器直接删除代码这段代码不是“改常量”你对编译器撒了谎,而编译器选择相信你自己说过的话\textbf{你对编译器撒了谎,而编译器选择相信你自己说过的话}你对编译器撒了谎,而编译器选择相信你自己说过的话一直拷贝,直到遇到'\0'为止buffer| buffer || 其它局部变量 || 保存的寄存器 || 返回地址 | ←strcpy覆盖其他局部变量。
2026-01-19 17:20:48
594
原创 CppCon 2025 学习:Implementing Your Own Atomics
如果有任务集合:T=t1,t2,…,tnT = {t_1, t_2, \dots, t_n}T=t1,t2,…,tn并发的含义是:关键理解 构造 → 启动新线程:阻塞当前线程等待目标线程完成不 → 程序 二、线程间通信(Inter-Thread Communication)1⃣ 为什么线程需要通信?线程通常:Producer→Shared State→Consumer\text{Producer} \rightarrow \text{Shared State}
2026-01-19 16:54:04
640
原创 CppCon 2025 学习:Implement Standard Library Design Decisions, Optimisations and Testing in Implement
C++ 语义层(AST):LLVM 结构类型:对齐 = 4sizeof = 8类型sizeofFoo8ErrCode412特性libstdc++libc++88128内存布局padding 多使用压缩返回值性能栈上赋值多单条指令完成初始化优势简单实现更紧凑,更高效,更缓存友好公式表示内存占用max1boolpadding12max1boolpadding12maxbool8maxbool8总结是 C++20 引入的关键特性。
2026-01-19 15:04:42
591
原创 CppCon 2025 学习:How to Tame Packs, std:tuple, and the Wily std:integer_sequence
功能C++17/20C++26遍历参数包只能用或递归模板直接遍历结构化绑定只能解构 tuple/array[...elem]直接生成 pack编译期循环复杂模板递归自然语法易用性较低高,可直接写print_all或map操作 packAI 工具推荐:大多数会推荐“冗长的 helper 函数版本”通用原则尽量远离的繁琐用法构建简单的迭代原语(iteration primitive)用于 tuple、array、参数包都很方便核心概念。
2026-01-18 17:59:24
576
原创 CppCon 2025 学习:Graphics Programming with SDL 3
SDL = 跨平台多媒体抽象层它解决的是:SDL 提供:主要方向:这正是:四、最终一句话总结(可作为结尾)一、程序员是如何支持多平台的?(整体思路)在没有跨平台库的前提下,程序员通常只有三条路:优点接口清晰易于测试符合面向对象设计缺点(在游戏/底层库中很致命)虚函数调用vtable 带来的间接跳转指令缓存不友好无法内联在性能敏感代码中,这常常被认为“太贵”三、方案二:每个平台一个工程思路优点每个平台代码“干净”不需要大量 缺点重复代码极多修
2026-01-18 17:08:23
593
原创 CppCon 2025 学习:From Theory to Practice A Student Journey Building a C++ Game Engine in Open-Source
理解:外部库添加示例链接库示例理解:理解:Conan 是一个 C/C++ 的包管理器(Package Manager),用于方便地管理第三方库和依赖。服务器端(Servers):理解:理解:理解:理解:示例 (1):示例 (2):理解:例如,如果你在 Engine3D / AtlasEngine 中使用向量计算:公式可以表示为:v⃗=p2⃗−p1⃗\vec{v} = \vec{p_2} - \vec{p_1}v=p2−p1d=∣v⃗∣d = |\vec{v}|
2026-01-18 10:32:18
672
原创 CppCon 2025 学习:From Pure ISO C++20 To Compute Shaders
我们考虑:对于屏幕上的 每一个像素(对应球体表面的一点):设:从表面点指向光源的向量为:T=L−S\mathbf{T} = \mathbf{L} - \mathbf{S}T=L−S在光照计算中,我们只关心:Ip=n⋅T^I_p = \mathbf{n} \cdot \hat{\mathbf{T}}Ip=n⋅T^其中:对于两个单位向量:a⋅b=cos(θ)\mathbf{a} \cdot \mathbf{b} = \cos(\theta)a⋅b=cos(θ)其中 θ\thetaθ 是它
2026-01-17 21:44:01
593
原创 CppCon 2025 学习:From Bayesian Inference to LLMs Modern C++ Optimizations for Reverse-Mode Automatic
这实际上是在正式定义自动微分(Automatic Differentiation, AD)。我们把一个复杂计算拆成一连串中间表达式:v0=y,v1=x,v2,v3,…,vK=zv_0 = y,\quad v_1 = x,\quad v_2,\quad v_3,\quad \dots,\quad v_K = zv0=y,v1=x,v2,v3,…,vK=z含义是:定义:vˉk=∂z∂vk\bar v_k = \frac{\partial z}{\partial v_k}vˉk=∂vk
2026-01-17 13:08:18
596
原创 CppCon 2025 学习:Enhancing Exception Handling and Debugging Using C++23
功能优势捕获堆栈提供异常发生的完整上下文信息拦截无需修改业务代码,自动收集信息存储上下文多线程安全,每线程独立结合捕获文件、行号、函数名结合捕获完整调用栈✓核心思想业务代码保持原样throw拦截,在异常抛出时收集上下文通过在 catch 或 terminate 中访问输出堆栈、源位置、时间戳、线程 ID 等信息自己实现用找到“真正的那个”在中间插入逻辑再调用原函数能力是否需要改代码捕获完整调用栈✗捕获 throw 时间✗捕获线程信息✗统一异常日志✗。
2026-01-17 11:53:19
601
原创 CppCon 2025 学习:Duck Typing,the Way C++ How Type Erasure Bends the Rules
Exchange Trading App MarketData Subscriber S&P 500 Trading Algo Trading App MarketData Subscriber Commodit
2026-01-16 17:26:37
499
原创 CppCon 2025 学习:Duck-Tape Chronicles Rust/C++ Interop
Rust ↔ C++ 互操作已经成为现实需求互操作远不止“glue code”,涉及编译、链接、ABI、生命周期、异常处理高保真互操作尚未完全实现混合代码库越来越普遍,必须应对 Rust 的极端能力与 C++ 的庞大遗留代码学会正确的 Rust ↔ C++ 互操作方法,是现代系统开发的必修课零性能损耗:避免额外拷贝或 marshaling自然接口:无样板、无注解、易用安全:类型安全、内存安全、生命周期安全广泛类型支持:基本类型、容器、结构体等兼容动态库 & ABI易于自动化。
2026-01-16 16:56:22
604
原创 CppCon 2025 学习:Debugging C++ Coroutines in GDB
C++ 协程调试难点状态机复杂性调试器需要追踪暂停点和 promise异步调用栈不连续GDB 支持改进基本调试功能可用局部变量、参数和 promise 可见悬挂协程和 async 调用仍然麻烦实际应用协程非常适合处理流式数据、异步事件和松耦合算法例如 Knuth 的字符串解码问题Input/Output 协程拆分In()负责生成解码字符Out()负责按规则格式输出协程优点无需显式管理缓冲区和循环字符逐个产生,按需消费 →惰性生成易处理复杂输出分组。
2026-01-16 16:16:44
635
原创 CppCon 2025 学习:CTRACK Lightweight C++ Performance Tracking for Bottleneck Discovery
一种低开销的统计型性能分析方法给每个函数打点精确计时而是:“隔一段时间,看程序在干嘛”采样式 Profiling 是“用统计学换性能开销”的艺术,是现代性能分析的核心手段。Profiling 用来“找哪里慢”,Benchmark 用来“验证怎么快”。Sample-based profiling 定位热点Instrumentation 深挖热点Micro-benchmark 验证优化因为它解决的不是“怎么测”,而是“怎么不测错编译器优化时间分辨率统计稳定性旧代码集成。
2026-01-16 13:22:38
621
原创 CppCon 2025 学习:Creating a Declarative UI Library in C++
wxWidgets 的 UI 本质不是“坐标”,而是“比例 + 规则”“我有什么”声明(创建)界面上会出现哪些控件它们放在哪谁大谁小窗口缩放时怎么变就像 HTML 里只写标签,不写 CSS。Declarative 让你“声明界面是什么”,Imperative 让你“指挥界面怎么排”带比例约束的线性布局求解器在这段代码中,你可以看到Declarative 编程声明控件,描述它们的属性,而不关心它们如何排列。布局的部分则是Imperative 编程,逐步安排控件的位置和大小。通过。
2026-01-15 23:36:19
440
原创 CppCon 2025 学习:C++ Performance Tips Cutting Down on Unnecessary Objects(续)
理解: 是一个简单类,包含一个 成员。提供 拷贝/移动构造与赋值,可以跟踪对象创建和销毁。使用 默认比较运算符,使得 可以按值排序。构造函数、拷贝/移动构造函数都会打印信息,用于观察对象创建和销毁过程。2⃣ 基本操作3⃣ 输出解释:创建 并插入 。:查找一个不存在的元素 10。临时构造 来进行比较。比较完成后临时对象销毁()。 与 :同样会临时构造 进行查找,然后销毁。最后容器中 被销毁。理解:普通 查找不同类型时,会创建 临时对象
2026-01-15 18:58:15
621
原创 CppCon 2025 学习:C++ Performance Tips Cutting Down on Unnecessary Objects
**Extra objects(多余对象)**指的是程序中存在,但 并非实现目标所必需 的对象。换句话说,这些对象的存在 不改变程序的最终行为,仅仅是占用额外资源(内存、构造/析构开销等)。注释解释定义了一个 对象,并初始化为 目的只是为了给 赋值并非打印字符串所必需,因为直接打印字面量即可也是一个 对象,用 初始化最终被 输出虽然被用来打印,但同样可以直接打印字面量替代最终行为输出 构造 和 并不是必须的3. 简化代码(消除多余对象)不
2026-01-15 18:57:04
580
原创 CppCon 2025 学习:C++ Parallel Programming Models
单核性能提升已经遇到瓶颈,现代 CPU 通过 多核 / 多线程 提升总体吞吐量。I/O 非常慢(磁盘、网络):3⃣ 响应性(Responsiveness)尤其在 UI / 服务端:二、为什么并行编程很难(Why is it hard?)1⃣ 非确定性执行(Non-determinism)并行程序的执行顺序是不可预测的:同一程序,多次运行结果可能不同两个线程同时访问同一内存,至少一个是写✗ 未定义行为(Undefined Behavior)多个锁互相等待:程序永远卡住好处✓ 用户:你列出的
2026-01-15 13:03:25
555
原创 CppCon 2025 学习:Constexpr STL Containers: Challenges and a Limitless Allocator Implementation
使用newdelete用于临时计算在同一次 constexpr 求值中完全释放Non-transient constexpr allocation(非瞬态 constexpr 分配)背景左侧:右侧:代码框代码内容箭头箭头
2026-01-14 18:49:00
699
原创 CppCon 2025 学习:Changing /std:c++14 to /std:c++20 How Hard Could It Be?
嵌套 lambda 捕获对象指针外层 lambda 捕获this指针内层 lambda 可以用初始化捕获避免直接[this]可能导致作用域混乱MSVC permissive 模式影响permissive 模式允许一些非标准行为关闭 permissive 模式(或 C++20 默认)更严格,保证标准一致性代码执行与 sizeof返回对象大小,包括成员变量和对齐填充示例中A有一个bool,通常填充到 8 字节(64 位系统)Takeaway尽量使用。
2026-01-14 13:12:55
637
原创 CppCon 2025 学习:Cache-Friendly C++
目标问题:如何实现一个 (集合)?集合的核心语义只有三点:数学表示:Tbulk(n)=∑i=1nO(logi)=O(nlogn)T_{\text{bulk}}(n) = \sum_{i=1}^{n} O(\log i) = O(n\log n)Tbulk(n)=i=1∑nO(logi)=O(nlogn)数学期望:E[Tlookup]=O(1)E[T_{\text{lookup}}] = O(1)E[Tlookup]=O(1)最坏情况(所有元素哈希冲突):T=O(n)T = O(
2026-01-14 11:21:28
654
原创 CppCon 2025 学习:Building Secure C++ Applications A Practical End-to-End Approach
这套方法论不是在追求:这是整个方法论的核心坐标系。越界访问是 C/C++ 最致命的漏洞来源之一:攻击后果内存破坏ROP / JOP信息泄露任意代码执行Edge 的目标2⃣ Lifetime(生命周期安全)问题本质对象已经“死了”,你还在用:常见形式Use-after-freeDangling pointerDouble freeCross-thread lifetime mismatchEdge 的目标3⃣ Initialization(初始化安全)问题本质未
2026-01-13 17:22:13
574
Real-Time C++, 2nd Edition.pdf
2018-06-17
OpenGL ES 3dot0 Cookbook
2018-06-17
OpenCV 3 Blueprints.pdf
2018-06-17
Data Structures & Algorithm Analysis in C++, 4th Edition.pdf
2018-06-17
Learning Boost C++ Libraries.pdf
2018-06-17
OpenCV Computer Vision with Python.pdf
2018-06-17
OpenGL 4 Shading Language Cookbook, Second Edition
2018-06-17
OpenGL Data Visualization Cookbook
2018-06-17
A Practical Introduction to Computer Vision with OpenCV.pdf
2018-06-17
Functional Programming with C++
2018-06-17
Procedural Content Generation for C++ Game Development.pdf
2018-06-17
OpenGL Programming Guide, 8th Edition
2018-06-17
Arduino Computer Vision Programming.pdf
2018-06-17
OpenCV Computer Vision Application Programming Cookbook Second Edition.pdf
2018-06-17
OpenCV 2 Computer Vision Application Programming Cookbook
2018-06-17
Learning Image Processing with OpenCV.pdf
2018-06-17
Practical Algorithms for 3D Computer Graphics, Second Edition.pdf
2018-06-17
Game Programming Using QT.pdf
2018-06-17
Multicore and GPU Programming An Integrated Approach.pdf
2019-03-21
OGLPG-9th-Edition.zip OpenGL编程指南代码(包括资源文件)
2019-10-23
OpenGL 4.5 Reference Pages API + GLSLangSpec.4.60 + glspec46.core
2019-10-22
OGRE 3D 1.7 Application Development Cookbook.pdf
2019-04-20
UNIX网络编程卷1:套接字联网API(第3版) (1).pdf
2019-04-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅