网络作为一种新兴的教育媒介,我们借助它可以实现价值分享,名师共享,媒体分享、图文动画教学等效果,且不受地域时间限制。网络直播平台分为教师端、学生端。教师端通过PC上的应用展开直播,与之对应的学生端则可以使用诸如浏览器、APP、H5等途径学习直播课程。
EduSoho推出的教师端工具 ESLive 在 PC 上为教师提供优质服务,其中主要有课件白板、音视频处理、音视频传输、屏幕共享、聊天、美颜、降噪和其他互动功能。下面将介绍我们EduSoho推出的教师端工具ESLive的白板部分。
当教师在白板上使用画笔进行绘图时,由系统API采集获取白板上鼠标的移动点。需要考虑以下关键点。
从 update
到真正的 paintEvent
调用一般耗时 3-8 ms
绘制过程中,如果无法及时响应鼠标移动事件回调事件,将获取不了鼠标的实时位置,或者会丢点,当丢点很多时,绘图就会出现锯齿。
考虑画一笔的极限图形,绘制点最多可能达到5000~6000点左右。采用的绘图方式有两种:
1 QPainterPath
绘图方式,绘制1000个点耗时达到60ms左右。
2 drawLine
绘图方式,绘制5000个点耗时达到60ms左右。
所有画笔线条同时绘制
update
调用频繁(将触发界面更新)
在绘制文字时,由于光标持续闪烁,会触发界面更新
针对以上问题,我们采取“增量绘制”、“多图层”、“合理定时”来解决。
绘制出所有的点,会导致CPU占用过高,对于我们而言没有必要。为此我们采用了增量绘制的方式。绘制流畅,速度快(底层是直接内存拷贝)
将之前的绘图保存为一个底层图,每次绘制时,通过内存拷贝直接渲染底层图,实现每次只绘制最后一笔的效果。
基于增量绘制的方案,我们设计了三层图层。
对于输入文字方面,输入框的光标闪烁引起底层的无限绘制,由于视图间的链式结构,在父图层也会被绘制,所以这个需要控制刷新频率。
当我们遇到高清屏或者巨型屏时, 完成一个背景图层(比如黑板的颜色黑色背景、绿色背景)的填色功能需要消耗很长时间。图片越大,填充过程中越耗时。
在初始状态是纯色场景的前提下,设定较小的场景图,结合 scale
方式,获得大图。将原来的按点计算填充颜色改成了按块计算,性能得到较大的提高。
线条圆润是能直接影响学习效率的。俗话说,见字如见人,难看的板书,放谁都难有学下去的欲望。
当以较慢的速度进行绘制时,会存在过度采集的问题,因为鼠标事件在持续回调。存储了较多无用点,影响性能,就算丢弃一部分点,穿点绘制仍然会有锯齿。尤其是在教师慢慢移动鼠标的情况时,采集的点会上下抖动,若采用穿点,就会造成线条锯齿状,不幸的是,抖动情况不可避免。
二次贝塞尔曲线
粗略解释一下二次贝塞尔曲线的公式。当 t 从 0 到 1 开始递增时,比如 0.1 ~ 0.2 ~ 0.3 …~ 0.8 ~ 0.9 ~ 1。每取一个点,就得到一个值B,对应图就是移动的黑点(对于计算机绘制系统,自然是间隔越小,因变量B点就越多,绘制起来就越圆润,同时也要要考虑效率和观感平衡)。
每取一个点t,对应计算B的步骤如下:
具体动图如下
贝塞尔曲线不仅有二阶还有多阶,多阶我们并不需要,而且多阶计算量也大,所以我们采用了二阶贝塞尔曲线进行绘制。
既然使用二阶,那么对于一笔很多的点,不能简单的选取三个点一组作为控制点进行绘制。因为这样无法控制拐点的策略(计算机无法得知哪里是拐点),所以我们需要分段绘制。
图1、图2中第三幅图的中间部分是使用拟合算法绘制的,图片中的红点就是对应的分治点。同时我们也能观察到,每到“变化强烈”的位置(比如拐点),红点较多。其实这就是将多个更小的片段拟合连接在一起的效果。
白板内图形有线条、矩形、圆形、文字等,为了支持画板适配不同的分辨率,我们使用小数来描述位置信息。这样无论在手机上还是在 PC 上都能得到一致的画面。
绘图坐标点: (x1,y1), (x2,y2), (x3,y3), …
[
{"x":0.12343,"y":0.23432},
{"x":0.332212,"y":0.34223},
{"x":0.32339,"y":0.983232},
...
]
{
、"
、x
、 y
、:
、,
、0.
、}
[123,234,332,342,323,983,...]
EduSoho官方开发文档地址
EduSoho官网 https://www.edusoho.com/
EduSoho开源地址 https://github.com/edusoho/edusoho