news 2026/6/15 19:28:51

随机生成无重叠精灵的优化技巧

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
随机生成无重叠精灵的优化技巧

在游戏开发或网页设计中,常常需要在画布上随机放置多个精灵(如游戏角色或装饰物),而这些精灵之间不能有任何重叠。最近,我遇到了一个问题:使用递归方法来避免精灵重叠时,程序很快就达到了最大调用栈大小,导致无法处理较多的精灵(如15个以上)。此外,精灵的位置倾向于集中在画布的左上角,导致大量的碰撞问题。以下是我在解决这些问题时的一些优化技巧和实例。

问题分析

最初的代码如下:

constgetLocation=()=>{letx=Math.floor(myrng()*(canvas.width-80));lety=Math.floor(myrng()*(canvas.height-80));x=x<0?0:x;y=y<0?0:y;constoverlap=entities.some((entity)=>{return(x-entity.position.x<80||y-entity.position.y<80);});if(!overlap){return[x,y];}else{returngetLocation();}};

优化思路

  1. 避免递归,采用循环

    • 递归可能会导致堆栈溢出,尤其在高密度精灵布局下。通过循环来代替递归,可以控制循环次数,避免无限递归。
    functiongetLocation(){letx,y,overlap;letattempt=0;constmaxAttempts=1000;// 设置最大尝试次数do{x=Math.floor(myrng()*(canvas.width-80));y=Math.floor(myrng()*(canvas.height-80));x=x<0?0:x;y=y<0?0:y;overlap=entities.some((entity)=>{returnMath.abs(x-entity.position.x)<80&&Math.abs(y-entity.position.y)<80;});attempt++;}while(overlap&&attempt<maxAttempts);if(attempt===maxAttempts){console.warn('Could not find a free position after '+maxAttempts+' attempts.');returnnull;// 返回null表示无法找到位置}return[x,y];}
  2. 改进重叠检测逻辑

    • 原来的重叠检测逻辑存在缺陷,导致精灵倾向于集中在左上角。通过更精确的检测,可以避免这种问题。
  3. 预计算空位

    • 如评论中所提,预先计算画布上的所有可能位置,并随机从中选择。这可以大大减少计算量。
    // 预计算空位letavailablePositions=[];for(letx=0;x<canvas.width-80;x+=80){for(lety=0;y<canvas.height-80;y+=80){availablePositions.push({x,y});}}functiongetLocation(){if(availablePositions.length===0){console.warn('No more available positions.');returnnull;}constindex=Math.floor(myrng()*availablePositions.length);letpos=availablePositions.splice(index,1)[0];return[pos.x,pos.y];}

实例

假设我们要在一个800x600的画布上随机放置20个精灵:

constentities=[];for(leti=0;i<20;i++){constposition=getLocation();if(position){entities.push({position:{x:position[0],y:position[1]}});}else{break;// 无法找到更多位置时停止}}

通过这些优化,我们不仅解决了最大调用栈的问题,还提高了精灵的分布均匀性和程序的效率。这些技巧可以应用于任何需要在有限空间内随机且无重叠放置对象的场景中。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 6:17:49

从74HC151到FPGA:数据选择器的硬件实现与优化策略

从74HC151到FPGA&#xff1a;数据选择器的硬件实现与优化策略 在数字电路设计中&#xff0c;数据选择器&#xff08;Multiplexer&#xff09;是一个基础但极其重要的组件。它能够根据控制信号从多个输入中选择一个输出&#xff0c;广泛应用于信号路由、数据转换和逻辑函数实现…

作者头像 李华
网站建设 2026/6/13 8:00:34

AnimateDiff低配福音:8G显卡流畅运行文生视频全攻略

AnimateDiff低配福音&#xff1a;8G显卡流畅运行文生视频全攻略 基于 SD 1.5 Motion Adapter | 文本生成动态视频 (Text-to-Video) | 显存优化版 1. 为什么你该关注这个“能跑起来”的文生视频方案&#xff1f; 你是不是也经历过这些时刻&#xff1a; 看到Sora、Gen-3的演示…

作者头像 李华
网站建设 2026/6/15 13:09:50

从零构建cosyvoice tokenizer:文本预处理最佳实践与性能优化指南

从零构建cosyvoice tokenizer&#xff1a;文本预处理最佳实践与性能优化指南 上周帮朋友跑一个 50 GB 的直播弹幕语料&#xff0c;jieba 直接 OOM&#xff0c;Spacy 倒是能跑&#xff0c;但 8 小时才啃完一半&#xff0c;中间还因为 emoji 把分词结果切成乱码。被折磨了一晚上…

作者头像 李华
网站建设 2026/6/15 12:24:09

CogVideoX-2b部署详解:HTTP服务启动与Web访问配置

CogVideoX-2b部署详解&#xff1a;HTTP服务启动与Web访问配置 1. 为什么选择本地部署CogVideoX-2b 你是否试过在网页上输入一段文字&#xff0c;几秒钟后就生成一段流畅自然的短视频&#xff1f;这不是科幻电影里的场景&#xff0c;而是CogVideoX-2b正在做的事。但和很多在线…

作者头像 李华
网站建设 2026/6/15 16:02:06

YOLOv9批量推理实战,多图处理效率提升明显

YOLOv9批量推理实战&#xff0c;多图处理效率提升明显 在工业质检、智能仓储和安防巡检等实际场景中&#xff0c;我们常面临一个看似简单却影响深远的问题&#xff1a;单张图推理很快&#xff0c;但上百张图排队跑却耗时太久。你可能已经成功运行过 detect_dual.py&#xff0c…

作者头像 李华