JavaScript实现ZLOGO: 性能改进
主攻前文吴烜:JavaScript实现ZLOGO: 界面改进与速度可调的几个性能问题
在线演示: 圈3
源码仍在: program-in-chinese/quan3
之前是在绘制过程中计算每帧需要绘制的线段, 在尝试改进的过程中很快发现问题太多且不易测试. 接着在某早晨"醒悟"到应该而且可以在绘制前计算好每一帧的步进路径表. 不仅可以避免绘制卡顿问题, 还便于测试(因为是纯JS实现, 不需夹杂DOM操作). 于是通过如下递归代码实现了截取指定位置的路径表:
// 返回{截取部分: 路径表, 剩余部分: 路径表} // 如果 开始位置 >= 终止位置, 返回{[], 所有} function 截取路径表(路径表, 开始位置, 终止位置) { if (开始位置 >= 终止位置) { return {截取部分: [], 剩余部分: 路径表}; } if (路径表.length == 0) { return {截取部分: [], 剩余部分: []}; } else if (路径表.length == 1) { return 截取路径(路径表[0], 开始位置, 终止位置); } else { var 段 = 路径表[0]; var 长度 = 段.长度; if (开始位置 >= 长度) { 路径表.shift(); return 截取路径表(路径表, 开始位置 - 长度, 终止位置 - 长度); } else if (开始位置 < 长度 && 终止位置 < 长度) { var 前段 = 截取路径(路径表[0], 开始位置, 终止位置); 路径表.shift(); return {截取部分: 前段.截取部分, 剩余部分: 前段.剩余部分.concat(路径表)}; } else { var 前段 = 截取路径(路径表[0], 开始位置, 长度); 路径表.shift(); var 后段 = 截取路径表(路径表, 0, 终止位置 - 长度); return {截取部分: 前段.截取部分.concat(后段.截取部分), 剩余部分: 后段.剩余部分}; } } }
原本为去掉路径表第一项, 使用了slice()
, 测试时发现耗时接近O(n^3). 导致点击"运行"后的运算耗时在复杂时(比如>10000线段的图形)太长(停顿超过1秒)难以接受. 改为shift()
后, 粗测不超过O(n^2), 暂未深入研究.
这里是获取每一帧的路径表(每帧前进的长度等于"速度"):
function 按步进拆分路径表(路径表, 速度) { var 所有段 = []; while (路径表.length > 0) { var 拆分路径 = 截取路径表(路径表, 0, 速度); 所有段.push(拆分路径.截取部分); 路径表 = 拆分路径.剩余部分; } return 所有段; }
感觉已经达到可以让用户玩玩的程度. 接下来视反馈决定改进方向.
2019-01-23

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
JavaScript实现ZLOGO: 界面改进与速度可调
续前文JavaScript实现ZLOGO: 前进方向和速度 在线演示地址: http://codeinchinese.com/%E5%9C%883/%E5%9C%883.html 源码仍在: program-in-chinese/quan3 主要功能改进是在界面可以选择速度. 其他界面布局改进有: 在ipad横屏下显示正常(1024x768) (前文问题1) 改正了有些浏览器"蚂蚁"对不准的问题(在火狐, Opera, Safari下测试) 加大字体和按钮 待解决问题 蚂蚁走位有偏移, 速度越快越明显 · Issue #9 · program-in-chinese/quan3 上面视频可以看到最后蚂蚁没有回到原点. 经测试貌似与速度有关, 尚未确定原因. 避免O(n^2)的绘制过程 · Issue #8 · program-in-chinese/quan3 上面视频可见越到后面行进越慢, 应该与每帧绘制线段数逐渐增加有关. 上面例子最后一帧绘制的总线段数有7200段. 避免在绘制每帧时重置背景色 · Issue #10 · program-in-chinese/quan3 在ipad下...
- 下一篇
[日常]Beyond的歌里最多是"唏嘘"吗? - Python分词+词频
看了一个Beyond的纪录片, 提到这个. 觉得心有不甘, 于是搜集了24首歌词, 用Python做了简单分词和词频统计. 源码(包括歌词)在: program-in-chinese/study 统计了总出现次数(词频列表)和词出现在歌曲的数目(词所在文件数列表). 前者算进了所有重复歌词, 后者是算某个词出现在了几首歌中. 源码: import jieba import os 所有词 = [] 词频表 = {} 词所在文件 = {} 词所在文件数 = {} 路径 = "数据" for 文件名 in os.listdir(路径): print(文件名) with open(os.path.join(路径, 文件名)) as 文件: 内容 = 文件.read() 分词结果 = jieba.cut(内容) for 词 in 分词结果: if 词 != " " and len(词) != 1: 所有词.append(词) if 词 in 词频表: 词频表[词] += 1 词所在文件[词].add(文件名) else: 词频表[词] = 1 词所在文件[词] = set([文件名]) for ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- 设置Eclipse缩进为4个空格,增强代码规范
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Hadoop3单机部署,实现最简伪集群
- CentOS关闭SELinux安全模块