
书: https://pan.baidu.com/s/15VfTw9eJ2MoiHktwswP0gw?pwd=tq5x
笔记如下:
一、游戏循环设计
- “游戏主循环的黄金结构:事件处理→逻辑更新→画面渲染,帧率控制用
SDL_Delay
或chrono
计时。” - “固定时间步长(Fixed Timestep)避免物理模拟因帧率波动失真,如
while(accumulator >= dt)
。”
二、图形渲染
- “SDL2的硬件加速渲染:
SDL_RenderCopy
比直接操作像素快100倍,适合2D精灵动画。” - “OpenGL立即模式(旧版)适合初学者:
glBegin(GL_QUADS)
→glVertex2f
,但现代核心模式需VAO/VBO。”
三、输入处理
- “键盘连续输入检测:
SDL_GetKeyboardState
返回状态数组,避免按键消息的延迟感。” - “鼠标相对坐标转换:
SDL_GetMouseState
需结合视口矩阵映射到游戏世界坐标。”
四、物理与碰撞
- “AABB(轴对齐包围盒)碰撞检测:
if (rect1.x < rect2.x + w2 && ...)
,性能与精度平衡。” - “简易物理模拟:
速度 += 加速度 * dt
,位置 += 速度 * dt
,欧拉积分足够用于小游戏。”
五、资源管理
- “纹理加载优化:
SDL_Texture
复用比反复创建SDL_Surface
更高效,内存占用更低。” - “音效池技术:预加载多个
Mix_Chunk
实例,避免播放时动态加载卡顿。”
六、状态管理
- “有限状态机(FSM)实现游戏状态:
enum GameState { MENU, PLAY, PAUSE }
+switch
控制逻辑分支。” - “对象池(Object Pool)管理子弹/敌人:预分配对象数组,避免运行时
new/delete
开销。”
七、C++特性应用
- “RAII管理SDL资源:封装
SDL_Texture*
到类,析构函数自动调用SDL_DestroyTexture
。” - “
std::vector
存储游戏实体:for(auto& entity : entities)
更新,注意迭代器失效问题。”
八、调试技巧
- “帧率显示:
1000.0f / (SDL_GetTicks() - last_time)
,调试性能瓶颈的第一步。” - “碰撞检测可视化:临时绘制碰撞盒边框,
SDL_SetRenderDrawColor(255,0,0,255)
。”
九、跨平台注意
- “路径分隔符:Windows用
\\
,Linux/Mac用/
,建议统一用/
或SDL_GetPrefPath
获取用户目录。”
十、项目进阶
- “ECS架构雏形:
Component
(数据) +System
(逻辑)分离,适合复杂游戏扩展。” - “存档系统设计:二进制格式(
fwrite
)快速,JSON(nlohmann/json
)可读性强。” - “从‘玩具代码’到工程化:将游戏拆分为
Game
、Renderer
、ResourceManager
等模块。”