C++中如何让for循环暂停直至指定bool变量为true后继续执行
实现循环等待游戏状态的方案
适用后台独立线程的方案(推荐,不阻塞游戏主线程)
- 必须给
isInWorld添加volatile修饰,或是声明为C++11及以上标准的std::atomic<bool>,避免编译器优化掉内存读取操作,导致无法获取游戏侧的最新变量值 - 等待时添加短时长睡眠,避免空转占用100%CPU核心资源
示例代码:
// 变量声明添加volatile修饰 volatile bool isInWorld; // C++11以上推荐用线程安全的原子变量写法:std::atomic<bool> isInWorld; for (int x = 0; x < worldSize.x; x++) { for (int y = 0; y < worldSize.y; y++) { // 阻塞等待直到进入游戏世界 while (!isInWorld) { // Windows平台用Sleep,单位毫秒,这里设16ms对应60帧刷新间隔,可按需调整 Sleep(16); // 非Windows平台可以用标准库写法,需引入<thread> <chrono>头文件 // std::this_thread::sleep_for(std::chrono::milliseconds(16)); } // 此处填写你要执行的业务逻辑 } }
适用游戏主线程的方案(避免卡死游戏)
如果你的代码是运行在游戏主逻辑线程内,不能使用阻塞睡眠,需要把循环拆成分帧执行,放到游戏帧更新回调中调用:
// 全局或者类成员变量存储当前遍历坐标 int currX = 0, currY = 0; void OnGameFrameUpdate() { // 不在游戏世界内直接跳过当前帧处理 if (!isInWorld) return; // 执行当前坐标的业务逻辑 // do something with currX currY // 遍历坐标步进 currY++; if (currY >= worldSize.y) { currY = 0; currX++; // 全部遍历完成后重置坐标 if (currX >= worldSize.x) { currX = 0; currY = 0; } } }
内容的提问来源于stack exchange,提问作者Bruh
相关产品推荐
相关产品推荐

