麒麟子

~~

导航

<2024年8月>
28293031123
45678910
11121314151617
18192021222324
25262728293031
1234567

统计

常用链接

留言簿(12)

随笔分类

随笔档案

Friends

WebSites

积分与排名

最新随笔

最新评论

阅读排行榜

评论排行榜

#

[导入]一个简单的线程管理方式。

文章来源: www.17173.com

周末,总是有点那么的无聊。闲来没事,想想每次自己要进行多线程编程时的痛苦,也并借机考虑设计了一个简单的线程管理方式。 

    没什么好说的,首先想想线程的创建,每次都要CreateThread,传递一堆的参数,还得没事查查MSDN,唉,效率低啊。反正,对于我来说,线程基本都是缺省优先级、缺省安全的。不如把这些一起封装了。

    不多说,C++不用对象机制用什么?顺便借鉴一下java。来个实际线程就是run,启动采用start。

class thread

{

public:

     thread( void );

     virtual ~thread( void );

 

     virtual void run() = 0;

 

     void start();

};

     这个也就是最基本的,基于对象的线程基类了。子类只需要实现run作为线程,调用start,就可以启动线程了。线程的所需参数,很简单,基于对象,有需要的,做为扩展类的成员变量——成员资源来访问。

    就这么简单?线程访问最大的问题——资源共享。那好,很容易想到互斥量。还有java的关键字synchronized,我们也就加一个锁的概念。

class thread

{

public:

     thread( void );

     virtual ~thread( void );

 

     virtual void run() = 0;

 

     void start();

 

     static void syncLock( void *res,bool lock );

};

    这样,在最基本的线程资源——HANDLE,就可以被管理了,资源的访问也可以通过lock和unlock来保护了。

    实际中,很多时候,我们希望能限制或知道有多少线程在运行,那么再加一个运行线程记数功能。大多时候,往往是采用线程池,而且会根据CPU数目,决定运行的线程数目。我们干脆,再提供一个功能,限制对象上可以允许同时运行的线程数目。那好,改为(同时加上一些保护和注解):

typedef unsigned int U32;

/**

 * 线程对象

 * 提供基于对象的线程处理接口

 */

class thread

{

public:

     /**

      * 线程基于对象的构造

      * para max 允许最多同时运行线程数

      */

     explicit thread( U32 max = -1 );

     virtual ~thread( void );

 

     /**

      * 启动一个线程

      * @return 启动成功否

      */

     bool start( void );

 

     /**

      * 对象上启动的线程数

      * @return 线程数

      */

     U32 count( void );

    

     /**

      * 线程执行函数

      * @return 无

      */

     virtual void run( void ) = 0;

 

     /**

      * 为对象加解锁

      * @return 无

      * @para res 要加解锁的资源对象

      * @para lock 加锁还是解锁

      */

     static void syncLock( void *res,bool lock );

 

private:

     thread( const thread &t );

     thread &operator=( const thread &t );

 

     void *m_datas;

};

    至于实现,我想不难。别忘了,对象销毁时要等待所有线程结束,并释放HANDLE资源哦。否则,线程会访问错误的内存,还有线程HANDLE被泄漏的。(千万别死锁了,自己实现时就因为资源锁来锁去,锁死了。)

    哈哈,就这么简单,一个简单的线程创建、管理就实现了。至于void *,你可以根据自己的实现去定义数据结构。

东西简单,也就不贴出cpp源码了,关键是个想到、做到的问题。

    头文件和lib,放在rar包吧,给大家一个实现后的参考。如果,发现有什么问题,可以随时和我联系。或者,您有更好的想法,并且愿意和我分享,那真是举目明月,尽展抒怀。假如,您对有些语法,比如explicit不明,那么,建议您先看看有关C++的语法或者找您周围的高手,让他们洗脑一番。:}

谢谢阅读,好就此打住。

配套程序下载:http://dev.gameres.com/Program/Other/thread.rar

来源:游戏梦网


文章来源:http://ly-weiwei.blog.163.com/blog/static/72975283200811282024276

posted @ 2008-12-28 14:00 麒麟子 阅读(132) | 评论 (0)编辑 收藏

[导入]程序员改编游戏向女友求婚

  

程序员改编游戏向女友求婚 - love.Leaf - 听雨阁

伯尼·彭是一名华裔金融软件程序设计员,由于其女友塔米·李平时最喜欢玩美国Popcap游戏公司出品的一款《Bejeweled》游戏,他便暗中修改程序,让玩家在游戏中累积到一定积分时,屏幕中会出现一枚戒指和一句求婚语。结果,当女友玩到这一积分时,她意外地看到了求婚语,然后答应了他。

  伯尼·彭将这段浪漫记忆写在自己的博客上,当他接受美国《纽瓦克明星纪事报》采访时,他觉得以这种方式求婚“略显书呆子气,但还算酷”。只是修改程序颇不容易,花了他整整一个月时间。

  这对情侣准备于今夏完婚,Popcap公司闻讯后,提出赠送两人飞往西雅图度蜜月的机票。公司一名发言人说:“多数游戏开发商不喜欢别人操纵他们的游戏程序……但这次修改为他赢得了一名女孩的心。作为编程人员,我们要对他说:‘伯尼,向你脱帽致敬!’”

  Popcap公司还打算向参加两人婚礼的宾客赠送《Bejeweled》游戏。


文章来源:http://ly-weiwei.blog.163.com/blog/static/729752832008112815439337

posted @ 2008-12-28 13:55 麒麟子 阅读(134) | 评论 (0)编辑 收藏

[导入]十个习惯让你精通新的开发技术

文章來源: www.17173.com

1. 要看书。在成千上万的编程图书中,可能很大一部分根本毫无用处。但是仍然有很多图书对你的(编程)能力有很大的提升。我一直坚持,相比在网络上查找很多有用信息,在同类图书中查找要来得更容易更快捷。阅读技术图书可心更好地抓住核心内容。对于理论,架构和设计等方面来说,图书也一样很有帮助。只不过要找到高质量的、权威的信息,就不如网络上可供查找的范围广。

  2. 读代码。这也是我很喜欢的一种方式。如果我并没有几年的专业编程工作经验,在学习之初我并不会去读很多复杂的代码。如果我要是早些开始学习,我将是一个比现在更好的程序员。但是,开始时我会从一些开源项目里,去学习那些源代码(当然,这些代码不能与我的工作有关,也不是我自己写的)。要从自己会使用到的,或者自己感兴趣的程序开始这项工作。我是从 Paint.net 这个网站里开始学习的,而且已经积累了很多关于 .NET 的编程技术。

  读别人的代码可以为你提供更多不同的工作思路,这比你完全凭自己思考得到的工作方式要多。

  3. 写代码。谨记,要写大量的代码。从根本上来讲,最好的学习方法就是实践。如果不写代码,你根本不能把(某种语言中)内在的东西学习透彻。学习之初,可以从一些技术指南和图书中照搬一些尽量简单的程序。当然,这种照搬是要自己完全手工输入,而不是复制和粘贴,这两种之间的效果差别是很大的。这种方法的主旨就在于,使知识内在化,并思考其用法,而不是盲目照抄。学习过程中,要时常查找新的 API 调用方法,这其实是简单的事情。

  最重要的是,要写一个你自己的程序,不管它是一个简单的游戏,或者是一个参与开源项目的程序,还是一个公为你自己使用的简单插件。用不同的方式来写程序,尽量尝试使用新的技术,新的技巧,新的设计方式。一定要让现在的项目比以往的项目更好。想要成一个优秀的开发者,这一点是核心。

  4. 与其他开发者交流。像 Apple,微软,Google 等大公司一样的新闻描述的一样,(与其他开发者交流)可以让你解决一些复杂的问题。虽然这并不能让你感觉到自己已经成一个团队或是社区的成员,但是这种方法可以让你接触到更多不同的想法。

  不同类型的项目要求不同的设计方法,代码技术,开发流程和设计思想。如果你工作在一个小团队里,你不必与太多的人接触,只要在用户群会议中找到一些人(来讨论)即可。如果这样还不行的话,参与到在线论坛中与其他人讨论(这时你需要更努力地寻找高质量的讨论内容)。

  6. 教会别人。相对于仅仅读代码之类的工作,教其他人学习可以让你更深入地学习某个技术,这种方法有着非凡的效果。教会别人某个技术,同样也会让你更专注于这种技术,并且可以比别人更深层次地理解它。同样你也会面对一些问题。

  “如果你不能向一个六岁的儿童解析清楚一个概念,那么其实是你并没有完全理解它。”Albert Einstein说。

  教学场景可以是无穷无尽的:与工作搭档一对一交流,休息碰面,非正式周会,学习茶会,教室,讨论发表会,等等。每周在相同理念开发者之间举办一次30分钟的非正式会议怎么样?每周,让几个人来就他们想要更深入了解话题,向大家传授这些技术知识,并且展开讨论。如果你知道你将要向团队成员们传授正学学习的知识,你是不是更想要了解这项技术的每个细节呢?

  6. 收听网络电台。如果你有空闲的时间,可以订阅网络电台节目。我现在最喜欢的编程节目就是 .Net Rocks。这个节目还会做一些视频节目,叫做 dnrTV 。这样会让你即时捕捉到最新最好的技术。一个人是不能学习到所有知识的,而网络电台刚是一个学习了解广泛知识的途径。

  7. 阅读博客。博客远远比阅读者要多,但是其中有一些却是极其优秀的。我这里不并不是要推荐博客,因为网络上已经有了足够多的博客。这是与真正在开发你所喜欢和使用的软件的开者联系的好方法。

  8. 学习新的语言。即使你已经在 C(++,#) / JAVA 等语言上有很好的造诣,仍然有很多其他可以解决问题的编程语言。学习新的语言,是对你已有思维方式的挑战。这不仅仅是另一种语言,更是对思维的重新架构。的确,所有的语言最后都会被编译成汇编程序,但是这并不意味着高级语言毫无价值。

  9. 学习不正确的方式。除了要学习应该怎么做,还要学习不应该怎么做。经常阅读 Dailywtf.com ,学习你并不知道的经验与教训。学习适当的面向对象设计方式,代码写作方式,和必须要写的代码等,是很好的方式,但是如果不细心的话也容易养成不良习惯。学习认识不正确的思路是负责项目开发至关重要的一环。

  维基百科对很多觉的不正确方式有十分透彻的分类。

  10. 要谦虚。

  学习,意味着用更好的知识代替不完美的知识,增长你所不知道的知识。只有承认自己有所不足,才能有学习的动力。归根到底,就是谦虚,不对吗?如果你开始认为你已经掌握了所有需要的知识,那么你就危险了。真正的学习是如饥似渴地追逐知识并使其内在化,这需要很大的努力。我们都知道这一点,但是要必须时常不断地提醒自己。


文章来源:http://ly-weiwei.blog.163.com/blog/static/729752832008112814833200

posted @ 2008-12-28 13:49 麒麟子 阅读(73) | 评论 (0)编辑 收藏

[导入]如何成为一名优秀的程序员?

文章來源: www.17173.com

程序员(英文Programmer)是从事程序开发、维护的专业人员。一般我们将程序员分为程序设计人员和程序编码员,但两者的界限并不非常清楚,特别是在中国。

    作一个真正合格的程序员,应该具有的素质。

    1:团队精神和协作能力 团队精神和协作能力是作为一个程序员应具备的最基本的素质。软件工程已经提了将近三十年了,当今的软件开发已经不是编程了,而是工程。独行侠可以写一些程序也能赚钱发财,但是进入研发团队,从事商业化和产品化的开发任务,就必须具备这种素质。可以毫不夸张的说这种素质是一个程序员乃至一个团队的安身立命之 本。

    2:文档习惯 文档是一个软件系统的生命力。一个公司的产品再好、技术含量再高,如果没有缺乏文档,知识就没有继承,公司还是一个来料加工的软件作坊。作为代码程序员,必须将30%的工作时间写用于技术文档。没有文档的程序员势必会被淘汰。

    3:规范化的代码编写习惯 知名软件公司的代码的变量命名、注释格式,甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定,良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同技术人员之间的协作。一些所谓的高手甚至叫嚣高手写的代码一般人看不懂,我只能说他不是一名合格的程序员。

    4:需求理解能力 程序员要能正确理解任务单中描述的需求。在这里要明确一点,程序员不仅仅要注意到软件的功能需求,还应注意软件的性能需求,要能正确评估自己的模块对整个项目中的影响及潜在的威胁,如果有着两到三年项目经验的熟练程序员对这一点没有体会的话,只能说明他或许是认真工作过,但是没有用心工作。

    5:模块化思维能力 作为一个优秀的程序员,他的思想不能在局限当前的工作任务里面,要想想看自己写的模块是否可以脱离当前系统存在,通过简单的封装在其他系统中或其他模块中直接使用。这样做可以使代码能重复利用,减少重复的劳动,也能是系统结构越趋合理。模块化思维能力的提高是一个程序员的技术水平提高的一项重要指标。

    6:测试习惯 测试是软件工程质量保证的重要环节,但是测试不仅仅是测试工程师的工作,而是每个程序员的一种基本职责。程序员要认识测试不仅是正常的程序调试,而要是要进行有目的有针对性的异常调用测试,这一点要结合需求理解能力。

    7:学习和总结的能力 程序员是很容易被淘汰的职业,所以要善于学习总结。许多程序员喜欢盲目追求一些编码的小技巧,这样的技术人员无论学了多少语言,代码写起来多熟练,我们只能说他是一名熟练的代码民工,他永远都不会有质的提高。一个善于学习的程序员会经常总结自己的技术水平,对自己的技术层面要有良好的定位,这样才能有目的 地提高自己。这样才能逐步提高,从程序员升级为软件设计师、系统分析员。

  作为高级程序员,乃至于设计师而言,除了应该具备上述全部素质之外,还需要具备以下素质:1、 需求分析能力2、 整体框架能力3、 流程处理能力4、 模块分解能力5、 整体项目评估能力6、 团队组织管理能力1,激情。

  我曾经遇到许多“职业程序员”,他们从事IT是因为觉得这是一种职业,他们只在工作时间编程,除非送去培训否则他们不会学习新东西,这不是好的程序员。我认为一个好的程序员总是对编程充满激情,而且好的开发者会做一些编程工作即使这没有报酬。激情是一个优秀程序员的重要指标。2,自学好学

  编程领域始终发展变化着,不出一年有些新技术就变成了老技术,这并不是说好的程序员要对所有新技术跟进,但有些却对学习任何新技术都没有兴趣。他们通常在学校学习了编程,然后工作后单位安排学什么就学什么。如果在招聘中你听到“让我培训一个星期我就会胜任这个工作”那不要雇佣他。实际上,真正优秀的程序员 始终谈论着你所不知道的新技术,向人们解释为什么你必须用这个技术,哪怕没有听众听得明白,哪怕他自己也不明白。3,聪明

  聪明包括很多因素,情绪和社会交际只是其中之一。好的程序员绝不木讷,他们是最聪明的人,他们中的许多善于交际,健谈、兴趣广泛。4,隐性的经验

  —好的程序员通常有自己的私人的一些研究、爱好、项目,而这些是他们不写在简历上(通常觉得不值得写),但表现出来却可能恰恰是他的潜能、深度和后劲所在。5,技术多样性

  由于好的程序员喜欢学习和涉猎新技术,所以一般来说超过22岁的都熟知很多新技术,而且对多种技术的长短有“强烈”的个人意见/见解,喜好尝试新鲜技术。6,资格证书

  资格证书并不是识别真正程序员的方法,MCSE、SCJP说明不了什么,它们只是让别人认识和获取的,顶多代表这个人在某个技术有一定的知识。原文作者在文末写道:以上所说的标准并不是绝对的,因为有些优秀的程序员确实不符合上述,而有些bad程序员却符合了。但相信这些对大多数真正的程序员都适用。


文章来源:http://ly-weiwei.blog.163.com/blog/static/729752832008112814218104

posted @ 2008-12-28 13:42 麒麟子 阅读(137) | 评论 (0)编辑 收藏

[导入]让你彻底明白什么叫游戏引擎(5)

引擎的明天(2001年~)

    2001年有许多优秀的3D射击游戏陆续发布,其中一部分采用的是Quake III和Unreal Tournament等现成引擎,如《星际迷航深度空间九:坠落》、《重返德军总部》和《荣誉勋章:盟军进攻》,而更多的则采用的是自己开发的引擎,比较有代表性的包括网络射击游戏《部落2》(Tribes 2)、第一人称射击游戏《马科斯·佩恩》、《红色派系》(Red Faction)和《英雄萨姆》等。

    《部落2》采用的是V12引擎,这款引擎虽然无法同Quake III和Unreal Tournament相提并论,但开发者为它制定的许可模式却相当新颖,你只需花上100美元就可以获得引擎的使用权,不过天下没有免费的午餐,随之而来的一系列规定相当苛刻,例如,开发者不能把该引擎用于为其它游戏发行商、其它商业游戏站点等竞争对手制作游戏,开发出来的游戏必须在发行前交给GarageGames公司(V12引擎的所有者),不能交给任何第三方,GarageGames公司将拥有这些游戏五年的独家发行权等等。尽管如此,对于那些规模较小的独立开发者来说,这个超低价引擎仍然具有非常大的吸引力。

    《马科斯·佩恩》采用的是MAX-FX引擎,这是第一款支持辐射光影渲染技术(Radiosity Lighting)的引擎,这种技术以往只在一些高级的建筑设计软件中出现过,它能够结合物体表面的所有光源效果,根据材质的物理属性及其几何特性,准确地计算出每个点的折射率和反射率,让光线以更自然的方式传播过去,为物体营造出十分逼真的光影效果。MAX-FX引擎的另一个特点是所谓的“子弹时间”(Bullet Time),这是一种《黑客帝国》风格的慢动镜头,在这种状态下甚至连子弹的飞行轨迹都可以看得一清二楚。MAX-FX引擎的问世把游戏的视觉效果推向了一个新的高峰。

    《红色派系》采用的是Geo-Mod引擎,这是第一款可任意改变几何体形状的3D引擎,也就是说,你可以使用武器在墙壁、建筑物或任何坚固的物体上炸开一个缺口,穿墙而过,或者在平地上炸出一个弹坑躲进去。Geo-Mod引擎的另一个特点是高超的人工智能,敌人不仅仅是在看见同伴的尸体或听见爆炸声后才会做出反应,当他们发现你留在周围物体上的痕迹如弹孔时也会警觉起来,他们懂得远离那些可能对自己造成伤害而自己又无法做出还击的场合,受伤的.


文章来源:http://ly-weiwei.blog.163.com/blog/static/729752832008112813341616

posted @ 2008-12-28 13:34 麒麟子 阅读(117) | 评论 (0)编辑 收藏

仅列出标题
共38页: First 28 29 30 31 32 33 34 35 36 Last