feat: add gen2D slide deck and register in index

This commit is contained in:
2026-05-30 11:11:50 +08:00
parent 83c54ba953
commit dea26b0d89
3 changed files with 314 additions and 1 deletions
+311
View File
@@ -0,0 +1,311 @@
---
theme: frankfurt
title: gen2D - AI 驱动的 2D 游戏素材生成
author: 栈无不胜
transition: slide-left
mdc: true
drawings:
persist: false
---
# gen2D
AI 驱动的 2D 游戏素材生成工具
<div class="text-xl mt-4 text-gray-400">
文本描述 + 风格参数 → 风格一致、管线友好的游戏素材
</div>
<div class="mt-8 text-lg">
<b>团队</b>:栈无不胜 &nbsp;|&nbsp;
<b>赛道</b>:七牛云 XEngineer 暑期实训营
</div>
---
# 痛点:2D 游戏素材制作
<div class="grid grid-cols-2 gap-8 mt-6">
<div>
### 🎨 美术成本高
- 像素画 / 手绘需专业美术人员
- 独立开发者难以负担外包费用
- 迭代周期长,试错成本高
</div>
<div>
### 🔧 管线适配难
- 生成素材尺寸 / 格式不统一
- 精灵表需手动拆分与对齐
- 风格一致性难以保证
</div>
</div>
<div class="mt-6 text-center text-gray-400">
<b>核心诉求</b>:低门槛、风格一致、管线友好
</div>
---
# gen2D 的解决方案
<div class="mt-4">
| 输入 | 处理 | 输出 |
|------|------|------|
| 文本描述 + 风格参数 | 多智能体协作管线 | Sprite、背景、UI 元素、动画帧 |
</div>
<v-clicks>
- **自然语言驱动** — 用文字描述你想要的素材,AI 自动生成
- **风格一致性** — 工程级风格预设,保证同一项目素材风格统一
- **管线友好** — 标准尺寸、格式适配 Unity / Godot 等主流引擎
- **质量可控** — 自动质检 + 重试机制,不合格素材自动优化
</v-clicks>
---
layout: section
---
# 产品演示
---
layout: default
---
# 核心生成管线
基于 Eino `compose.Graph` 的四阶段智能体协作管线
```mermaid {scale: 0.85}
graph LR
A[用户输入] --> B[PromptOptimizer<br/>提示词优化]
B --> C[AssetGenerator<br/>素材生成]
C --> D{QualitySupervisor<br/>质检}
D -->|通过| E[FormatAdapter<br/>格式适配]
D -->|不通过| B
E --> F[输出素材]
D -->|重试 ≥ 3| E
```
<v-clicks>
- **PromptOptimizer** — 合并工程风格 + 任务风格覆盖,生成三段式规范提示词
- **AssetGenerator** — 调用文生图 API 生成素材
- **QualitySupervisor** — 自动质检,不合格触发重优化(最多 3 次)
- **FormatAdapter** — 组装输出素材与元数据,降级兜底
</v-clicks>
---
layout: two-cols
---
# 风格系统
两层风格架构,保证一致性与灵活性
### 工程风格(Project Style)
- 工程级别的风格配置
- 保证同一工程下所有素材风格一致
### 任务风格覆盖(Task Override)
- 单次生成任务的风格差异
- 仅覆盖需要变化的键
<div class="mt-4 text-sm text-gray-400">
合并逻辑:finalStyle = merge(project, task)
</div>
::right::
<div class="pl-4">
### 预设风格键
| 分类 | 示例 |
|------|------|
| 美术风格 | pixel, cartoon, vector |
| 色调 | warm, cool, vibrant |
| 线条 | thin, medium, thick |
| 场景 | forest, dungeon, city |
| 光照 | bright, dramatic, neon |
| 情绪 | cheerful, dark, epic |
</div>
---
layout: section
---
# 技术架构
---
layout: two-cols
---
# 系统架构
<div class="text-sm">
```
┌─────────────────────────────┐
│ Frontend (React + Vite) │
│ 画廊 / 工作台 / 结果预览 │
└──────────────┬──────────────┘
│ HTTP / WS
┌──────────────▼──────────────┐
│ Backend (Go + Gin + Eino) │
│ ┌───────────────────────┐ │
│ │ Eino Graph Pipeline │ │
│ │ 4-Stage Agent Flow │ │
│ └───────────────────────┘ │
│ ┌────┐ ┌─────┐ ┌──────┐ │
│ │ DB │ │ Kodo│ │ LLM │ │
│ └────┘ └─────┘ └──────┘ │
└─────────────────────────────┘
```
</div>
::right::
<div class="pl-4 text-sm">
### 技术栈
| 层 | 技术 |
|----|------|
| 后端 | Go + Gin + Eino |
| ORM | GORM + SQLite |
| 认证 | JWT + bcrypt |
| 存储 | 七牛云 Kodo |
| 前端 | React + TypeScript |
| 状态 | Zustand |
| 构建 | Vite 6 |
| 部署 | Docker Compose |
</div>
---
# 核心亮点
<v-clicks>
- **多智能体协作管线** — Eino `compose.Graph` 编排四阶段智能体,支持质检重试与降级输出
- **提示词优化 Agent** — Eino Chain 驱动,支持任意 OpenAI 兼容 API,无 key 自动回退模板
- **实时进度推送** — WebSocket 推送管线各阶段状态、进度与质检重试信息
- **请求去重** — 相同 prompt + 参数的并发请求自动合并,返回已有 taskId
- **异步任务模型** — goroutine 并发控制,支持失败重试(最多 3 次)与降级输出
- **一键部署** — Docker Compose 双容器架构 + deploy.sh 脚本
</v-clicks>
---
layout: default
---
# 技术栈一览
<div class="grid grid-cols-3 gap-6 mt-4 text-sm">
<div>
### 后端
- Go 1.26 + Gin
- Eino 管线编排
- GORM + SQLite
- JWT 认证
- 七牛云 Kodo
</div>
<div>
### 前端
- React 18 + TS
- Vite 6
- Zustand 状态管理
- react-router v7
- CSS Modules 主题
</div>
<div>
### 基础设施
- Docker 多阶段构建
- nginx 反向代理
- Gitee CI/CD
- SQLite 嵌入式 DB
- 暗色主题支持
</div>
</div>
---
# 路线图
<div class="grid grid-cols-2 gap-8 mt-4">
<div>
### ✅ 已完成
- 提示词优化 Agent(Eino Chain)
- 多智能体生成管线(Eino Graph)
- 工程风格系统 + 任务级覆盖
- 用户认证(JWT + bcrypt)
- 异步任务 + 实时进度推送
- 素材帧预览、GIF 动画与导出
- 自定义标签系统
</div>
<div>
### 🔲 规划中
- WebSocket 实时进度推送
- 批量生成与队列调度
- 文生图多模型适配
- 素材版本管理与历史记录
- 分布式令牌桶限流
- 自定义协程池
- RabbitMQ 消息队列
</div>
</div>
---
layout: center
class: text-center
---
# 感谢聆听
<div class="text-xl mt-4 text-gray-400">
gen2D — 让 2D 游戏素材创作更简单
</div>
<div class="mt-8 text-lg">
🔗 <b>在线体验</b>:http://47.121.181.112:10000
</div>
<div class="mt-2 text-lg">
🎬 <b>B站视频</b>:https://www.bilibili.com/video/BV1jAGo6DEbC
</div>
<div class="mt-6 text-gray-400">
栈无不胜 · 七牛云 XEngineer 暑期实训营
</div>
+1 -1
View File
@@ -26,7 +26,7 @@
</div> </div>
</div> </div>
<script> <script>
const decks = ['resume']; const decks = ['resume', 'gen2D'];
const container = document.getElementById('decks'); const container = document.getElementById('decks');
if (decks.length === 0) { if (decks.length === 0) {
container.innerHTML = '<p class="empty">No slide decks yet.</p>'; container.innerHTML = '<p class="empty">No slide decks yet.</p>';
+2
View File
@@ -8,6 +8,8 @@
"dev:resume": "slidev decks/resume/slides.md", "dev:resume": "slidev decks/resume/slides.md",
"build": "sh scripts/build.sh", "build": "sh scripts/build.sh",
"build:resume": "slidev build decks/resume/slides.md --base /resume/ --out dist/resume", "build:resume": "slidev build decks/resume/slides.md --base /resume/ --out dist/resume",
"dev:gen2D": "slidev decks/gen2D/slides.md",
"build:gen2D": "slidev build decks/gen2D/slides.md --base /gen2D/ --out dist/gen2D",
"serve": "pnpm run build && pnpm exec serve dist -l 3030", "serve": "pnpm run build && pnpm exec serve dist -l 3030",
"export": "slidev export" "export": "slidev export"
}, },