分享我的项目源码

灼眼的超哥 2012-05-01 09:54:15
加精
首先,感谢那些从事开源项目开发的程序员们,让我在纠结该如何解决某些问题的时候,有可参考的学习资料;
其次,感谢在网上发表自己的技术文章的网友们,你们分享的知识,让我受益匪浅。
最后,感谢在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
...全文
16392 148 打赏 收藏 转发到动态 举报
写回复
用AI写文章
148 条回复
切换为时间正序
请发表友善的回复…
发表回复
hu15651998316 2014-10-10
  • 打赏
  • 举报
回复
你的链接能打开吗?
huzi741 2014-09-25
  • 打赏
  • 举报
回复
相当不错的资源
zazyl 2014-09-08
  • 打赏
  • 举报
回复
很强大,谢谢lz分享
-Chamgin 2014-01-17
  • 打赏
  • 举报
回复
是一个图形库吗
aiyaya730 2013-11-20
  • 打赏
  • 举报
回复
引用 176 楼 korekara88730 的回复:
相当不错!LZ刚大三,真厉害! 另外,请问,搂主所用的图像引擎,是LCUI吗? 这个东西可以跨平台绘图?
我收回我的问题。。 我发现LZ相当厉害, LCUI 原来是LZ 自己写的图形库。 NB !
aiyaya730 2013-11-20
  • 打赏
  • 举报
回复
相当不错!LZ刚大三,真厉害! 另外,请问,搂主所用的图像引擎,是LCUI吗? 这个东西可以跨平台绘图?
tangle523 2013-09-26
  • 打赏
  • 举报
回复
先回复一下,有问题再问。顺便给lz涨涨经验
u010691153 2013-05-14
  • 打赏
  • 举报
回复
支持一下
洛川子 2013-05-05
  • 打赏
  • 举报
回复
威武啊。。我也来看看
上官风逸 2013-05-04
  • 打赏
  • 举报
回复
菜鸟路过,希望楼主早点解决问题。膜拜一下!
xiaomuzilyc 2013-04-07
  • 打赏
  • 举报
回复
Safety_杜 2013-04-02
  • 打赏
  • 举报
回复
对我很有帮助
DuoXingQiTiEX 2013-02-26
  • 打赏
  • 举报
回复
很牛 但是网页为何打不开
Jaguar_Yuan 2013-02-22
  • 打赏
  • 举报
回复
这孩子真不错
地平线站长 2012-08-03
  • 打赏
  • 举报
回复
垃圾,怎么给你页面都打不开呀
x805263308 2012-08-01
  • 打赏
  • 举报
回复
mark,以前只懂的皮毛,工作了才发现很多东西都要深入的学
minibeargui 2012-06-16
  • 打赏
  • 举报
回复
关于脏矩形算法提一点我的心得给lz:

1.渲染单元(窗口)组织成层级树。
2.父层级单元的脏矩形由其子单元脏矩形合并所得。
3.在需要重绘的渲染单元中计算需要重绘的最小矩形区域(脏矩形)
4.合并所有脏矩形作为最终的重绘区域
5.渲染前计算渲染树,剔除不需要渲染的单元,设置需要渲染的单元的最小绘制矩形区域
6.在底层渲染函数中使用此最小矩形区域作为参数,来绘制重绘的地方。
灼眼的超哥 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 162 楼 的回复:]

1)是不是5个区域不重要(可能会超过5个,也可能合并的更少),但一定不要有重叠的。因为脏缓冲影响的不仅仅是最终显示的过程(这个过程实际上不会占用多少,所以我才用GDI),他更多是影响了渲染运算;
2)FrameBuffer不一定是内存,在我的程序中FrameBuffer在哪里完全是用户决定的;这主要原因是某些嵌入平台因为支持硬件的Double Buffer,考虑到为了节约空间,空间直接使用硬件……
[/Quote]
1)每次添加区域的时候,如果这个区域与已记录的区域有重叠,就会对这个区域进行裁剪,把重叠的区域裁剪掉,留下不重叠的区域。
2)对FrameBuffer的操作基本上只是单向的?
是只往里写吗?我也是将FrameBuffer只用于写。
「已注销」 2012-06-05
  • 打赏
  • 举报
回复
1)是不是5个区域不重要(可能会超过5个,也可能合并的更少),但一定不要有重叠的。因为脏缓冲影响的不仅仅是最终显示的过程(这个过程实际上不会占用多少,所以我才用GDI),他更多是影响了渲染运算;
2)FrameBuffer不一定是内存,在我的程序中FrameBuffer在哪里完全是用户决定的;这主要原因是某些嵌入平台因为支持硬件的Double Buffer,考虑到为了节约空间,空间直接使用硬件提供的显示缓冲区;这样就会带来问题:在多数情况下,读写硬件显示缓冲的速度会比较慢,因此,原则上尽量减少对FrameBuffer的操作,及除透明色外,对FrameBuffer的操作基本上只是单向的 ----- 跨平台上的效能考虑
灼眼的超哥 2012-06-04
  • 打赏
  • 举报
回复
[Quote=引用 160 楼 的回复:]

引用 159 楼 的回复:

1)脏矩形的核心算法是减少刷新区域,因此合理标识改变区域和避免重叠很重要;
2)那些区域改变切记不要试图通过读取显示缓冲区确认这个颜色是否有变:读取显示缓冲同样是对显示区域的一次操作,和直接写像素没有什么差别,尤其在某些嵌入平台上 ---- 同样影响效能;
3)每次刷新的基本单位我们可以假定是一个Object(如矢量的圆,线),通过判定Object的外包围……
[/Quote]
将4个重叠的区域处理成5个不重叠的区域
并不一定要处理成5个不重叠的区域,只要是总面积一样,各个区域不重叠,处理出的区域稍微多点也是可以的。
加载更多回复(128)
地方订餐外卖网站系统 2015 2016 最赚钱的项目,帮您打造本地商业门户,机遇不可错过。网上订餐系统_网络订餐系统_外卖网站建设.订餐网,外卖网源码,带积分商城,商家系统,外卖网站建设! 系统特点: 周密策划、项目为先 "项目指导技术,技术服从项目",这是我们一贯秉承的原则,也是我们与其他系统开发商、网站建设公司的本质区别所在!我们的每个系统作品都要经过周密的市场分析调查、可行性研究、项目策划,对我们来说项目的可行性高于一切! 功能专业、布局严谨 以项目方案为蓝本,以现有成功地方网站为局部参考,并充分结合地方性网站的特点与商业模式进行功能规划。系统以八大主要功能模块与诸多 实用辅助模块组成,专业、强大、实用、易用。在布局上科学严谨,给用户以完美影像! 顶尖设计、赏心悦目 深知“面子”在网站中举足轻重位置,本系统由多名资深网页设计师联合设计,所有页面均经过布局策划-页面与UI设计-美术设计三大环节,结构布局清晰、界面大气美观、干净整洁,并注重每个细节的用户体验。让您的网站在用户面前眼前一亮! 饿了么源码网络外卖订餐系统致力于帮助专业从事餐饮外卖企业或有外卖业务的餐饮企业快速部署外卖订餐系统,拓展网络外卖订餐业务。简洁大方的界面、精准的楼宇定位系统、强大的菜单管理系统,人性化的订单处理系统等等,不仅能够帮助您提升企业形象、还为您提供了一套完整的网络外卖解决方案,配合适当的宣传方式可以获得实实在在的销量和用户黏度的提升。 都来订网络外卖订餐系统区别于同类软件产品的独特性表现在: 1、 简洁大方的界面 简洁的界面,简便的操作,全面提升企业形象,带给您全新的体验。 2、 精准的楼宇定位系统 配送范围、配送价格、配送时间随需变化。 3、 强大的菜单管理系统 单品、套餐均适用,图片展示更直观。 4、 人性化的订单处理系统 订单提示、处理、打印、对账,一站式完成。 5、 快捷流畅的订餐流程 定位→选餐→下单→结算,保证订单准确无误。 6、 及时发布公告信息 将营业状态和促销信息第一时间发布到网站。 都来订网络外卖订餐系统V1.8.6更新内容简介: 1、提高首页点餐速度;

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧