Linux Mint运行游戏Cloudflare Workers

引言:理解Cloudflare Workers与游戏开发的结合
Cloudflare Workers 是一个基于 Service Worker 标准的无服务器计算平台,它允许开发者在 Cloudflare 的全球边缘网络上运行 JavaScript、WebAssembly (Wasm) 或 Rust 代码。对于游戏开发者而言,这意味着可以将游戏逻辑、后端服务甚至整个游戏服务器部署到距离玩家最近的边缘节点,从而实现极低的延迟和全球可扩展性。
在 Linux Mint 系统上运行 Cloudflare Workers 游戏,主要涉及两个层面:
开发与部署
:在 Linux Mint 上编写和部署 Workers 游戏代码。
运行与访问
:通过浏览器在 Linux Mint 上访问和玩部署在 Workers 上的游戏。
本文将详细介绍如何在 Linux Mint 环境下,从零开始开发、部署并运行一个基于 Cloudflare Workers 的简单网页游戏。
准备工作:Linux Mint 环境配置
在开始之前,请确保你的 Linux Mint 系统已经安装了必要的工具。我们将使用 Node.js 和 Wrangler(Cloudflare 的官方 CLI 工具)来开发和部署 Workers。
1. 安装 Node.js 和 npm
Cloudflare Workers 的开发环境依赖于 Node.js。建议安装最新的 LTS(长期支持)版本。
打开终端(Terminal),执行以下命令:
# 更新软件包列表
sudo apt update

# 安装 Node.js 和 npm (Node.js 包管理器)
# Linux Mint 的仓库中通常包含较新版本的 Node.js
sudo apt install nodejs npm

# 验证安装
node -v
npm -v
如果仓库中的版本过旧,你也可以使用 NodeSource 提供的安装脚本安装最新版本:
# 以 Node.js 18.x 为例
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash –
sudo apt-get install -y nodejs
2. 安装 Wrangler CLI
Wrangler 是 Cloudflare 提供的强大命令行工具,用于创建、开发、测试和部署 Workers。
# 全局安装 Wrangler
npm install -g wrangler

# 验证安装
wrangler –version
3. 登录 Cloudflare 账户
在部署 Workers 之前,你需要登录你的 Cloudflare 账户。
wrangler login
执行此命令后,终端会显示一个 URL,复制该 URL 并在浏览器中打开,授权 Wrangler 访问你的 Cloudflare 账户。授权成功后,终端会显示 “Successfully logged in.“。
开发第一个 Workers 游戏:HTML/JS 简单游戏
我们将创建一个非常简单的 “点击方块” 游戏。这个游戏将完全由一个 Worker 提供服务,Worker 会返回包含游戏逻辑的 HTML 和 JavaScript。
1. 创建 Worker 项目
在你的工作目录下,使用 Wrangler 创建一个新的 Worker 项目。
# 创建一个名为 “my-game-worker” 的项目
wrangler init my-game-worker
在交互过程中,Wrangler 会询问一些问题:
Would you like to use a template?
选择
none
(我们将手动编写)。
Would you like to use TypeScript?
选择
no
(为了简单,我们使用 JavaScript)。
Would you like to use git for version control?
根据个人喜好选择。
进入项目目录:
cd my-game-worker
2. 编写游戏代码
我们将修改
src/index.js
文件,使其返回一个包含游戏逻辑的 HTML 页面。
打开
src/index.js
,用以下代码替换原有内容:
// src/index.js

export default {
async fetch(request, env, ctx) {
// 检查请求路径,如果请求的是 /game.js,则返回游戏逻辑脚本
const url = new URL(request.url);
if (url.pathname === ‘/game.js’) {
return new Response(getGameScript(), {
headers: { ‘Content-Type’: ‘application/javascript’ },
});
}

// 默认返回游戏的 HTML 页面
return new Response(getGameHTML(), {
headers: { ‘Content-Type’: ‘text/html’ },
});
},
};

// 游戏的 HTML 结构
function getGameHTML() {
return `





Cloudflare Workers 点击方块游戏


点击方块!

在 10 秒内尽可能多地点击红色方块。

得分: 0
时间: 10s




`;
}

// 游戏的 JavaScript 逻辑
function getGameScript() {
return `
// 游戏状态
let score = 0;
let timeLeft = 10;
let isPlaying = false;
let timerInterval = null;

// DOM 元素
const target = document.getElementById(‘target’);
const scoreDisplay = document.getElementById(‘score’);
const timerDisplay = document.getElementById(‘timer’);
const startBtn = document.getElementById(‘start-btn’);

// 随机移动方块位置
function moveTarget() {
const container = document.getElementById(‘game-container’);
const containerRect = container.getBoundingClientRect();
const maxX = containerRect.width – 120; // 考虑方块宽度和 padding
const maxY = containerRect.height – 140; // 考虑方块高度和 padding

const randomX = Math.floor(Math.random() * maxX) + 10;
const randomY = Math.floor(Math.random() * maxY) + 60; // 避开标题

target.style.position = ‘absolute’;
target.style.left = randomX + ‘px’;
target.style.top = randomY + ‘px’;
}

// 点击方块事件
target.addEventListener(‘click’, () => {
if (!isPlaying) return;
score++;
scoreDisplay.textContent = ‘得分: ‘ + score;
moveTarget();
});

// 开始游戏
function startGame() {
if (isPlaying) return;

score = 0;
timeLeft = 10;
isPlaying = true;
scoreDisplay.textContent = ‘得分: 0’;
timerDisplay.textContent = ‘时间: 10s’;
startBtn.disabled = true;
startBtn.textContent = ‘游戏中…’;

// 初始移动一次
moveTarget();

// 启动倒计时
timerInterval = setInterval(() => {
timeLeft–;
timerDisplay.textContent = ‘时间: ‘ + timeLeft + ‘s’;

if (timeLeft <= 0) { endGame(); } }, 1000); } // 结束游戏 function endGame() { clearInterval(timerInterval); isPlaying = false; startBtn.disabled = false; startBtn.textContent = '再玩一次'; alert('游戏结束!你的得分是: ' + score); } // 绑定开始按钮事件 startBtn.addEventListener('click', startGame); `; } 3. 本地测试 在部署到 Cloudflare 之前,我们可以先在本地运行 Worker 进行测试。 # 在项目目录下运行 wrangler dev Wrangler 会启动一个本地服务器,通常在 http://localhost:8787 。在 Linux Mint 的浏览器中打开该地址,你就可以看到并游玩你的游戏了。确保游戏在本地运行正常。 4. 部署到 Cloudflare 本地测试无误后,就可以将游戏部署到 Cloudflare 的全球网络。 # 部署 Worker wrangler deploy 部署成功后,Wrangler 会显示你的 Worker 的访问 URL,例如 https://my-game-worker.your-subdomain.workers.dev 。复制这个 URL,你就可以在任何地方(包括你的 Linux Mint 电脑)通过浏览器访问并玩游戏了。 进阶:使用 Durable Objects 实现多人游戏状态 对于需要实时交互的多人游戏,Cloudflare Workers 提供了 Durable Objects 。Durable Objects 提供了全局唯一的、强一致性的状态存储,非常适合用作游戏房间或玩家会话的后端。 1. 启用 Durable Objects 首先,你需要一个 Cloudflare 的 Workers Paid 计划(每月有免费额度,超出部分计费)才能使用 Durable Objects。 然后,在项目根目录的 wrangler.toml 配置文件中添加 Durable Objects 的配置: # wrangler.toml name = "my-game-worker" main = "src/index.js" compatibility_date = "2023-10-27" # 添加 Durable Objects 配置 [[durable_objects.bindings]] name = "GAME_ROOM" class_name = "GameRoom" # 指定 Durable Object 类所在的文件 [[migrations]] tag = "v1" new_classes = ["GameRoom"] 2. 编写 Durable Object 代码 我们需要在 src/index.js 中定义 GameRoom 类。这个类将处理游戏的多人逻辑。 // src/index.js // 定义 Durable Object 类 export class GameRoom { constructor(state, env) { this.storage = state.storage; this.sessions = new Set(); // 存储连接的 WebSocket 会话 } // 处理 Fetch 请求 (用于 WebSocket 连接) async fetch(request) { const url = new URL(request.url); if (url.pathname === '/ws') { // 创建 WebSocket pair const pair = new WebSocketPair(); const [client, server] = Object.values(pair); // 处理 WebSocket 消息 this.handleWebSocket(server); // 返回 WebSocket 响应 return new Response(null, { status: 101, webSocket: client, }); } // 其他请求处理... return new Response("Not Found", { status: 404 }); } // WebSocket 处理逻辑 async handleWebSocket(ws) { // 接受连接 ws.accept(); // 添加到会话集合 this.sessions.add(ws); // 当收到客户端消息时 ws.addEventListener('message', async msg => {
try {
const data = JSON.parse(msg.data);

// 广播消息给所有连接的客户端
this.broadcast(JSON.stringify({
type: ‘chat’,
message: data.message,
timestamp: Date.now()
}));

} catch (err) {
console.error(‘Error parsing message:’, err);
}
});

// 当连接关闭时
ws.addEventListener(‘close’, () => {
this.sessions.delete(ws);
console.log(‘Client disconnected’);
});
}

// 广播消息给所有客户端
broadcast(message) {
for (const session of this.sessions) {
if (session.readyState === 1) { // 1 = OPEN
session.send(message);
}
}
}
}

// 主 Worker 逻辑
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);

// 如果是 Durable Object 的请求,路由到对应的 Object
if (url.pathname.startsWith(‘/room/’)) {
// 从路径中获取房间 ID
const id = env.GAME_ROOM.idFromName(url.pathname);
// 获取 Object 的存根 (Stub)
const stub = env.GAME_ROOM.get(id);
// 将请求转发给 Durable Object
return stub.fetch(request);
}

// 默认返回游戏 HTML (同上文示例,但可以添加连接 WebSocket 的逻辑)
// … (省略之前的 HTML 返回代码)
// 为了演示,这里返回一个简单的 WebSocket 测试页面

if (url.pathname === ‘/ws-test.js’) {
return new Response(`
const ws = new WebSocket(‘ws://localhost:8787/room/test-room/ws’); // 本地测试需替换为实际 URL
ws.onopen = () => console.log(‘WebSocket Connected’);
ws.onmessage = (e) => console.log(‘Received:’, e.data);
ws.onclose = () => console.log(‘WebSocket Closed’);

// 发送消息测试
setTimeout(() => ws.send(JSON.stringify({message: “Hello from client!”})), 2000);
`, { headers: { ‘Content-Type’: ‘application/javascript’ }});
}

return new Response(`

WebSocket 测试

打开浏览器控制台查看日志




`, { headers: { ‘Content-Type’: ‘text/html’ }});
}
};
3. 部署与测试
部署
:再次运行
wrangler deploy
。
测试
:在浏览器中访问
https://your-worker.your-subdomain.workers.dev/room/test-room
。打开浏览器的开发者工具(F12),在控制台中你会看到 WebSocket 连接建立和消息收发的日志。
在 Linux Mint 上优化游戏体验
虽然游戏逻辑运行在云端,但玩家的体验很大程度上取决于本地环境。以下是在 Linux Mint 上优化浏览器游戏体验的建议:
1. 使用现代浏览器
确保你使用的是最新版本的
Google Chrome
或
Mozilla Firefox
。这些浏览器对 WebAssembly (Wasm) 和现代 JavaScript 特性有很好的支持,这对于复杂的游戏至关重要。
# 安装 Chrome (通过 Google 官方源)
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome-stable_current_amd64.deb
sudo apt-get -f install # 修复可能的依赖问题
2. 硬件加速
在浏览器设置中,确保启用了硬件加速(Hardware Acceleration)。这能利用 GPU 来渲染图形,显著提升游戏性能。
Firefox
: 设置 -> 常规 -> 性能 -> 勾选 “使用推荐的性能设置” 或手动勾选 “使用硬件加速”。
Chrome
: 设置 -> 系统 -> 确保 “使用硬件加速模式” 已开启。
3. 网络连接
Cloudflare Workers 的优势在于低延迟。确保你的 Linux Mint 系统连接到一个稳定且速度较快的网络。你可以使用
ping
命令测试你的 Worker URL 的延迟:
# 将 your-worker.your-subdomain.workers.dev 替换为你的实际 Worker 域名
ping your-worker.your-subdomain.workers.dev
4. 使用 WebAssembly (Wasm) 提升性能
对于计算密集型的游戏逻辑(如物理引擎、AI),可以使用 Rust 或 C++ 编写核心代码,并编译成 WebAssembly,在 Worker 中运行。
简要流程:
使用
wasm-pack
或 Emscripten 编译 Rust/C++ 代码为
.wasm
文件。
在 Worker 代码中加载并实例化 Wasm 模块。
// 在 Worker 中加载 Wasm (示例)
import wasmModule from ‘./path/to/your_game_logic.wasm’;

export default {
async fetch(request, env, ctx) {
// 初始化 Wasm
const instance = await WebAssembly.instantiateStreaming(fetch(wasmModule));

// 调用 Wasm 导出的函数
const result = instance.exports.calculatePhysics(params);

return new Response(JSON.stringify({ result }));
}
};
总结
在 Linux Mint 上运行 Cloudflare Workers 游戏是一个高效且强大的选择。通过 Wrangler CLI,你可以轻松地在本地开发和部署。对于简单的单人游戏,直接返回 HTML/JS 即可;对于复杂的多人游戏,可以利用 Durable Objects 实现实时状态同步。结合 Linux Mint 稳定的环境和现代浏览器的性能优化,你可以为全球玩家提供流畅的游戏体验。