AS3里的禁区:Timer

本文通过一个Flex项目的实际案例,分析了外包团队在使用Timer时常见的不当做法及其潜在问题,并提出了正确的使用建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为项目,接手了一个公司外包flex项目的跟进,BUG很多,慢慢理清程序逻辑,发现外包的团队,都有一个使用Timer的不良习惯,从而导致了该项目从开发初期,就已经埋好了很多地雷。

我会从项目里抽出部分代码说明,最后以自己的经验,做个总结,什么时候用TIMER,什么时候不该用TIMER

	/**
		 * 
		 * @param event
		 * 
		 */
		protected function resizeHandler(event:ResizeEvent):void
		{
			var timer:Timer = new Timer(50,1);
			timer.addEventListener(TimerEvent.TIMER_COMPLETE,function():void
			{
				fitDisplay();
			});
			timer.start();
			
		}

这里的fitDisplay(); 就是用户处理屏幕缩放后,界面元素的尺寸处理

这里大家可以很显然看到,有一个50毫秒的延时,至于为什么用50毫秒,估计外包的公司的那几个程序员,做过了一些测试,可能他们的开发机,上限制值20毫秒就能有处理结果,他们为了保险,用了50毫秒,就臆断了客户机可以胜任了此程序的运行。

很显然这是不负责任的写法,程序员的职责是什么?就是编写能稳定运行功能的代码。为什么这次要重点讲到这部分,是因为TIMER,一直都有不少人在重复犯相同的错误,而这次的外包项目,我从代码的注释和编码风格,大概知道了是2个老手带3个新手,而这个团队5个人都有乱语,甚至滥用TIMER的习惯。


好了,吐槽完毕,认真的解析下这个TIMER的官方说法:

Timer 类是 Flash Player 计时器的接口。 可以创建新的 Timer 对象,以便按指定的时间顺序运行代码。 使用 start() 方法来启动计时器。 为 timer 事件添加事件侦听器,以便将代码设置为按计时器间隔运行。 
可以创建 Timer 对象以运行一次或按指定间隔重复运行,从而按计划执行代码。 取决于 SWF 文件的帧频或 Flash Player 的环境(可用内存及其它因素),Flash Player 会能会按稍有偏差的间隔调度事件。 例如,如果某个 SWF 文件设置为以每秒 10 帧 [fps](也就是 100 毫秒的间隔)的速度播放,但计时器设置为在 80 毫秒时触发事件,则 Flash Player 将按接近于 100 毫秒的间隔触发事件。 大量耗费内存的脚本也可能使事件发生偏差。


官方解释的很清楚,FlashPlayer的虚拟机是以帧频去触发渲染的,而帧频又和电脑硬件等有着必然联系,所以注定了开发者不能以自己或周边几天电脑为判断依据,去随意估值一个延时的时间,再去触发事件,这样会有很多不可预计的现象发生。

还有现在从事FLEX开发的程序员,并不是从flash转型过来,对帧频这个概念比较模糊

上述只是其1的问题,是FP自身的渲染逻辑注定的,其2大量使用TIMER,是程序员自身不负责任的编码习惯。 上述那段代码,其实就是界面初始化后,才能去执行缩放处理,但是界面初始化是有一定的时间差,这个时间差应该通过事件去调度执行缩放处理,而不是妄自的认为给定一个50毫秒就解决的。现在初始化50毫秒上限制可以渲染出来,假如刚好在那个初始阶段,机器有其他吃CPU的软件在突然运行,那50毫秒,甚至500毫秒都可能渲染不出来,那这个缩放处理函数还是会出错,报null值错误。作为程序员,应该是严谨的,多学习事件执行流程对自己开发是多多益善。

说了这么多,就是告诫自己,程序运行执行的逻辑顺序,一定要掌握在自己手中,而不是交给机器,放任不管,这样可以做到心中有数,遇到BUG也知道问题出在哪里。而不是去各种瞎碰,去修改延时时间。

<think>嗯,用户让我介绍一下树莓派实现视觉导航。首先,我需要明确视觉导航的具体含义。视觉导航通常指的是通过摄像头获取环境信息,然后进行处理和分析,从而让设备能够自主移动或避障。树莓派作为一个小型计算机,适合用来做这样的项目,但需要考虑硬件和软件两方面的配置。 首先,硬件方面,树莓派需要连接摄像头模块,可能还需要电机驱动模块、超声波传感器或者激光雷达等辅助传感器。摄像头是关键,得选择适合的型号,比如官方的CSI摄像头或者USB摄像头。然后要考虑处理能力,树莓派4B或者更新型号性能较好,能处理图像数据。 软件方面,可能需要安装操作系统,通常是Raspbian,然后安装OpenCV库来处理图像。OpenCV可以做图像捕捉、颜色识别、边缘检测、物体识别等。如果是做SLAM(同步定位与地图构建),可能需要更复杂的算法,比如ORB-SLAM,但树莓派的计算能力可能有限,得考虑优化或者简化算法。 接下来是步骤分解。第一步是环境感知,摄像头捕捉图像,可能需要校准和预处理,比如去畸变、调整分辨率。然后特征提取,比如识别特定的标记、颜色区块或者使用深度学习模型检测物体。这部分可能需要训练一个轻量级的模型,比如MobileNet,以适应树莓派的计算资源。 然后是路径规划,根据识别到的障碍物或目标位置,计算出可行的路径。可能需要使用A*算法、Dijkstra算法或者更简单的基于规则的方法,比如遇到障碍物转向。运动控制部分需要将路径转化为电机驱动信号,通过GPIO控制轮子或舵机。 用户可能需要具体的例子,比如如何用OpenCV识别颜色,或者如何使用电机驱动模块。需要提到可能的难点,比如实时性处理不够导致延迟,或者光照变化影响图像识别效果,这时候可能需要加入滤波器或者自适应阈值处理。 另外,资源限制是一个大问题,树莓派的CPU和内存有限,处理复杂的视觉算法可能会有延迟,需要考虑算法优化,比如降低图像分辨率,减少处理区域,或者使用硬件加速,比如树莓派的GPU或者神经网络加速芯片如Intel的Movidius。 还要提到可能的扩展,比如结合IMU传感器进行数据融合,提高导航的准确性,或者使用无线通信模块将处理任务分载到更强大的服务器上,减轻树莓派的负担。 最后,应该推荐一些学习资源,比如官方文档、OpenCV的教程、已有的GitHub项目,或者社区论坛中的案例,帮助用户进一步学习和解决问题。</think>### 树莓派实现视觉导航的关键技术与步骤 #### 一、硬件基础配置 1. **核心设备** - 树莓派(推荐4B及以上型号,内存≥2GB) - 摄像头模块:官方CSI摄像头(低延迟)或USB摄像头(如Logitech C920) - 运动控制:L298N电机驱动模块 + 直流电机/步进电机 2. **扩展传感器**(可选) $$ \text{导航精度} = f(\text{超声波传感器}, \text{IMU}, \text{激光雷达}) $$ 通过多传感器融合可提升环境感知鲁棒性。 --- #### 二、软件环境搭建 1. **操作系统** - 安装Raspberry Pi OS(64位版本优化计算效率) - 启用摄像头接口:`sudo raspi-config` → Interface Options → Camera 2. **视觉处理库** ```bash # 安装OpenCV依赖 sudo apt install python3-opencv libopencv-dev # 验证安装 python3 -c "import cv2; print(cv2.__version__)" ``` --- #### 三、核心算法流程 1. **图像采集与预处理** - 分辨率设置:建议640×480(平衡速度与精度) - 实时畸变校正:通过相机标定获取内参矩阵 $$ \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} $$ 2. **特征提取** - **经典方法**:Canny边缘检测 + ORB特征点匹配 ```python orb = cv2.ORB_create(nfeatures=500) kp, des = orb.detectAndCompute(frame, None) ``` - **深度学习方案**:部署轻量级YOLOv5n模型(需OpenCV DNN模块) 3. **定位与建图** - **视觉程计**:通过特征点光流计算位移 $$ \Delta x = \frac{1}{N}\sum_{i=1}^{N}(x_i^{t} - x_i^{t-1}) $$ - **SLAM优化**:适用于室内场景的RTAB-MAP算法 --- #### 四、运动控制实现 1. **PID调速算法** $$ u(t) = K_p e(t) + K_i \int_0^t e(\tau)d\tau + K_d \frac{de(t)}{dt} $$ 参数调优工具:`numpy` + 实时绘图库`matplotlib` 2. **GPIO控制示例** ```python import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(motor_pin, GPIO.OUT) pwm = GPIO.PWM(motor_pin, 1000) # 1kHz PWM pwm.start(50) # 50%占空比 ``` --- #### 五、性能优化技巧 1. **计算加速** - 启用树莓派GPU:`sudo apt install libatlas-base-dev` - 多线程处理:分离图像采集与计算线程 2. **延迟测试工具** ```python from timeit import default_timer as timer start = timer() # 算法代码块 print(f"Latency: {timer()-start:.3f}s") ``` --- #### 六、典型应用场景 1. **仓库AGV**:结合AprilTag实现货架定位 2. **家庭扫地机器人**:基于HSV颜色空间的禁区识别 3. **农业机器人**:通过NDVI植被指数分析导航 > **注意**:实际部署时需考虑光照变化问题,建议增加自动白平衡算法或补光模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值