首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

分享小弟我的项目源码

2012-05-07 
分享我的项目源码首先,感谢那些从事开源项目开发的程序员们,让我在纠结该如何解决某些问题的时候,有可参考

分享我的项目源码
首先,感谢那些从事开源项目开发的程序员们,让我在纠结该如何解决某些问题的时候,有可参考的学习资料;
其次,感谢在网上发表自己的技术文章的网友们,你们分享的知识,让我受益匪浅。
最后,感谢在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的源代码:

C/C++ code
#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

[解决办法]
支持一下
想我当年大一的时候还是啥都不会。。。lz很给力!
[解决办法]
不错,标记。。。。
[解决办法]
又一个小霸王天才,膜拜了。
[解决办法]
拜服!!
[解决办法]
探讨

又一个小霸王天才,膜拜了。

[解决办法]
探讨
???LCUI是什么?
LC就是我的名字拼音LiuChao的首字母,UI即User Interface(用户界面)的简称,这个名字只是暂定的,在以后可能会更改;它是一个图形界面库,可为程序的图形界面的实现提供简单的支持。



不是已经有了GTK、Qt等开源项目吗?你这不是在重复发明轮子么?闲着蛋疼?
LCUI只是我在学习C语言的过程中用于实践的项目,也就是练手的项目,由于这个项目的功……

[解决办法]
支持!
[解决办法]
楼主很强大了,pf
[解决办法]
LZ强大
[解决办法]
膜拜了
[解决办法]
Codejock.Xtreme.Suite.Pro.ActiveX

[解决办法]
支持~~
[解决办法]
支持!
[解决办法]
强大·······
[解决办法]
果然牛逼!!
[解决办法]
大一就这么强大?!人的差别怎么就这么大呢?

[解决办法]
支持,大一就做这样的程序很不错!
[解决办法]
已经很不错了,支持楼主~~
[解决办法]
已经很不错了,支持楼主~~
[解决办法]
顶一个,lz强悍~
[解决办法]
佩服!
[解决办法]
nb,确实不错
[解决办法]
楼主NB!
[解决办法]
高手支持一下。
[解决办法]
感谢楼主分享!
[解决办法]
前排支持下,顺便分享一个自己的网站http://yanyu.longluntan.org


[解决办法]
确实不错···
[解决办法]
(善)
[解决办法]
不错,顶下。
[解决办法]
看看下,多了解了解
[解决办法]
果然不错噢
[解决办法]
好多的资料无从找起,即使找到啦也很多自己不想要的东西,老师不讲,看视屏,看书去。
[解决办法]
很好很强大
[解决办法]
有时加LCUI,有时不加,还好意思说。
Title_Bar也太难看了,我的原则是能用小写,绝不用大写。
[解决办法]
大一就这么牛了,佩服~
[解决办法]
关于运行卡的问题,先定位主要运算量在哪?

比较明显的可能有两处:一是窗口刷新算法(最小刷新区域),二是浮点运算(可用定点数代替)。
[解决办法]
厉害 太厉害了
[解决办法]
你的学习机是什么CPU?320*240的屏幕刷新运算量不算大,里面没有重复拷贝吧?
[解决办法]
“移动起来都能看到有边缘闪烁现象”
============================
双缓冲可以解决闪烁问题。

使用了图形旋转算法,可是,这个程序在学习机端跑很卡。
=============================================
图像旋转用了浮点运算的话,改用定点运算来优化。
[解决办法]
强悍!以后最好能写个编译器,突破一下空白。
[解决办法]
很强大,膜拜下@@@
[解决办法]
不知道图形输出的原理是什么,很想知道额

另外如果想其他人使用基于GPL协议的开源代码的话,代码本身的挑战不是一般的大啊

还不如直接基于公共领域协议发布,那样感兴趣的估计很很多
[解决办法]
什么大学大一就可以开汇编啦,羡慕啊
[解决办法]
大一的孩子。。。这么牛逼!有前途!
[解决办法]
刚学C的小白进来膜拜下
[解决办法]
楼主很强大,收藏此帖。无奈系统是windows,唉。。。
[解决办法]
学习了,好东西要收藏,谢谢
[解决办法]
楼主太强大了!!想当初我大一时C++是何物都不知道,更不用说写出这个水平的代码了~
[解决办法]
饿,想想我大一在干嘛啊。。。。。。。。。。。。。。。。。。。。。。。。。
支持楼主,继续优化,扩展!
[解决办法]
我也来凑凑热闹,呵呵
关于
4,如何实现多进程通信?
>>
我觉得可以使用 管道,匿名管道和命名管道均可,
但是一般这种情况都使用 命名管道(Named Pipe),
其实我也不太熟悉,楼主可以上网查一些资料。。
呵呵,,

等待牛人解答其他问题。。。。

[解决办法]
new N_B()
[解决办法]
看上去真不错啊,挺有前途呢。 想想自己上学时都主要学专业了,没搞编程,现在才起步。 努力~
[解决办法]

探讨
引用:

我也来凑凑热闹,呵呵
关于
4,如何实现多进程通信?
>>


我觉得可以使用 管道,匿名管道和命名管道均可,
但是一般这种情况都使用 命名管道(Named Pipe),
其实我也不太熟悉,楼主可以上网查一些资料。。
呵呵,,

等待牛人解答其他问题。。。。

谢谢,我觉得我还是应该阅读相关资料,补充知识。

热点排行