分享我的项目源码
首先,感谢那些从事开源项目开发的程序员们,让我在纠结该如何解决某些问题的时候,有可参考的学习资料;
其次,感谢在网上发表自己的技术文章的网友们,你们分享的知识,让我受益匪浅。
最后,感谢在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;}
[解决办法]
确实不错···
[解决办法]
(善)
[解决办法]
不错,顶下。
[解决办法]
看看下,多了解了解
[解决办法]
果然不错噢
[解决办法]
好多的资料无从找起,即使找到啦也很多自己不想要的东西,老师不讲,看视屏,看书去。
[解决办法]
很好很强大
[解决办法]
有时加LCUI,有时不加,还好意思说。
Title_Bar也太难看了,我的原则是能用小写,绝不用大写。
[解决办法]
大一就这么牛了,佩服~
[解决办法]
关于运行卡的问题,先定位主要运算量在哪?
比较明显的可能有两处:一是窗口刷新算法(最小刷新区域),二是浮点运算(可用定点数代替)。
[解决办法]
厉害 太厉害了
[解决办法]
你的学习机是什么CPU?320*240的屏幕刷新运算量不算大,里面没有重复拷贝吧?
[解决办法]
“移动起来都能看到有边缘闪烁现象”
============================
双缓冲可以解决闪烁问题。
使用了图形旋转算法,可是,这个程序在学习机端跑很卡。
=============================================
图像旋转用了浮点运算的话,改用定点运算来优化。
[解决办法]
强悍!以后最好能写个编译器,突破一下空白。
[解决办法]
很强大,膜拜下@@@
[解决办法]
不知道图形输出的原理是什么,很想知道额
另外如果想其他人使用基于GPL协议的开源代码的话,代码本身的挑战不是一般的大啊
还不如直接基于公共领域协议发布,那样感兴趣的估计很很多
[解决办法]
什么大学大一就可以开汇编啦,羡慕啊
[解决办法]
大一的孩子。。。这么牛逼!有前途!
[解决办法]
刚学C的小白进来膜拜下
[解决办法]
楼主很强大,收藏此帖。无奈系统是windows,唉。。。
[解决办法]
学习了,好东西要收藏,谢谢
[解决办法]
楼主太强大了!!想当初我大一时C++是何物都不知道,更不用说写出这个水平的代码了~
[解决办法]
饿,想想我大一在干嘛啊。。。。。。。。。。。。。。。。。。。。。。。。。
支持楼主,继续优化,扩展!
[解决办法]
我也来凑凑热闹,呵呵
关于
4,如何实现多进程通信?
>>
我觉得可以使用 管道,匿名管道和命名管道均可,
但是一般这种情况都使用 命名管道(Named Pipe),
其实我也不太熟悉,楼主可以上网查一些资料。。
呵呵,,
等待牛人解答其他问题。。。。
[解决办法]
new N_B()
[解决办法]
看上去真不错啊,挺有前途呢。 想想自己上学时都主要学专业了,没搞编程,现在才起步。 努力~
[解决办法]