中铁建温州项目技术文档
简述
项目中涉及不同的硬件,不同硬件会有相应的特殊性,会让软件开发时有着不同的开发偏向。
项目需求中很多多是页面打开、返回、跳转等操作,为了根据需求和素材的变化快速开发和更改程序,根据项目需求开发了AutoUI框架开自动化处理页面创建、改名、打开页面、返回、跳转等一系列便捷开发的工具。
由于展项中的机器配置会比较低,所以除了常规的开发实现功能外还需要尽可能的优化程序,否则在现场机器上经常会出现机器带不动软件,软件崩溃、卡顿等异常现象。
项目
中铁时刻-MI体系
硬件:
4块1920x1080的屏幕拼接成4K的屏幕。
红外线触摸屏。
AMD Ryzen 7 3700X, 16g, RTX 2060
软件开发:
根据AutoUI框架构建思路,创建页面、跳转、交互点击、滑动等操作。
安装调试遇到的问题:
运行时视频播放会卡顿
当显示页的内容打开时会同时加载多个视频的时候会导致入场动画卡顿
解决:1.使用协程懒加载。2.使用冷加载,每次看到时看的时静态帧,要播放时现从硬盘加载。
运行时会有崩溃的情况
现场硬件机器在同时播放2到3个4K视频时就会在页面切换时导致GPU占用率爆表导致程序崩溃。
解决:在框架中的页面跳转时让栈中的不可见的页面关掉以节省资源,使程序同一时间只播放当前能看到层的动画。
页面切换时因为加载视频时消耗性能,会出现明显的跳帧现象
解决:在页面之间的切换使用框架中的过度动画来避开画面跳帧现象。
全球时刻-动态股票
硬件:
多块led拼接的大屏幕,3096*774。
软件开发:
股票实时数据解析。
外部配置新闻、公告数据填充内容滚动。
和中控对接实现中控控制软件播放不同内容视频。
安装调试遇到的问题:
UDP服务端设置成127.0.0.1后无法在局域网内收到消息。
解决:由于展馆内的所有设备固定了IP,所以需要将对应的指向本地的IP换成固定的IP。
实测在使用中会遇到中控控制一段时间后发送消息收不到。
解决:开一个协程每个一定时间检查线程是否为null,当线程出现问题则重新启动这个线程来启动服务端监听端口。
新闻内容文字太多太长导致显示不全。
解决:增加每个新闻公告显示的区域,将原设计的时间去掉。
未来建筑-不透明屏
硬件:
单块1920x1080。
普通触摸屏。
7500U, MX150,8G。
软件开发:
多层透明图叠加,大量序列帧透明视频。
按钮交互的动态效果。
全屏点击返回。
开发打包遇到的问题:
默认导入UI素材自动设置为2048的UI素材。直接用Animation播放序列帧会导致序列帧瞬时加载过多程序花屏。
打包程序时因为素材太大,8g内存不够,开发机死机。
以上问题都需要在Unity中压缩UI素材的分辨率来解决。根据素材的出现时机和信息量针对性的优化素材大小。
例如:入场动画的前几帧是大部分都是透明的,那就压缩成256的素材。2048的内容压缩成1024的素材。
安装调试遇到的问题:
因为压缩素材显示不清晰。
涉及到的内容和文字都用程序内部对着设计图一个一个输入制作保证流畅度和清晰度。
现场屏幕比较大,在操作时返回按钮在左下角或者右下角都不太方便。
保留原来的返回按钮,并设计空白处点击返回。
未来建筑-透明屏
硬件:
单块1920x1080透明屏。
透明触摸屏
透明触摸屏特性:程序中显示的纯白色在实际观看时会显示成透明,可以透过屏幕看到屏幕后面的东西。
4600U, 8G。
软件开发:
待机页面,按钮点击视频动画打开内容。
内容视频与屏幕后的物体对准。
安装调试时遇到的问题:
由于硬件性能低,导致播放视频卡顿。
使用框架中的功能让在栈中的其他页面暂时关掉,当返回时再开始播放,同时只有当前的页面播放视频。
未来低碳交通-旋钮桌
硬件:
led大屏
4k屏幕
7500U,8G
旋钮桌大屏
4K屏幕
高精度触摸屏(30点同时触控)
两个旋钮(旋钮内部有三个金属柱,模拟点击,厂商的软件根据模拟点击的三个点位构成的三角形边长、周长、面积来识别旋钮和旋钮的旋转)。
AMD Ryzen 7 3700X, 16g, RTX 2060
旋钮桌软件对接:
旋钮桌运行原理:
厂商会提供软件对旋钮信息进行录入,录入的旋钮Marker在程序中通过Id区分,厂商给了源工程demo。在其中的Marker的对应的回调中间进行判断即可控制。
使用Marker录制程序录制Marker,这个程序将录制的信息存储在此机器的某个地方(更改屏幕分辨率会导致Marker失效,需要重新录制)。
在Unity中使用厂商给的SDK,其中的Reader组件以加密dll的形式存在(需要插入加密狗和导入加密狗dll才能正常运行打包好的程序。程序调试时必须打包出来在实体机上调试否则看不到效果),此组件在运行时会读取刚才录制好的Marker信息,然后运行回调(Marker进入、更新、离开)。
软件开发:
放置不同旋钮出现不同内容进行交互。
旋钮桌与led屏幕通过UDP协议进行联动通信。
安装调试时遇到的问题:
网络通讯问题,led屏幕程序收不到消息。
同
全球时刻
中遇到的IP问题,将外部配置文件中的服务端IP改成机器设置的固定IP即可解决。
旋钮桌在打开5层页面逻辑时,由于机器性能问题,会导致GPU会不定时的爆表导致软件崩溃。
使用框架中的功能让在栈中的其他页面暂时关掉,当返回时再开始播放,同时只有当前的页面播放视频。
led屏幕视频有掉帧现象。
核显播放4k视频吃力,性能不足导致,没有特别明显甲方没提。
未来服务-透明屏
硬件:
透明屏
两个1920x1080的屏幕拼接成一个3840x1080的透明屏
红外触摸透明屏
AMD Ryzen 7 3700X, 16g, RTX 2060 Super
软件开发:
按钮点击播放视频内容。
视频内容位置缩放动态配置。
空白处点击返回。
安装调试时遇到的问题:
内容提供的与实际透明屏后的实物对不上。
调整内容素材,用外部配置文件调整缩放和位置。
添加内容,视频后期制作带有透明通道的视频覆盖背景。
屏幕太大,点击时返回困难
添加点击空白全局返回。
未来健康-健康小屋
硬件:
单块1920x1080。
普通触摸屏。
7500U, MX150,8G。
软件开发:
页面跳转,播放过度动画和视频内容。
序列帧播放点位动画。
左右滑动播放内容。
安装调试时遇到的问题:
进入滑动页面时的过场动画会卡顿
当显示页的内容打开时会同时加载多个视频的时候会导致入场动画卡顿
解决:使用冷加载,每次看到时看的时静态帧,要播放时现从硬盘加载
未来治理-党建
硬件:
单块1920x1080。
普通触摸屏。
7500U, MX150,8G。
软件开发:
页面跳转,播放过度动画和视频内容。
左右滑动播放内容。
安装调试时遇到的问题:
进入滑动页面时的过场动画会卡顿
当显示页的内容打开时会同时加载多个视频的时候会导致入场动画卡顿
解决:使用冷加载,每次看到时看的时静态帧,要播放时现从硬盘加载
未来教育-滑轨屏
硬件:
单块1080x1920。
可滑动触摸屏
最终配置 9700k, 32g, GTX 2070 Super
滑轨单片机
软件开发:
点击背景视频滑动。
点击菜单播放视频内容。
到时间自动返回待机。
与滑轨程序对接。
滑轨屏软件对接:
滑轨屏运行原理:
滑轨屏依靠PLC的单片机控制点击移动。
滑轨屏厂商会在机器中提供一个软件用以转接PLC单片机发来的信号。实际开发中应用层与硬件厂商对接的是这个软件:PLCServer。
应用层与PLCServer使用UDP进行通讯。相互填写对方的服务端口进行配置。在PLCServer中的配置文件中可以配置点位和对应点位屏幕移动到那个坐标。
安装调试时遇到的问题:
内容素材和现场对不上,需要外部配置内容进行尝试拉伸调整
由于现场背景的画布和屏幕有一定的距离、屏幕不是窄边框、画布有一部分在安装时藏入空隙中导致内容显示区域的画面需要现场大致对齐。
硬件停留的点位和内容点位不同
不断调整PLCServer的配置文件中的点位坐标。
每个点位的距离是不同的,导致到达时间页不同
需要每个点位去找齐对应的到达时间,通过外部配置文件调整时间来匹配实际硬件的各个点位时间。
由于机器在不同硬件速度下启动时间、匀速时间和减速停止时间是不同的,要每个点位进行再分段调整。
需求中要求背景视频(共6000x1300像素,2万以内的码率)卡顿抽搐。
使用VideoPlayer播放
程序直接崩溃。
使用序列帧播放
爆显存,软件花屏。
使用AvproVideo(版本:1.6、1.9、1.11)播放
6个分段的视频(每个1000x1300)同时播放,DOTween移动内容
由于每个视频播放时的渲染帧率不同,导致一起播放的视频在播放一段时间后会发现明显的不同步问题。
尝试用同步seek()同步播放时间,但是由于seek的过程也是需要时间的,所以会导致所有的视频都是在seek标准的播放时间,都是在seek当中,那么视频就都变卡了。
一个完整的视频,DOTween移动内容
一个完整的视频,Update移动内容
一个完整的视频,Animation移动内容
一个完整的视频,DOTween移动相机
一个完整的视频,Update移动相机
以上从2开始往后都会出现内容不会断层,但是画面会抽搐卡顿。
在机器上使用Unity的高画质进入程序CPU、GPU占用率比较低,使用最低画质的时候CPU、GPU占用率就会都上升。
多次测试发现不同画质会出现CPU占用率、GPU占用率不稳定在固定画质出现。暂时没找到原因。
在机器上发现,只放几个白模cube移动相机也会卡顿。并且是时卡时不卡。没有找到原因。
使用厂商提供的C++写的demo测试,也是时卡时不卡,不过好在不卡的时候时很流畅不会有抽搐问题。
最后决定还是让厂商用c++调用Opengl库使用提供安装的解码器播放mov格式的视频来开发滑轨屏应用。
厂商给出的Unity程序卡顿的原因是,AvproVideo的软解码mp4(超过1k分辨率的视频无法直接使用硬解码)效率没有那么高,导致卡顿。
技术总结
展馆的硬件普遍性能较低,或者表现出性能较低。为了针对此现象,在软件开发时,要尽可能的优化程序在同一时间对机器资源的利用。
此次涉及到四种不同类型的硬件:
触摸透明屏
传统触摸屏
滑轨屏
旋钮桌
透明屏和传统触摸屏差不多,只是多了个白色全透的特别属性。
滑轨屏软件开发上和传统触摸屏一样,多了 需要和硬件网络通信、和现场实景配合、和电机速度配合。
旋钮桌是一个高精度的多点触摸桌,旋钮通过三个点区别旋钮定位。
展馆现场的设备都是固定IP,所以网络通讯时的服务端口都要写固定的IP而不是127.0.0.1。