平民程序 - linghuye's blog

天下风云出我辈,一入江湖岁月催。皇图霸业谈笑中,不胜人生一场醉。提剑跨骑挥鬼雨,白骨如山鸟惊飞。尘事如潮人如水,只笑江湖几人回。

随笔 - 221, 文章 - 0, 评论 - 680, 引用 - 0
数据加载中……

韩愈 送孟东野序 起首段

大凡物不得其平则鸣:草木之无声,风挠之鸣。水之无声,风荡之鸣。其跃也,或激之;其趋也,或梗之;其沸也,或炙之。金石之无声,或击之鸣。人之于言也亦然:有不得已者而后言,其歌也有思,其哭也有怀。凡出乎口而为声者,其皆有弗平者乎!


痛快!一个文学家如何能写出好作品,一定要胸有不平.一个程序员如何能不懈地提高自身的能力,如何能获得驱使自身不断学习的动力,也一定要常怀不平之气!

posted @ 2008-08-07 19:48 linghuye 阅读(1367) | 评论 (2)编辑 收藏

WoW Physics in Havok




1.这是魔兽世界莫高雷在Havok物理世界调试器中的建模,使用的是魔兽的地形高度图数据和模型物理PolygonSoup数据,黄色胶囊表示运动的人物.
2.物理引擎有个大问题,难以稳定,一个数值的错误很可能导致整个物理世界的崩溃.按持续性物理的原则,帧率的变化会影响物理世界的稳定,我相信这对游戏程序调试会造成很大的困难.
3.在图中规模的世界场景中,实际场景渲染时,Havok引擎在我的E6300 Intel双核CPU上运作十分地流畅,几乎没有没有降低原来的渲染帧率.当然MMORPG的碰撞规模是非常少的,仅仅是人物对世界静态场景的碰撞,至多推几个箱子而已,但是要求的碰撞和碰撞反应逻辑是非常高的,不能是小儿科的,没有实用价值的,拿几个箱子啊,圆球啊,凸面体等的演示,只有像魔兽世界这样完全不规则的模型才测试得出一个物理引擎的效率和稳定性.
4.Havok支持物理模型的Scale,Phyx目前没有这个非常关键的特性.
5.我个人认为,总的说来,当前,不管Havok还是Phyx在都不是一般的难用(至少不如图形API简易好用).对这些基于动力学的物理引擎而言,他们过于死板,过于遵守物理定律,过于霸道.当我需要一些不符合物理学的运动和物体时(比如瞬间改变物体的速度,改变人物在跳跃时的空中轨迹),要绕过或骗过引擎是非常困难的,这通常使引擎变得不稳定.其实我需要实现的不过是人物行走在全3D环境中而已,我要的不是真实的物理世界,而在Havok引擎里实现这么简单的东西需要绕很多弯,基本上要把整个物理引擎的每个概念都要学过一遍,这是物理引擎不成熟的表现.
6.另外,Havok的Demo框架完全是Havok写Demo的程序员偷懒的结果,因为有框架,他们可以简易地写出多个Demo逻辑,但我不需要他们的这些繁杂甚至实现诡异的Demo框架,我不希望去理解这些自以为精妙的框架.因为实际应用中我有我的框架,公司有公司的框架,没有人会为了一个物理引擎去把自己的框架都换掉.程序框架更多程度上是一种卖弄似的垃圾. 我需要简单的独立的Demo,不要基于任何其他第3方的东西,能够让我迅速理解调用运作流程和每个API的简单作用.而Havok的文档完全是程序员在写代码时的注释,不够详细,缺少很多必要的说明.所以在遇到问题时,不要指望文档,唯一的方法是去看复杂的Demo的代码,去猜Demo的代码到底是什么意思,去对比自己的实现哪里跟Demo程序不符.
7.目前,我个人的实践感受上,Havok要比Phyx好得多。Phyx有几个我非常讨厌的限制,PolygonSoup数据需要被预处理(Cooked),不支持Scale变换,CharacterController不够灵活.

Reference:
http://softwarecommunity.intel.com/isn/Community/en-US/forums/2508/ShowForum.aspx

posted @ 2008-08-06 22:00 linghuye 阅读(3809) | 评论 (19)编辑 收藏

Havok物理引擎学习笔记

1.Every Havok simulation can have one or more Havok worlds - instances of the class hkpWorld. The hkpWorld acts as a container for the physical objects in your simulation, and is also used to step the simulation forward in time.

2.当前Havok5.5版本,因为需要对应的Debug版本的动态运行库的manifest,当前Havok5.5版本必须使用Vs2005 SP1编译,否则无法运行Debug版调试.

3.HavokVisualDebugger是个非常非常好的调试工具,我们只要在自己的代码中调用Havok API构建抽象的物理世界,抽象的物体,即给出物理世界的数据,就能直接通过hkVisualDebugger接口的socket连接发送世界数据到HavokVisualDebugger宿主程序,并在其可视化物理场景视图中显示出来.在我的实践过程中,它可视化出了WoW的物理场景,让我方便清晰地看到传给Havok的数据是否确实反映到了物理世界中,在调用API时物体是否按我的意愿运行,结果是否正常.而且HavokVisualDebugger可以可视化地看到Havok的物理概念体,使抽象的概念体现到视图.Phyx引擎如果没有这种调试工具,是比不上Havok的.

11.工具里的FitCameraToWorld,好用.

4.hkpWorldObject -> hkpEntity -> hkpRigidBody

5.If you create an hkpRigidBody as fixed or keyframed you cannot make it dynamic later during the simulation (using hkpRigidBody::setMotionType() ), but you can make a dynamic hkpRigidBody fixed or keyframed during simulation and switch back.

6.A keyframed object is treated by the simulation as if it had infinite mass - however, unlike a fixed object, you can move a keyframed object around, if you set a velocity for it, it will move at that velocity. To turn a movable object into a keyframed object, you call its setMotionType(hkpMotion::MotionType) method, setting the value to hkpMotion::MOTION_KEYFRAMED.

7.stepDeltaTime()不能传0.0,否则崩溃.

8.Phantom的概念: An hkpPhantom has no physical presence in the simulation and is used to maintain a list of entities (and other phantoms) that overlap with it. The most common application of an hkpPhantom is to detect entities entering and leaving certain volumes of the hkpWorld, perhaps causing a scripted cinematic sequence to be played or a nearby AI character to be alerted to your presence.

9.物理引擎碰撞检测都有Broadphase和Narrowphase概念(如Phyx,SOLID),而Havok也是如此.即碰撞检测分2个阶段,第1个阶段是快速的世界物体AABB式检测,使用扫描线算法快速排除在AABB上不相交的物体,得出可能相交的物体对,然后送入Narrowphase阶段.

10.While Havok is a continuous physics engine, the character controller is effectively discrete in its simulation approach. Although this is fast, and means that characters can be stepped independently of the physics engine, and at lower frequencies, this can also lead to some accuracy problems.

11.You can use filters to disable or enable collisions between objects. If collisions are disabled between two objects, no collision agents are created for the pair, and they can move into or through each other.

posted @ 2008-08-02 11:27 linghuye 阅读(2794) | 评论 (7)编辑 收藏

VS2005以后的DLL运行时库发布问题

从VS2005开始,M$发明了一种高科技手段的来加载各种版本的ATL,MFC,CRT,C++标准库CRT的DLL运行库,以解决DLL Hell问题,那就是manifest文件.
我个人认为没有比这更SB的DLL发布方式了,问题更加严重了.

于是出现了更多的VS2005编译出的程序不能在某些机器上运行的情况,因为msvcrt80.dll就有若干不兼容的小版本,如:
8.0.50608.0/8.0.50727.42/8.0.50727.163/8.0.50727.762(VS80sp1)/8.0.50727.1433等等,这些安装在Windows\WinSxS (WinSex?)对于一个使用各种第三方的没有源代码的lib的程序,每个第三方库对应的msvcrt80版本都不能漏装,关键是你到哪里去找这些版本的Debug版的DLL.

众人纷纷讨论解决该问题的技巧和心得体会,大部分人使用静态联编了事,惹不起我还躲不起吗.而我至今没有发现一种简单可靠的发布绿色版的使用动态运行时库Vs2005程序的方法,而且我不喜欢静态联编,所以我坚持VC6和Vs2003.

VS2005肯定是要生成manifest资源的,唯一能指定的是:这个manifest资源是作为执行文件的资源数据内嵌,还是生成为一个独立的文件.
工程属性 -> 配置属性 -> 清单工具 -> 输入与输出 -> 嵌入清单 -> 是/否.
如果,生成为一个独立的文件,再删除这个文件,运行程序会报错,"由于应用程序配置不正确,未能启动此应用程序。请查看清单文件查找可能的错误。".
就是说,想用VS2005以上的运行库,就必须有manifest资源,不管是内嵌还是独立文件.

posted @ 2008-07-12 18:30 linghuye 阅读(5041) | 评论 (2)编辑 收藏

glSwapBuffer阻塞的几点猜测

1.当前理论帧率远大于60帧,但垂直同步被打开,SwapBuffer阻塞以保证垂直同步.这个是低级错误.
2.整个场景画面或画面中的一块的渲染像素层叠覆盖过多,像素填充率瓶颈.这个很少发生,在高端显卡上这一般不是瓶颈.
3.调用OpenGL废指令过多,造成命令缓冲庞大,glSwapBuffer等待指令完成.
4.在一轮Render中,对上百个GL_ELEMENT_ARRAY_BUFFER_ARB作glBufferSubData时,Nvidia显卡下出现,原因不确定,估计VBO的使用导致了的同步问题,替换为直接使用内存指针后正常.


Reference:
http://www.gamedev.net/community/forums/topic.asp?topic_id=306224&whichpage=1?
http://developer.apple.com/graphicsimaging/opengl/optimizingdata.html
http://www.gamedev.net/community/forums/topic.asp?topic_id=338336

posted @ 2008-07-01 09:22 linghuye 阅读(3624) | 评论 (1)编辑 收藏

幼儿急疹

一、幼儿急疹
幼儿急疹是儿童早期的一种常见病,大多数儿童在2岁前都得过此病,本病特点是突发高烧,一般持续4天左右,然后全身出现粉红色斑点样皮疹。
临床幼儿急诊的症状有:
幼儿急疹有两个阶段,在5—15天的潜伏期后,首先出现如下症状:1、体温达到39—40℃,但孩子状态良好。2、有时出现高热惊厥,但有些孩子还会出现咳嗽、颈部淋巴结肿胀、耳痛等症状。
发病后4天左右进入第二阶段,这时的症状有:1、体温迅速恢复正常。2、出现细小、清晰的粉红色斑点状皮疹,多分布在头部和躯干部,可持续4天左右。
健康的孩子很少出现并发症,但免疫功能低下的孩子可能发生肝炎或肺炎等并发症。
因为脑膜炎与幼儿急诊相似,所以医生会对患儿做进一步检查,以排除细菌引起的脑膜炎。幼儿急诊没有特异治疗方法,但应注意给孩子退烧,可给孩子洗温水浴,或者用温水擦身。此病的恢复迅速,孩子在皮疹消失后很快能恢复正常。
二、幼儿急疹会传染吗?
幼儿期常突发高热,退热后全身出现玫瑰色的斑丘疹,令父母亲常困惑不解。其实这种情况医学上称为幼儿急疹。
幼儿急疹的临床特点是以突发高热起病,热度可高达39.5度以上,一般发热持续3~4天,后体温便突然降至正常。退热时或退热后数小时至1~2天全身出现玫瑰色的斑丘疹。整个病程约8~10天左右。
幼儿急疹是由病毒引起的,通常是由呼吸道带出的唾沫传播的一种急性传染病。所以是会传染的。如果你的孩子与病儿密切接触,体内缺乏免疫力,就完全有可能被传染。由于幼儿急疹的潜伏期是是1~2周,所以,这段时间应密切观察你的孩子,如出现高热,应立刻采取措施暂时隔离,以免扩大传染。如果2周后孩子仍安然无恙,说明没传染上幼儿急疹的病毒。幼儿急疹预防的关键,在于不要与患幼儿急疹的孩子接触。
同时,应提倡和鼓励孩子增加运动,提高自身的免疫力,才能从根本上防患于未然。
三、幼儿急疹及其护理
有不少年轻的妈妈因孩子出了一身皮疹而前来就诊,经常被儿科医生诊断为“幼儿急疹”。幼儿急疹是婴幼儿期常见的发疹性疾病。目前多数学者认为与病毒有关。
本病主要多见于周岁内婴儿,四季均可发生,一生中感染两次以上者极少见。其临床表现是起病急,高烧达39-40℃,持续3-5天自然骤降,精神即刻好转。它的特点是烧退疹出或疹出热退。皮疹多不规则,为小型玫瑰斑点,也可融合一片,压之消退。先见于颈部及躯干,很快遍及全身,腰部及臀部较多。皮疹在1-2天内消退,不留色素斑。该病在出疹前可有呼吸道或消化道症状,如咽炎、腹泻,同时颈部周围淋巴结普遍增大,这对幼儿急疹的诊断很有意义。
本病尚无特效治疗,抗生素治疗无效。只需对症处理,高烧、烦躁或易惊跳时,可用退热镇静剂;如果持续高热,就需要补充更多液体,多喝白开水、菜汤、果汁等.
四、得了幼儿急疹怎么办?
①让患儿休息,病室内要安静,空气要新鲜,被子不能盖得太厚太多。
②要保持皮肤的清洁卫生,经常给孩子擦去身上的汗渍,以免着凉。
③给孩子多喝些开水或果汁水,以利出汗和排尿,促进毒物排出。
④吃流质或半流质饮食。
⑤体温超过39℃时,可用温水或50%酒精为孩子擦身,防止孩子因高热引起抽风。
五、幼儿急疹应重在护理
幼儿急疹多发生于6至18个月的婴幼儿,常常是突然发病,体温迅速升高,常在39℃至40℃。高热早期重症患者可能伴有惊厥,有的出现轻微流涕、咳嗽、眼睑浮肿、眼结膜炎。在发热期间有食欲较差、恶心、呕吐、轻微腹泻或便秘等症状,并且咽部充血,颈部淋巴结肿大。发热三至五天后体温骤降,退热后孩子全身可出现大小不等的淡红色斑疹或斑丘疹,先从胸腹部开始,很快波及全身。这时孩子已经退烧,可安然入睡,在医学上称“退热疹出”,是幼儿急疹的特有表现。
幼儿患了急疹一般不用特殊治疗,只要加强护理和给予适当的对症治疗,几天后就会自己痊愈。孩子患幼儿急疹后,家长要让孩子卧床休息,尽量少去户外活动,注意隔离,避免交叉感染。孩子发热时,要给患儿多饮水,给予容易消化的食物,适当补充维生素B和维生素C等。如果体温较高,孩子出现哭闹不止、烦躁等情况,可以给予物理降温或适当应用少量的退热药物,以免发生惊厥。年轻的妈妈在遇到这种情况下,不要急于给孩子退烧,应查看疫苗接种情况,配合医生治疗。

附: 这周原本是要去云南旅游的,儿子突然发烧,高见39.7度,恐慌不及,手足无措. 于医院中挂吊瓶时烧退,回家又复烧,几日间往来医院,医生皆说辞含糊不解. 4日后烧退出疹,于网上收集各种资料学习之,记之.

posted @ 2008-06-29 09:45 linghuye 阅读(1333) | 评论 (0)编辑 收藏

开始研究PSP

入手一台PSP 2000,跑了下战神和怪物猎人,这机子不是一般的强啊.
装FC模拟器,玩了几款童年的游戏,就是这种感觉,仿佛回到了过去.
讨厌戴耳机,外置喇叭声音大,听相声mp3的效果比MP4爽多了.
最重要的,可以针对PSP编程,对程序员而言,这就更好玩了.
LuaPlayer很好,让PSP编程变得很简单.
看电子书软件还不好用,主要是用了TTF后有问题, 翻页变慢,雅黑14兆还死机,不如我的智器MP4看电子书简单完美.可以看PDF,这个不是一般的强,速度很慢.
视频不能放rmvb,可以软编程的话,是芯片能力吗?

NND的,linux下的东西就是难用,纯粹练打字.

资料链接:
http://bbs.pspchina.net/forumdisplay.php?fid=39
http://www.evilmana.com/tutorials/lua_tutorial_01.php
http://wiki.ps2dev.org/psp:lua_player:functions
http://psp.tgbus.com/pspdg/jc/Index.shtml

posted @ 2008-04-27 09:27 linghuye 阅读(1499) | 评论 (4)编辑 收藏

WoW的UI脚本对象实现方法

WoW的UI/XML脚本中定义的每个UI对象都可以在lua脚本中使用其名字进行调用,如
GameMenuFrame:Show();    // 方法
local a = checkbutton.isChecked;// 属性

在wow中测试了下,发现:
1.type(GameMenuFrame) == "table"
2.GameMenuFrame has only one field, that is, GameMenuFrame[0] is a userdata
3.GameMenuFrame has metatable, GameMenuFrame[0] has NO metatable.
4.The metatable of GameMenuFrame has only one override field, that is "__index".
5.And that "__index" field is a table contains functions.

So when calling GameMenuFrame:Show(), it calls GameMenuFrame.Show(GameMenuFrame), the GameMenuFrame has not a "Show" field, so it will find it in its metatable's "__index" field, that is:
getmetable(GameMenuFrame)["__index"]["Show"] which refers to a embbed function, the implementation will get the userdata from the GameMenuFrame table. This userdata points to a C memory, or C++ object, or C++ Object pointer, or anything.

For the attribute like 'checkbutton.tooltipText', the tooltipText field is a complete lua variable, created by wow lua script. C/C++ implemetation needs some trouble to read it into binary code and then use it.

posted @ 2008-04-02 22:27 linghuye 阅读(2003) | 评论 (0)编辑 收藏

VSS在本地工程中的定义

1.定义在vssver.scc, mssccprj.scc,工程dsw,dsp文件中
2.vssver.scc, mssccprj.scc是自动生成的,删除之.
3.dsw中的每个子项目都有一个
    begin source code control
    "$/UICraft/BaseEngine", CSBBAAAA    // 在Vss库中的绝对路径, $代笔Vss根目录.
    ..\BaseEngine                                             // 本地相对目录
    end source code control
4.dsp中
# PROP Scc_ProjName ""$/BaseEngine", CSBBAAAA"
# PROP Scc_LocalPath ".
注意这里的$表示dsw的根目录UICraft,不是Vss库的根目录.
dsw,dsp中的定义可以修改,不能删除.


posted @ 2008-03-26 09:44 linghuye 阅读(1045) | 评论 (0)编辑 收藏

OpenGL calls that may incur glFinish

1.SwapBuffers, glGetXXX.
2.当前绑定了GL_ELEMENT_ARRAY_BUFFER_ARB,调用glDrawArrays后导致glFinish,妈的,这显卡驱动是什么逻辑.
3.使用了Fraps测试帧数,导致SwapBuffers调用glFinish.
4.OpenGL中判断使用glCullFace(GL_FRONT_AND_BACK), glEnable(GL_CULL_FACE)时帧率是否变化,可以断定是否存在像素填充率问题. 

posted @ 2008-03-19 10:37 linghuye 阅读(1251) | 评论 (2)编辑 收藏

仅列出标题
共23页: 1 2 3 4 5 6 7 8 9 Last