如题,用了LVGL的gif库来显示动图,图片大小2.13M,转换成C文件之后13.6M,效果不太好,显示得很缓慢,是哪里没优化好吗,还是说软件解码效果就是这样的?有什么其它的图形库显示gif图片流畅的吗,请大佬们指点一二
最近编辑记录 岁月快快快 (2022-03-09 17:19:57)
离线
这是原图
离线
要不用硬件jpg?
感觉是,没有在指定时间内完成图片解码导致帧率降低?
离线
要不用硬件jpg?
硬件jpg解码是视频解码吧,直接用播放视频的形式来做感觉不好做成一个控件啊,图片控件可以直接调用lvgl的接口来显示和隐藏
离线
把那个帧率fps显示打开,看下现在是什么帧率?
离线
把那个帧率fps显示打开,看下现在是什么帧率?
fps显示是30-32 cpu占用率百分之九十多,整个gif做的是6秒钟,板子上显示12秒才显示完 翻了一倍.....
最近编辑记录 岁月快快快 (2022-03-10 15:53:33)
离线
LVGL没有缓存图像的位图?我没怎么用过LVGL不太清楚,但楼主可以尝试用AWTK,据我所知,AWTK在显示图像前会将其转换成位图并缓存在内存中,这样显示应该会流畅点。
AWTK中有直接的gif控件,也有mutable_image控件通过手动填充位图图像帧来实现动态图像从而方便性能优化。
https://gitee.com/zlgopen/awtk/blob/master/docs/manual/gif_image_t.md
https://gitee.com/zlgopen/awtk/blob/master/docs/how_to_use_mutable_image.md
最近编辑记录 海石生风 (2022-03-11 11:04:49)
离线
@海石生风
lvgl有缓存图片的功能,我打开了感觉也没有什么用,准备试一下移植AWTK看看效果如何
离线
@海石生风
lvgl有缓存图片的功能,我打开了感觉也没有什么用,准备试一下移植AWTK看看效果如何
你这GIF太大了,建议用mutable_image来实现,也可以尝试用动画来实现。
AWTK支持Rive和Lottie动画:
https://github.com/zlgopen/awtk-widget-rive
https://github.com/zlgopen/awtk-widget-rlottie
离线
@海石生风
多谢指点,现在正在移植AWTK到linux上,按照官方的教程编译demo,一直报错:
TypeError: File /home/robert/myProject/aboutLinux/linuxFile/SweepFLoorMachineUseLinux/awtkApp/awtk-linux-fb/bin found where directory expected.:
File "/home/robert/myProject/aboutLinux/linuxFile/SweepFLoorMachineUseLinux/awtkApp/awtk-linux-fb/SConstruct", line 77:
SConscript(SConscriptFiles)
File "/usr/local/lib/python3.7/dist-packages/SCons/Script/SConscript.py", line 660:
return method(*args, **kw)
File "/usr/local/lib/python3.7/dist-packages/SCons/Script/SConscript.py", line 597:
return _SConscript(self.fs, *files, **subst_kw)
File "/usr/local/lib/python3.7/dist-packages/SCons/Script/SConscript.py", line 285:
exec(compile(scriptdata, scriptname, 'exec'), call_stack[-1].globals)
File "/home/robert/myProject/aboutLinux/linuxFile/SweepFLoorMachineUseLinux/awtkApp/awtk-linux-fb/build/var/awtk/src/SConscript", line 100:
LIBS=TKC_DEPS_LIBS, LINKFLAGS=TKC_LINKFLAGS)
File "/usr/local/lib/python3.7/dist-packages/SCons/Environment.py", line 238:
return super().call(target, source, *args, **kw)
File "/usr/local/lib/python3.7/dist-packages/SCons/Util.py", line 742:
return self.method(*nargs, **kwargs)
File "/usr/local/lib/python3.7/dist-packages/SCons/Builder.py", line 662:
return self._execute(env, target, source, OverrideWarner(kw), ekw)
File "/usr/local/lib/python3.7/dist-packages/SCons/Builder.py", line 568:
tlist, slist = self._create_nodes(env, target, source)
File "/usr/local/lib/python3.7/dist-packages/SCons/Builder.py", line 513:
tlist = env.arg2nodes(target, target_factory, target=target, source=source)
File "/usr/local/lib/python3.7/dist-packages/SCons/Environment.py", line 468:
v = node_factory(self.subst(v, **kw))
File "/usr/local/lib/python3.7/dist-packages/SCons/Node/FS.py", line 1435:
return self._lookup(name, directory, File, create)
File "/usr/local/lib/python3.7/dist-packages/SCons/Node/FS.py", line 1414:
return root._lookup_abs(p, fsclass, create)
File "/usr/local/lib/python3.7/dist-packages/SCons/Node/FS.py", line 2434:
dir_node = self._lookup_abs(dir_name, Dir)
File "/usr/local/lib/python3.7/dist-packages/SCons/Node/FS.py", line 2439:
result.diskcheck_match()
File "/usr/local/lib/python3.7/dist-packages/SCons/Node/FS.py", line 1646:
"File %s found where directory expected.")
File "/usr/local/lib/python3.7/dist-packages/SCons/Node/FS.py", line 389:
return self.func(*args, **kw)
File "/usr/local/lib/python3.7/dist-packages/SCons/Node/FS.py", line 410:
raise TypeError(errorfmt % node.get_abspath())
按照 https://github.com/zlgopen/awtk-linux-fb/issues/49#
去修改,也是报一样的错误
有遇到过这样的错误吗
最近编辑记录 岁月快快快 (2022-03-16 00:06:08)
离线
diff --git a/awtk_config.py b/awtk_config.py
index b789e90..e43b4ef 100644
--- a/awtk_config.py
+++ b/awtk_config.py
@@ -103,15 +103,18 @@ OS_FLAGS='-Wall -Os -fno-strict-aliasing '
#TSLIB_LIB_DIR=joinPath(TK_LINUX_FB_ROOT, '3rd/tslib/src/.libs')
#for prebuild tslib
-TSLIB_LIB_DIR='/opt/28x/tslib/lib'
-TSLIB_INC_DIR='/opt/28x/tslib/include'
-TOOLS_PREFIX='/opt/28x/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-linux-'
+#TSLIB_LIB_DIR='/opt/28x/tslib/lib'
+#TSLIB_INC_DIR='/opt/28x/tslib/include'
+#TOOLS_PREFIX='/opt/28x/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-linux-'
+TSLIB_LIB_DIR=''
+TSLIB_INC_DIR=''
+TOOLS_PREFIX='/usr/local/arm-linux-gcc/bin/arm-linux-gnueabi'
#TOOLS_PREFIX='/opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-'
#for qemu
-TOOLS_PREFIX='/opt/qemu/buildroot-2021.02.2/output/host/bin/arm-linux-'
-TSLIB_LIB_DIR=''
+#TOOLS_PREFIX='/opt/qemu/buildroot-2021.02.2/output/host/bin/arm-linux-'
+#TSLIB_LIB_DIR=''
#TSLIB_LIB_DIR=''
按照官方的教程来移植的,apt安装和pip安装scons都试过了,都是报这个错误;https://github.com/zlgopen/awtk-linux-fb/issues/49# github上面有人说是linux环境的问题,我之前的环境是ubuntu16.04.6,重新装了个deepin20.4,也是报一样的错误
最近编辑记录 岁月快快快 (2022-03-17 13:06:57)
离线
@岁月快快快
没遇到过种问题,你的awtk-linux-fb/awtk_config.py配置文件是怎么改的?帖下git diff输出看下。
建议尝试用apt或者从源码重新安装scons。
从源码安装也试了,报一样的错误
离线
TOOLS_PREFIX='/usr/local/arm-linux-gcc/bin/arm-linux-gnueabi'
末尾少了扛,应该是这样:
TOOLS_PREFIX='/usr/local/arm-linux-gcc/bin/arm-linux-gnueabi-'
但可能不是这里导致的错误。你这个是连配置文件都没读完就报错了,可以看看没修改配置前编译的输出(git reset --hard && scons)。
也有可能是文件编码或文件的BOM标记不正常引起。
一般来说不太可能是python或scons在不同linux发行版上有一致性差异,应该是项目文件中哪里出了问题。
建议尝试先编译无修改的awtk再编译无修改的awtk-linux-fb确保配置文件没有问题。
最近编辑记录 海石生风 (2022-03-18 07:00:03)
离线
把awtk-linux-fb文件夹下"bin"这个文件删掉就可以编译了,这个文件好像是编译一次之后不管通不通过都会生成,然后如果有这文件的时候再去编译就会报上面的错误,应该是把bin这个文件识别成SConstruct文件,然后就报错了,太坑了!
最近编辑记录 岁月快快快 (2022-03-18 23:48:55)
离线
@岁月快快快
AWTK的构造系统在编译前即读取配置文件时会先在编译目录里创建bin文件夹,如果你在这个目录里有个bin文件,那自然创建bin文件夹就失败了,从导致读取配置文件失败。
这个文件不是我创建的,是编译以后自动生成的,也就是我第一次编译因为其它的原因出错了,然后也生成了这个文件,然后再去编译就会一直报错,直接删掉,或者执行scons -c(类似于make clean的操作), 就通过了
离线
那估计是你的文件系统有问题
麻烦不断,又有新问题了,用编译buildroot的工具链来编译awtk-linux-fb报错:
-I/home/robert/myProject/aboutLinux/linuxFile/SweepFLoorMachineUseLinux/awtkApp/awtk/res build/var/awtk/src/charset/encoding.c
build/var/awtk/src/charset/encoding.c:30:10: fatal error: iconv.h: No such file or directory
#include <iconv.h>
^~~~~~~~~
compilation terminated.
scons: *** [build/var/awtk/src/charset/encoding.o] Error 1
scons: building terminated because of errors.
可能是buildroot工具链不支持iconv库?或者是我没配置好?
配置如下:
buildroot试了buildroot-2018.02.2和buildroot-2018.08.2,都有一样的问题
用同样的buildroot工具链去编译lvgl又是没有问题的,可以编译通过,编译出来的demo可以在板子上运行;
用编译内核的工具链gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz去编译awtk-linux-fb又是可以通过的,没有报缺少iconv.h;
但是用编译内核的工具链编出来的应用程序在板子上执行不了,应该是和编译根文件系统用的glibc的版本不一样导致,所以只能用buildroot的工具链来编译;
strings buildroot-2018.02.2/output/host/bin/arm-linux-gcc | grep -i glibc
GLIBC_2.14
GLIBC_2.3
GLIBC_2.2.5
用编译内核的工具链编译出来的应用程序执行报错信息:
[root@buildroot: /opt/release/bin]$./demo &
[1]- Done(127) ./demo
[root@buildroot: /opt/release/bin]$-sh: ./demo: not found
^C
[root@buildroot: /opt/release/bin]$strings libawtk.so | grep -i glibc
GLIBC_2.4
GLIBCXX_3.4
GLIBC_2.7
signal@@GLIBC_2.4
atan@@GLIBC_2.4
pthread_cond_init@@GLIBC_2.4
chdir@@GLIBC_2.4
stdin@@GLIBC_2.4
sem_destroy@@GLIBC_2.4
_Znwj@@GLIBCXX_3.4
pthread_mutex_lock@@GLIBC_2.4
wcslen@@GLIBC_2.4
pthread_mutex_init@@GLIBC_2.4
fsync@@GLIBC_2.4
rand@@GLIBC_2.4
sqrt@@GLIBC_2.4
ftruncate@@GLIBC_2.4
iswspace@@GLIBC_2.4
popen@@GLIBC_2.4
log@@GLIBC_2.4
dlerror@@GLIBC_2.4
gettimeofday@@GLIBC_2.4
recvfrom@@GLIBC_2.4
pthread_cond_destroy@@GLIBC_2.4
socketpair@@GLIBC_2.4
getsockopt@@GLIBC_2.4
strcasecmp@@GLIBC_2.4
ftello@@GLIBC_2.4
utime@@GLIBC_2.4
freeaddrinfo@@GLIBC_2.4
strtol@@GLIBC_2.4
free@@GLIBC_2.4
atan2f@@GLIBC_2.4
readdir@@GLIBC_2.4
getaddrinfo@@GLIBC_2.4
fseek@@GLIBC_2.4
atanf@@GLIBC_2.4
tanf@@GLIBC_2.4
qsort@@GLIBC_2.4
strncmp@@GLIBC_2.4
pthread_join@@GLIBC_2.4
ceilf@@GLIBC_2.4
closedir@@GLIBC_2.4
printf@@GLIBC_2.4
cosf@@GLIBC_2.4
pthread_cond_timedwait@@GLIBC_2.4
dlclose@@GLIBC_2.4
feof@@GLIBC_2.4
puts@@GLIBC_2.4
pthread_cond_signal@@GLIBC_2.4
perror@@GLIBC_2.4
asin@@GLIBC_2.4
strtoll@@GLIBC_2.4
getpwuid@@GLIBC_2.4
sendto@@GLIBC_2.4
readlink@@GLIBC_2.4
cos@@GLIBC_2.4
lround@@GLIBC_2.4
exp@@GLIBC_2.4
putchar@@GLIBC_2.4
memset@@GLIBC_2.4
pthread_self@@GLIBC_2.4
opendir@@GLIBC_2.4
acosf@@GLIBC_2.4
srandom@@GLIBC_2.4
recv@@GLIBC_2.4
remove@@GLIBC_2.4
fcntl@@GLIBC_2.4
wcschr@@GLIBC_2.4
listen@@GLIBC_2.4
snprintf@@GLIBC_2.4
ldexp@@GLIBC_2.4
pthread_mutex_trylock@@GLIBC_2.4
close@@GLIBC_2.4
pthread_cond_broadcast@@GLIBC_2.4
fopen@@GLIBC_2.4
_Znaj@@GLIBCXX_3.4
read@@GLIBC_2.4
bsearch@@GLIBC_2.4
pow@@GLIBC_2.4
vfprintf@@GLIBC_2.4
sinf@@GLIBC_2.4
__ctype_toupper_loc@@GLIBC_2.4
memmove@@GLIBC_2.4
freopen@@GLIBC_2.4
rmdir@@GLIBC_2.4
unlink@@GLIBC_2.4
gethostbyname@@GLIBC_2.4
dlopen@@GLIBC_2.4
ioctl@@GLIBC_2.4
tcflush@@GLIBC_2.4
cfsetspeed@@GLIBC_2.4
localtime@@GLIBC_2.4
gmtime_r@@GLIBC_2.4
system@@GLIBC_2.4
realloc@@GLIBC_2.4
strcpy@@GLIBC_2.4
mmap@@GLIBC_2.4
wcsncpy@@GLIBC_2.4
wcscmp@@GLIBC_2.4
_ZdlPv@@GLIBCXX_3.4
__assert_fail@@GLIBC_2.4
ceil@@GLIBC_2.4
open@@GLIBC_2.4
sincosf@@GLIBC_2.4
bind@@GLIBC_2.4
pthread_mutex_destroy@@GLIBC_2.4
tcsetattr@@GLIBC_2.4
fread@@GLIBC_2.4
fileno@@GLIBC_2.4
socket@@GLIBC_2.4
access@@GLIBC_2.4
mkdir@@GLIBC_2.4
atan2@@GLIBC_2.4
__cxa_atexit@@GLIBC_2.4
strstr@@GLIBC_2.4
sqrtf@@GLIBC_2.4
sem_init@@GLIBC_2.4
sem_timedwait@@GLIBC_2.4
__register_atfork@@GLIBC_2.4
pclose@@GLIBC_2.4
_ZdaPv@@GLIBCXX_3.4
__isoc99_vsscanf@@GLIBC_2.7
setsockopt@@GLIBC_2.4
select@@GLIBC_2.4
shutdown@@GLIBC_2.4
sleep@@GLIBC_2.4
raise@@GLIBC_2.4
__ctype_b_loc@@GLIBC_2.4
pthread_cond_wait@@GLIBC_2.4
getuid@@GLIBC_2.4
strtoull@@GLIBC_2.4
connect@@GLIBC_2.4
rewinddir@@GLIBC_2.4
calloc@@GLIBC_2.4
ftell@@GLIBC_2.4
ferror@@GLIBC_2.4
iconv_close@@GLIBC_2.4
fgets@@GLIBC_2.4
__fxstat@@GLIBC_2.4
sem_post@@GLIBC_2.4
fwrite@@GLIBC_2.4
sincos@@GLIBC_2.4
memcpy@@GLIBC_2.4
tan@@GLIBC_2.4
malloc@@GLIBC_2.4
strlen@@GLIBC_2.4
getcwd@@GLIBC_2.4
munmap@@GLIBC_2.4
accept@@GLIBC_2.4
usleep@@GLIBC_2.4
fclose@@GLIBC_2.4
write@@GLIBC_2.4
atof@@GLIBC_2.4
fseeko@@GLIBC_2.4
floorf@@GLIBC_2.4
fmodf@@GLIBC_2.4
__xstat@@GLIBC_2.4
stdout@@GLIBC_2.4
random@@GLIBC_2.4
iconv_open@@GLIBC_2.4
pthread_create@@GLIBC_2.4
strcmp@@GLIBC_2.4
time@@GLIBC_2.4
iconv@@GLIBC_2.4
tcgetattr@@GLIBC_2.4
__errno_location@@GLIBC_2.4
send@@GLIBC_2.4
tolower@@GLIBC_2.4
__sysv_signal@@GLIBC_2.4
strncpy@@GLIBC_2.4
fflush@@GLIBC_2.4
memcmp@@GLIBC_2.4
strrchr@@GLIBC_2.4
wcscpy@@GLIBC_2.4
__ctype_tolower_loc@@GLIBC_2.4
alarm@@GLIBC_2.4
getsockname@@GLIBC_2.4
mktime@@GLIBC_2.4
sin@@GLIBC_2.4
fputs@@GLIBC_2.4
getenv@@GLIBC_2.4
clock_gettime@@GLIBC_2.4
dlsym@@GLIBC_2.4
rename@@GLIBC_2.4
acos@@GLIBC_2.4
sem_wait@@GLIBC_2.4
strchr@@GLIBC_2.4
__cxa_finalize@@GLIBC_2.4
pthread_mutex_unlock@@GLIBC_2.4
settimeofday@@GLIBC_2.4
vsnprintf@@GLIBC_2.4
floor@@GLIBC_2.4
[2]+ Done(127) ./demo
[root@buildroot: /opt/release/bin]$[ 181.351505] random: crng init done
[root@buildroot: /opt/release/bin]$ldd demo
checking sub-depends for '/usr/lib/libstdc++.so.6'
checking sub-depends for 'not found'
checking sub-depends for 'not found'
checking sub-depends for 'not found'
checking sub-depends for 'not found'
checking sub-depends for '/lib/libgcc_s.so.1'
checking sub-depends for 'not found'
checking sub-depends for '/lib/libc.so.0'
ld-uClibc.so.1 => /lib/ld-uClibc.so.1 (0xb6f6a000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00000000)
libpthread.so.0 => not found (0x00000000)
librt.so.1 => not found (0x00000000)
libm.so.6 => not found (0x00000000)
libdl.so.2 => not found (0x00000000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00000000)
libc.so.6 => not found (0x00000000)
libc.so.0 => /lib/libc.so.0 (0x00000000)
/lib/ld-uClibc.so.1 => /lib/ld-uClibc.so.1 (0x00000000)
/lib/ld-uClibc.so.1 => /lib/ld-uClibc.so.1 (0x00000000)
@海石生风
大佬,你是用的什么版本的工具链来编译awtk的呢
最近编辑记录 岁月快快快 (2022-03-20 20:34:57)
离线
我的工具链所带的glibc的iconv也是有问题的,估计这东西普遍不好用,而AWTK默认在linux平台使用iconv。好在AWTK有内置的实现字符编码转换的源码而不需要用iconv。
而修改为使用AWTK内置的替换iconv的源码的改法见我提的issue: https://github.com/zlgopen/awtk/issues/676#issuecomment-1057804433
diff --git a/src/charset/encoding.c b/src/charset/encoding.c
index 5ed79fdf7..884d52e7e 100644
--- a/src/charset/encoding.c
+++ b/src/charset/encoding.c
@@ -21,6 +21,8 @@
#include "encoding.h"
+#undef LINUX
+
#ifdef WIN32
#include "win_iconv.inc"
#define WITH_ICONV 1
另外,如果你不需要utf-8转GBK功能的话,可以改下编译配置以不编译awtk/src/charset/相关源文件(utf-8和GBK之间的转换没有规律,会包含一个很大的数组)。
最近编辑记录 海石生风 (2022-03-20 23:13:19)
离线
@海石生风
感谢大佬,example里面的demo已经可以成功编译运行了,但是如果编译我自己在界面设计器里面打包出来的demo,在板子上还是运行不了;
报错无法加载libawtk.so库:
# ./demo
/opt/releaseGif/bin/demo: can't load library 'libawtk.so'
# strings ./libawtk.so | grep -i glibc
GLIBCXX_3.4
_Znwj@@GLIBCXX_3.4
_Znaj@@GLIBCXX_3.4
_ZdaPv@@GLIBCXX_3.4
对比了example里面编译出来的libawtk.so的glibc库版本又是一样的;
可能是linux下面的界面设计器的问题?
安装的是AWStudio-Community-amd64-1.0.21.deb这个版本
最近编辑记录 岁月快快快 (2022-03-21 16:13:58)
离线
linux下面好像还是beta版本,看来只能手写或者在windows下弄了
离线
播放动画可以试试开源动画库lottie lvgl就支持 这是失量的 体积小 效果棒
离线
不知道直接用Qt5显示动图会不会好一点,还是说受制于处理器的性能
离线
我遇到了同样的问题,GIF有2.8MByte,播放的时候CPU占用率97%,6秒的GIF卡到10多秒才能播完。
最终排查出是文件系统缓存和编译优化的问题。
1.设置文件系统缓存,在lv_conf.h中
/*API for fopen, fread, etc*/
#define LV_USE_FS_STDIO 1
#if LV_USE_FS_STDIO
#define LV_FS_STDIO_LETTER 'A' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
#define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/
#define LV_FS_STDIO_CACHE_SIZE 1024 /*>0 to cache this number of bytes in lv_fs_read()*/
#endif
2.设置编译方式为Release,而非CMake脚本默认的Debug
set(CMAKE_BUILD_TYPE Release)
经过上面设置之后,可以正常显示gif,CPU占用率仍在90%
离线
感觉还有优化的空间
最近编辑记录 jianbi (2023-09-18 18:11:35)
离线