首先,感谢那些从事开源项目开发的程序员们,让我在纠结该如何解决某些问题的时候,有可参考的学习资料;
其次,感谢在网上发表自己的技术文章的网友们,你们分享的知识,让我受益匪浅。
最后,感谢在CSDN论坛上活跃的同志们,你们对我的帮助也非常大。
发这个帖子不是只为了宣传自己的项目,而主要是为了进行编程技术交流,一个人的力量是有限的,所掌握的知识也是有限的,因此,想与大家交流一下,开源的目的也就是这个。
由于开发这个项目之初是为了用于嵌入式,也是就让它能在手机之类的设备上跑,因此,在CPU性能和内存容量有限的环境下,我想尽可能的提高代码的执行效率、减少不必要的内存开销,毕竟,在电脑上跑得流畅并不能代表在嵌入式设备上也跑得流畅。
你就把这帖当成某新手贴了源代码并要求改错的提问帖,只不过内容稍多而已。
先描述我想求助的几个问题:
1,该怎样为函数命名?
我写的函数,命名风格不统一,有时在前面加个LCUI,有时闲名称太长没加LCUI,我是这样命名函数的:
Test_Func()
单词开头字母都大写,下划线分隔单词。
全写成小写字母的话,看起来很不显眼;而改成TestFunc这样连起来的话,名字短没事,长的话,看起来很费劲了,并且感觉很乱,字母时大时小。
有时是操作+对象,有时是类+操作(个人理解,有错误请纠正),也就是Test_Func()和Func_Test()这样。
而有时也纠结该是用类似于TitleBar还是用Title_Bar这样的命名。
有的函数的命名有点怪异,毕竟我的英语不是很好,有的名字是我借助谷歌翻译稍加修改而成,希望各位能将这些怪异的函数名纠正。
另外,我有个想法:
弄若干个结构体,每个结构体中储存一类函数的函数指针,然后,定义若干个结构体变量,使用函数时就可以类似于这样:
string.copy(des_str, src_str);
memory.set(str, 0, sizeof(str));
2,如何提升图形处理和图形显示效率?
我的LCUI实现出来的界面,感觉还是没Ubuntu的系统界面那么流畅,尤其是Ubuntu的3D旋转桌面特效,全屏刷新都非常流畅,而我的LCUI实现的320x240的窗口,移动起来都能看到有边缘闪烁现象。虽然之前考虑用DirctFB,但是看到它的那一堆函数+英文说明,我觉得我还是暂时不要管它。。。
而在学习机上测试,发现处理旋转图形并显示的速度非常慢,大约1帧/秒。
(这是之前的测试结果,最近修改了一些拖慢程序效率的代码,还未进行测试。)
当然,LCUI不是全屏刷新显示图形界面的,而是局部刷新屏幕内需要进行刷新的区域。
对于局部刷新的优化,我想出了一个新的局部刷新方案:
将屏幕分成若干个小矩形,也就是为了实现脏矩形技术。
在对部件进行图形更新的时候,使用新的一套图形处理函数,也就是多了一个部件指针作为参数,在对图形进行剪切、混合、旋转等处理时,一边复制像素点一边对比该像素点与之前的像素点是否一致,不一致的话,就标记包含这个像素点(取屏幕绝对坐标)的脏矩形为"需要刷新";在添加局部刷新区域的时候,会检测该区域内包含的脏矩形,如果脏矩形"需要刷新",则添加到矩形刷新队列中,并重置标记为"无需刷新",之后再根据该队列中记录的矩形区域对屏幕内容进行更新;这样,增加了部件的图形处理的耗时,减少了需要刷新的区域面积以及局部刷新的耗时。
不知大家对此是否有什么意见。
3,如何减少程序占用的内存空间?
话说,程序运行时,系统是不是会将它所依赖的动态库也载入进内存?
LCUI依赖了freetype,png,jpeg,pthread等库,粗略的计算了一下,总大小不低于4.5MB;
在学习机上跑测试程序,程序一运行就退出了,难道是由于内存不足?
电脑上写了个测试程序,用于显示进程占用内存的情况,结果是,一个LCUI程序,运行时至少占用6.3MB左右的内存,学习机的总内存为60MB,平常可用内存为5MB左右,因为自带的图形界面也要占内存。上个版本的LCUI,在学习机上都能跑,载入1500x2000的图片都没问题,现在连简单的跑都跑不了。
(这是之前的测试结果,不知是因为内存不足还是因为某个处理异常而退出程序。)
4,如何实现多进程通信?
虽然之前问过几次,但是考虑以后的发展,现在还是想问一下,我的LCUI目前是使用线程,本打算写个"桌面",作为其它LCUI程序的运行平台,其它程序由"桌面"以子线程运行,利用线程间能内存空间共享的特性,来实现对各个程序的图形界面的统一管理与绘制。
可是有个弊端,一旦有个线程出现错误,会导致整个"桌面"被系统终止运行。希望有大侠提供相关技术支持。
5,如何实现音频输出?
考虑到以后的游戏以及其它需要用到音频输出的软件的开发,需要实现音频的解码,以及对音频输出设备的操作,虽然madplay的源码比mplayer的小,但还是比较难看明白的,有相关经验的大侠请分享一下经验。
以上是我想求助的问题。
我的项目主页:
lcui.sourceforge.net (建设中)
项目相关信息页面:
sourceforge.net/projects/lcui/
我的电子邮箱:lc-soft@live.cn
网站是在sourceforge.net提供的免费空间里搭建的,以后会继续完善网站,我对网页的要求就是能通过w3c验证,没有任何错误和警告,这是我的习惯,对于C代码也是,gcc在开启显示所有警告和错误的情况下,不能出现任何警告和错误。
但是,css却有一大堆警告和错误,以后有空再来纠正。
如果觉得我的这个项目中有的代码可以优化,或者有什么好的建议和想法,请通过以上任意方式告诉我,也可以参与LCUI的开发,为LCUI贡献优质代码。
之前就决定在5月1日发布,可是到了发布前一段时间,我发现 照片查看器 的运行效果不怎么满意,本打算是将 照片查看器 的源码附在项目源码中一同发布,可是,由于时间紧迫,只好等到后续版本的更新在加入进去。
发布这个项目的源码后,打算休息一段时间,放松一下。
先放出Hello World的源代码:
#include <LCUI_Build.h> /* 包含LCUI的头文件 */
#include <unistd.h>
int main(int argc, char*argv[])
/* 主函数,程序的入口 */
{
LCUI_Init(argc, argv);
LCUI_Widget *window, *label;
LCUI_Graph pic;
/* 初始化结构体 */
Graph_Init(&pic);
/* 载入库中自带的图形数据,这个图形是18x18尺寸的LCUI的图标 */
Load_Graph_Icon_LCUI_18x18(&pic);
/* 创建部件 */
window = Create_Widget("window");
label = Create_Widget("label");
/* 设定窗口标题的文本 */
Set_Window_Title_Text(window, "测试窗口");
/* 设定窗口标题的图标 */
Set_Window_Title_Icon(window, &pic);
/* 改变窗口的尺寸 */
Resize_Widget(window, Size(320, 240));
/* 将窗口客户区作为label部件的容器添加进去 */
Window_Client_Area_Add(window, label);
/* 居中显示 */
Set_Widget_Align(label, ALIGN_MIDDLE_CENTER, 0, 0);
/*
* 设定label部件显示的文本
* <color=R,G,B>文字</color> 表示的是:“文字”将使用自定义颜色
* Set_Label_Text函数使用方法和sprintf函数基本一样,支持控制符
**/
Set_Label_Text(label,
"Hello World!\n"
"<color=255,0,0>世</color>"
"<color=100,155,0>界</color>"
"<color=0,255,0>你</color>"
"<color=0,100,155>好</color>"
"<color=0,0,255>!</color>\n");
/*
* 改变label部件的字体大小,单位为pixel(像素),不是pt(点数)
* 第三个参数是自定义使用的字体文件,我设定为NULL,表示不使用。
**/
Set_Label_Font(label, 24, NULL);
/* 显示部件 */
Show_Widget(label);
Show_Widget(window);
LCUI_Main(); /* 进入主循环 */
return 0;
}
效果图:
还有其它测试程序的效果截图:
这个是进度条的效果:
label部件:
时钟:
之前写了个启动界面,有动画,如下图所示:
中间一个圈,里面是字母LC,LC也就是我名字的缩写。
下面那个雪花动画,和QQ2012登录时显示的动画一样,其实就是用了QQ安装目录里的图片。
想弄成环形波浪动画,从中间的LC圆圈标志扩散到四周,可是,涉及到圆形的绘制,有点难度。。。
后来,启动动画经过修改,现在的效果如下图所示:
动画改成旋转中的绿圈,围绕LC标志旋转,使用了图形旋转算法,可是,这个程序在学习机端跑很卡。
重点就在这里了,LCUI的下载链接:
sourceforge.net:
sourceforge.net/projects/lcui/files/
CSDN资源:
download.csdn.net/download/liuchao35758600/4268636