昨天去参加了RIAMeeting组织的一次小型聚会,见了不少技术牛人,他们都有丰富的开发经验和技术体会,并且对于技术有精益求精的态度,让我这个去蹭吃蹭喝的人觉得比较惭愧,也学习到了不少东西。在聚会结束的时候大家开始自我介绍,可以料想到:一个比一个谦虚、腼腆、不善表达——和我在其它场合接触到的大部分技术人员一样。这给了我一些触动,加上最近我也看了一些东西,就决定写这么一篇日志。由于它也是和技术有很大关系的,所以决定放在这个 Blog 上。
上大学的时候我了解到有“程序员”这个职业,就是写代码的,不过在我毕业进入中国雅虎之后,我更喜欢“工程师”这个称谓(web developer 也可以叫做前端工程师或者UI工程师),因为这个名字总是能让我想起游戏《红色警戒》里面那个带着黄帽子拿着工具箱到处跑的角色,如果半路上不被敌军的狗咬死就可以修好断桥和建筑,或者把敌军的建筑占领。我对工程师这个群体一直都抱有普遍的好感,他们低调、技术高超、真诚、单纯、有责任感,值得信任。和他们在一起工作你会感觉特别舒服。记得刚入职的时候,我对Linux一点也不了解,有次碰到一个问题,正好旁边几个工程师在那里聊天,于是我就像他们求助,他们过来之后一个人负责操作,其他几个在旁边七嘴八舌建议,不一会就把问题解决了,我当时就觉得特别有安全感,所以在以后的工作中遇到问题也没有特别着急过,因为我知道我身边有很多牛逼的工程师,有他们在就没有什么问题是解决不了的。
在工程师这个圈子呆久了,我发现大部分的人都有一个共同点,那就是不善表达,或者说懒得表达。在公众面前讲话会脸红,不能很好地表现自己,而且“善于表现自己”其实会被认为是一个缺点——因为大家都觉得有真才实学就好了,而且普遍信奉“低调”的做人哲学,那些善于表现的人会被说成“很能忽悠”。举个例子来说吧,李开复应该算是一个很成功的人了,而且是技术出身,但是你会发现这几年很多人都对他有负面评价,说他“不好好管理公司,整天跑去演讲”、“就是一个说书的”、“做秀”云云,都是针对他频繁出现在公众面前这件事情来说的,而且你会发现大部分的负面评价都是出自技术圈的。但是这种在公众面前演讲、推销自己其实是一种很重要的能力,尤其是在现代社会,它是一种“企业家式的能力”。
在现实生活中,无论是哪个圈子和团体,都会经常发现这样的例子:有一些很有才华的人在社会上始终不成功,相反,有一些资质平平的人却为自己挣得了不错的地位和财产。为什么会出现这样的情形呢?一个重要原因是前者不善于经营自我, 而后者善于。善于经营自我经常会被广大有真才实学的人鄙视,觉得那是“钻营”和不务正业。事实上,正如《自由秩序原理》一书中所说的那样,这是一种“企业家式的能力”,而且 “一个人的成功不是取决于自己既有的才能、知识、技术等等,而是取决于能否成功地将它们转换成‘对其他有能力做出回报的人有用的具体的服务’,这正是自由社会的本质之所在。”
如果真的是这样的话,那么由于每个人的“企业家式的能力”的不同,势必会出现能力相同的人获得的报酬却相差很大,引起很大的不满,而且每个人必须为自己的才能去寻找市场,这就必然面临压力和风险。但是这种代价是必须的,为什么呢? 因为如果不是根据使用才能的有用结果而是根据才能来决定报酬的话,那么就必须有一个权威来判定每个人的才能大小和级别,这就必然导致专制。“如果想替代那种对自己的命运负责而导致的压力,那么可供选择的就只有那种人们必须服从的个人命令所产生的令人更为厌恶的压力。”
虽然我们这一代没有经历过计划经济、分配工作这些事情,不过应该也有所耳闻吧,那个时候每个人不必去营销自己,因为上级已经给你安排好了工作和报酬,虽然说是根据你的能力进行的安排,但是里面必然掺杂了诸如个人恩怨等其它因素,那种不公平比现在的这种不公平要严重得多。尽管现在的市场经济也有不公平的地方,因为它只承认“在市场上得到实现的价值”,但是我想相比之下大家应该都更讨厌专制吧。两害相权,只能取其轻。
鉴于此,我很希望工程师可以抛弃一些偏见,虚心地去学习那种“企业家式的能力”:在公众面前讲话的能力、写文章的技巧等等,培养自己的一些市场意识,当然,这都是建立在真才实学的基础上的。如果没有真才实学而专门去推销自己的话,那真的是投机钻营了。
最后我想说的是,其实很多技术人员因为性格使然,是很难学会这种“企业家式的能力”的,但是他们又确实有能力又踏实肯干,很多时候对于他们来说真的不太公平。所以如果以后有机会并且有钱的话,我很想创建一家让工程师有幸福感并且摆脱无力感的公司。

10.1来到终于买了三星I908E,上来刷机就变砖了,小问题多多,持续更新.

 

--------------------------------------------------------------------------------

1.提高机器运行速度<已测>

打开注册表: HKEY_LOCAL_MACHINE\System\StoragManager\FATFS\EnableCache
将原值1<改成6推荐数值> <改为8速度级大提升>


2.提高系统显示加速<已测>

HKEY_LOCAL_MACHINE\System\GDI\GLYPHCACHE\Limit(字体缓冲的最大值)原来的数值为65536(64K)现在改为2097152(2M)或者1048576(1M)


3.加快上网速度<已测>

打开注册表:HKEY_LOCAL_MACHINE\Comm\TcpIp\Parms处的TcpMaxConnetctRetransmissions键值十进制为10,十六进制为A就可以了


4.提高触屏速度<已测>

HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/TOUCH 底下的“CalibrationDate”的值
改为:519,503 177,881 182,129 847,127 849,872


5.关闭低电量提醒<已测>

HKEY_CURRENT_USER\ControlPanel\Notifications\{A877D663-239C-47a7-9304-0D347F580408}\
新建一项“字符串值”,该“字符串值”取名为“Default”,键值数据内容为“电池电量低”
再在机器系统菜单“开始/设置/个人/声音和提醒/通知/选择事件/电池电量低”,同时清空选择通知方式的所有方框


6.隐藏Sim联系人<已测>

在HKEY_CURRENT_USER\ControlPanel\Phone下新建新建双字节值ShowSim,键值为1是显示,0是不显示


7.短信聊天模式<没测,因为我喜欢这个模式>

[HKEY_CURRENT_USER\Software\Microsoft\Inbox\Settings\OEM]
"SMSInboxThreadingDisabled "=dword:1
其值:“0”表示启用聊天模式“1”表示使用传统模式


8.修改主册表:屏蔽“短信已发送”的提示<没测,感觉不需要>

修注册表KEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Inbox/SettingsSMSNoSentMsg”的将Dword值从0改为1


9.自动释放系统资源<没测,感觉不需要>

打开注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion主键,在下面建立一项键值,命名为:“explorer”,再到“explorer”底下新建一个名为“AlwaysUnloadDll”的字符串值,然后将 “AlwaysUnloadDll”的键值写为“1”,退出注册表重启即可



10.铃声增大<没测,我用的是工程模式改的>

找到HKEY_CURRENT_USER\ControlPanel\Phone\项,下面有Vol项,编辑该项目值,预设值为6666(16进制),可将将其改成8888(16进制),重新启动系统,音量明显增强,而且破音现象不明显,个人感觉要强于工程模式设置效果


11.“屏蔽”或“开启”系统内的输入法选项:<没测,感觉不需要>
  在注册表软件内运用查询选项.所键入的查询项就是你可看到的输入法名称,比如"三星全屏手写","拼音输入"等这样就可以直接找到改输入法的目录,在相应的 IsSIPInputMethod下键入0或者1就可以,0代表不显示,1代表显示) ,以下是系统默认显示和默认关闭的自带输入法的位置,直接修改即可
  全屏手写:HKEY_CLASSES_ROOT\CLSID\{5AAFAF99-8D99......}
手写输入:HKEY_CLASSES_ROOT\CLSID\{9E06C6B8-FE4D......}
  拼音输入:HKEY_CLASSES_ROOT\CLSID\{F50603D1-CF2F......}
  三星手写输入:HKEY_CLASSES_ROOT\CLSID\{991BD66C-F983......}
  三星全屏手写输入:HKEY_CLASSES_ROOT\CLSID\{209DFEC6-8F27......}


12.去除安装程序时的这些提示窗口弹出?<没测,感觉不需要>
HKEY_LOCAL_MACHINE\Security\Policies\Policies\0000101a
= 1时不显示警告信息;=0时恢复显示


13.菜单字体设置<没测,感觉不需要>
HKEY_LOCAL_MACHINE\SYSTEM\GDI\SYSFNT 这个主键下面是图形界面的字体设置
HKEY_LOCAL_MACHINE\SYSTEM\GWE\Menu\BarFnt 这个主键下面是“菜单栏”的字体设置
HKEY_LOCAL_MACHINE\SYSTEM\GWE\Menu\PopFntt 这个主键下面是“弹出菜单”字体设置
  "Wt\"设定字体粗细(粗体细体)400细700粗(仅仅对数字符号英语有效果)
  "It\"设定斜体,0正常字体,1斜体。

3.13更新几调个性设置

修改CMCC中国移动名称
HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\RIL\OPERATORNAMES
新建值>新建>字符串值>名称>中国移动的写"46000",中国联通的为"46001".在值里填入你想换成的文字。有46000和46001这2个字符串值的直接修改值为你想换的名字就行了.

修改铃声路径
HKEY_CURRENT_USER\ControlPanel\SoundCategories\Ring\Directory 改为: \存储卡\我的音乐(自己的路径,不赞成改在卡上尽量放在机子上)(默认为:windows\rings)
改变左右软键
左键:
HKEY_CURRENT_USER\Software\Microsoft\Today\Keys\112\Open ="\Windows\“开始”菜单\ 程序\资源管理器.lnk"(功能,可输入自己想要的程序路径),default="日历"(软键显示文本名称)
右键:
HKEY_CURRENT_USER\Software\Microsoft\Today\Keys\113\Open = "\Windows\“开始”菜单\Programs\Contacts.lnk"(功能,可输入自己想要的程序路径),default="联系人"(软键显示文本名称)

修改注册表延长待机时间
修改如下:
1.HKEY_LOCAL_MACHINE\Comm\AsyncMac1\Parms
"DisablePowerManagement" 1修改为0
2.HKEY_LOCAL_MACHINE\Comm\Irsir1\Parms
"DisablePowerManagement" 1修改为0
3.HKEY_LOCAL_MACHINE\Comm\L2TP1\Parms
"DisablePowerManagement" 1修改为0
4.HKEY_LOCAL_MACHINE\Comm\PPTP1\Parms
"DisablePowerManagement" 1修改为0

缓存修改(有些键可能在注册表中找不到,新建即可)
HKEY_LOCAL_MACHINE\System\StorageManager\FATFS\CacheSize=8192
HKEY_LOCAL_MACHINE\System\StorageManager\FATFS\EnableCache=3 (将原值1改成3,3为推荐数值,理论上越高越快,我修改为6,未发现问题)
HKEY_LOCAL_MACHINE\System\StorageManager\Filters\fsreplxfilt\ReplStoreCacheSize=8192
HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\MSFlash\FATFS\DataCacheSize=8192
HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\MSFlash\FATFS\Flags=40

日期和时间
定位到:HKEY-LOCAL-MACHINE\SOFTWARE\Micriosoft\Shell,点击左下方的“编辑”,选择“新建二进制值”,在“值名称”中填入“TBOpt”(注意大小写),“值数据”中填入“01”("01"表只显时间,"02"表只显日期,“03”表分两行显日期和时间,“04”则什么都不显)。如注册表中有这项就直接修改重起即可。
HKEY-LOCAL-MACHINE\nls\overrides,点击“STFmt”(若没有新建一个字符串即可)若把值数据改为“HH:mm”则显示24小时制,而且在“HH:mm”前可以加上你想要的文字如“现在时间”等,建议文字和时间之间价格空格好看些

CAB格式安装文件安装了以后避免被系统自动删除
HKEY_LOCAL_MACHINE\Software\apps\Microsoft Application Installer\nDynamicDelete
“0 ”不自动删除,“2” 自动删除
或者HKEY_CLASSES_ROOT\cabfile\Shell\open\command
=wceload.exe "%1" /nodelete 不自动删除;=wceload.exe "%1" 默认自动删除

修改SD名称
HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SDMemory\Folder键值修改SD卡名称(默认为:存储卡)

关闭电话的信号灯
HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Nled\PCA9633\LED01\LedWeight,把 LedWeight的值改为:000000,把LedIndex的值改为:0,另外关闭其它各颜色的LED信号,则进入LED00~LED06把以上各数值改为上面相应数值即可。

去掉开机STK
HKEY_CLASSES_ROOT\CLSID\{7B58F1D9-1C13-440F-894B-B90680570A2D}\InProcServer32下的(Default)的值,原来是simtkit.dll,随意改个或删除就可以了,确实可行。


修改铃声路径
HKEY_CURRENT_USER\ControlPanel\SoundCategories\Ring\Directory 改为:
\存储卡\我的音乐(自己的路径,不赞成改在卡上尽量放在机子上)(默认为:windows\rings)


--------------------------------------------------------------------------------

 

撒旦是天使,也是天使的敌人,他沦为了天使所驱逐的对象,因为他看见了事物的另一面.天使向人类宣布了爱与和平.但蒙骗了人们的心灵;撒旦揭开了这一切,他告诉人们,世间还有丑恶与奸诈.撒旦触碰了天使的禁忌,于是他成了天使恶魔,但却成了人类的救世主,因为他教会了人类坚强与信心,人类学会了挑战,成了真正的人.天使依旧是主宰天国的神,而撒旦成了地狱的恶魔,一个天使恶魔.

最近在网上看了一篇CNZZ统计的中国网民的浏览器使用报告,傲游再次稳坐非IE市场份额榜首。

原文:http://xiazai.zol.com.cn/article_topic/144/1442564.html

同样作为傲游浏览器的忠实使用者,我现在这里说一说为什么使用傲游

1.为什么不用微软的IE

大家都知道,IE是集成在Windows系统里的,从IE4开始就稳坐浏览器市场的头把交椅。可为什么它我被抛弃了呢?原因很复杂,:

一是集成带来的负面影响。IE在系统中的集成度很高,很多软件都摆脱不了对他的依赖。可一旦IE的组件遭到破坏,又怎么办呢?举个例子吧,在IE8出Beta版本时,我就更新了,因为IE7实在是用不惯啊,IE6又不支持多标签。但当IE8BETA2更新时,需要重启,因为手头有一篇文章没有写完,就稍等了一会,就在这时,弹出的迅雷广告被误点了,它调用了IE。这件事就麻烦了。数据保护自动关闭了IE8,直到IE8发布正式版,才重新打开了IE,这中间历时3个月啊。

二是安全性不佳。IE的安全定制性太差,只有几个档,高安全性又会牺牲浏览自由度,还有不断的安全漏洞,控件问题......这是令人焦头烂额啊!并且IE的更新并不能及时,最快也要一个月一次,随着微软的安全更新来更新,大版本更要随着系统的更新才更新,规定太死了!

三是可定制性差。微软官方提供的扩展少得可怜,可以实现的附加功能实在是少得可怜。

四是太占用资源。功能不多,资源占得不少,这就是我抛弃他的又一原因。

我想这么多的原因足够了吧。但是为什么还有这么多的网友用着IE6~8呢?原因很简单啊,IE省事,又对别的浏览器不了解。

2.为什么不用火狐Firefox

火狐,前几年很流行的,为什么不用他呢?

先介绍一下我的感觉:他太保守了,界面不好看,速度又不是很快,设置不方便。输入about:config,再敲回车:首先是一个对话框,要你小心,然后是一大串的源代码,似乎在标榜:我是开源的啊!当我准备安装中国版的时候,安装进程还在,安装的窗口却死活找不到了,无法更新,好郁闷啊~~

ca6f1bd3aeea6b293bf3cffb 还有就是它的扩展网页,ENGlish——怎么为不懂的同志们服务呢?86239fb74140d1dd30add1ca

再从专业的角度说一下下它的内核缺陷:

(摘录自傲游论坛)一份万言书:原文链接:http://bbs.maxthon.cn/viewthread.php?tid=175213&extra=&page=1

据我所知,现在火狐上用的Gecko内核是原来开发IE浏览器的部分人员,和以前开发网景浏览器(NetScape)的部分人员合作开发的。
它上面有一个“小”鸡肋,就是XUL结构体系。我个人认为,这是一个只逊于微软的ActiveX结构体系的东西。
该体系结构允许火狐支持一种叫做扩展(.xpi文件)附加组件——注意,扩展不是插件(.dll文件)——安装各种扩展就能往火狐上面添加各种功能,
但某些比较高级的功能,装上去以后会拖慢火狐的启动速度,例如Adblock扩展(用于过滤广告,可以在其中挂载ChinaList那种能自动升级的广告拦截规则)、Flashblock扩展(用于屏蔽Flash,效果类似傲游2等IE外壳类浏览器中的那种浮动Flash播放按钮)……
举个例子吧,在我那购置于4年零9个月之前,主内存256MB(还要分32MB给主板集成显卡)的清华同方超锐F5000笔记本上(当时买的时候6900,也勉强算中档机吧),
哪怕是号称启动速度“更快”的绫川编译版火狐“3.5.1”,在以空白页启动时,就耗时10秒;如果在上面加上各种扩展,譬如做成苦菜花优化版的那个样子,启动一下就需要17秒!
而我自己定制的Opera 9.64朱雀版,在同样实现其中的大部分功能的情况下,启动耗时仅需6秒,和傲游2差不多。
这样一来,假设我每天在开机后就启动一次带有各种附加功能,基本上比较实用的火狐3.5.1,就得浪费9秒钟,一年浪费54分钟多,我现在一般一台电脑用5年,那么就得浪费我4个半小时。
假设未来我升级了我的电脑,但由于火狐不肯抛弃它那个“为了跨平台而跨平台”,大幅度拖慢启动速度的XUL结构(抛弃了这个,它的可扩展性可就和IE 6一样了),
导致它在加上各种“实用”扩展后的启动速度始终很慢,甚至始终比同时代的其它浏览器慢个8、9秒的话,
呵呵,那么我用50年的火狐,就等于变现地缩短了我将近“两天”(45个小时)的寿命!
哈哈,说得太夸张了,估计某些火狐浏览器的骨灰级爱好者要扑上来跟我拼命了。
可能这个说他的电脑是双核CPU,加4GB内存,启动火狐3.5.1只需3秒——如果不用光那些内存,对他而言反而是一种浪费;
那个说通过加挂UserChrome.js扩展,他把绝大部分原装的都拆成了.js、.css、.xul文件来加载,去除了多重Chrome目录映射,启动速度更快,占用内存更少;
还有的会说,Opera浏览器中提供的很多功能他都没用,所以,没必要去装那么多扩展来复现相应的功能,他只装10个扩展,平常还把其中不常用的8个都关掉,以提高启动速度……
呵呵,就算不考虑启动速度的问题,我还是要说,安装扩展仍然是一个很浪费“普通”用户的时间和精力的大麻烦!
再举个例子吧,在火狐中要调用迅雷就要装一个FlashGot扩展,但是你一开始可能不知道这个扩展的名字,于是你得去上网搜索资料看帖子,
查出这个名字以后你得去它那个慢吞吞的官方扩展搜索、下载平台上下载和安装这个扩展,装好之后,运气好的话就能直接用。
运气不好的话,它可能又和你的迅雷不兼容,于是你还得去试装其它版本的FlashGot扩展——譬如,最近这些天我在学习定制火狐,因为火狐3.5.1空载启动后占用内存都大得不得了,而3.0X版启动耗时又比3.5X版更多2秒……
于是我就用火狐2练手,光是找一个能在火狐2下,和我的5.8.6.600 AYU精简版迅雷兼容的FlashGot扩展,我就反复下载了七、八个版本!
真的装好之后,我又发现它依然不能去下载那些迅雷专用链中的数据——于是我又尝试卸载FlashGot扩展,改装迅雷中自带的,用于火狐的右键菜单调用扩展(二者不可共存),装好之后,还是不能从专用链中下载数据!
接下来,我又跑到论坛上去搜索别人的帖子,看到有人说装一个名为“扫雷”的非官方地下扩展,就能部分支持迅雷专用链了,
下载、安装——终于装好了,现在总算能下载“部分”网站中迅雷专用链内的数据了!我随便挑了三个网站,其中我常去的绿色下载站和另一个网站就行,但是还有一个就不行。
为什么会这样呢,据说是由于为了推广迅雷,那些不行的网站采用了更复杂的,基于Base64编码或者ActiveX控件加密的技术,来加密了那些迅雷专用链的关系……
呵呵呵呵,可以说,还没有把火狐用到50年呢,现在仅仅是为了定制火狐2,我就已经消耗了10天以上的时间,光是定制笔记就打了20000字了!
如果谁不相信我的话,可以去亲自实践一下,或者去看看火狐中国版的官方提问区,看看有多少人在问有关迅雷专用链的“常识”性问题——就知道用非IE内核的浏览器,但是官方又不帮你搞太多的技术支持,那么会有多少麻烦了。
顺便一提,目前还有把火狐的部分扩展都改写成二进制代码——也就是.dll插件的高度集成版火狐,是原来的IE外壳浏览器,好像是叫avant什么的那个公司出的,他们把这个浏览器叫做Orca Browser(魔鬼浏览器?)。
因为高度集成,部分功能非扩展化(插件化、底层化……毕竟.dll文件在windows平台下的执行效率就是比.xul文件高)的关系,那个同样使用了3.5.1版火狐中的Gecko内核的魔鬼浏览器,在我的电脑上启动耗时只有7秒!
不过,不知道是不是部分抛弃XUL结构的关系,它对某些火狐扩展的兼容性也变差了,我在上面装了个IE Tab扩展,居然连安装后新生成的按钮在哪里定制都看不到……

说的已经很精辟了,真是对这位大哥为定制而生的耐性和洋洋洒洒的文字功底感到佩服!这就是对火狐内核和插件的一次全景披露!所以,对没有经验的用户和非发烧友用户,就不要去尝试着手定制了!

3.为什么不用Google的Chrome和Apple的Safari

这个问题仍旧在于它们的内核,它们采用了Webkit核心。

这个核心虽然有着高度的可定制性、开源性,最重要的是平稳高速,但最大的缺陷在于兼容性,正所谓“鱼和熊掌,不可兼得”。对于网银,它们不能支持。而网上交易作为现代电子商务的一大部分,浏览器的不支持就意味着网银的使用者要不得不回到又老又慢的IE的怀抱。对于一些IE专用网页,当然也就更打不开咯!

另外,Google刚刚推出不久就已经更新到了3.0的版本,总给人一种不踏实的感觉,另外稀少的插件,不能定制的外观与操作(最不能忍受的是没有鼠标控制和鼠标手势),给操作带来了大麻烦。下载也是他的一大软肋哦,与火狐一样,迅雷专用链不能支持。

Google Chrome的实质并不是多标签页浏览器。这里要特别提请各位注意。我在使用Chrome时,偶然打开了任务管理器,竟看到了如下图的情景:

6390716087e7b9f68cb10d7f

为了让大家了解这一事实,特意发了一幅“巨照”。大家可以看到,Chrome浏览器一共打开了9个标签页,系统中就存在着9个进程,而我们知道,好的多标签页浏览器无论打开多少标签,总是打开一个进程。拿傲游2来看:

67af56ecc360d1f82e2e2137

对于傲游三,当其打开时就有多个进程,并不随着标签页的增多而增多。

这样一来,所谓的Chrome的多标签,只不过是把所有的进程的窗口组合在了一个框架里,蒙人啊~

IE8干的也是这样的勾当,拖累了系统的速度。

Safari就像其它的苹果产品一样,最重要的是血统,而不是产品。大概只有那些苹果迷才会对这个特点并不突出的产品着迷吧。也许是因为对于Windows平台水土不服?无从查证。

4.为什么不用Opera?

同样是非IE内核,又不是最为流行、最好用的Webkit内核,Opera这个小众软件实在是不值得花大价钱研究。据调查,在中国,有不少网页用Opera打开都是不正常的。关于内核的问题,在万言书中说得很详细了,大致一谈,略过。

5.为什么不用腾讯的TT?

在前述的调查中,TT的市场份额已进逼傲游,排名第二。那么为什么不用他呢?

排在第一位的是情感原因,而不是技术原因。我很早就开始使用傲游了,因此,第一次接触TT时,就有种似曾相识的感觉。先不说他了,我们来看看腾讯公司的产品,无一不挂着抄袭的嫌疑:

腾讯QQ——ICQ(从模仿起家)

QQ影音——暴风影音

QQ拼音——搜狗拼音

QQ旋风——快车、迷你快车

QQ堂——泡泡堂

QQ软件管理——迅雷软件管理

QQLive——PPLive

QQ医生3——360安全卫士

和悦——Skype

......

好长的列表啊......腾讯公司为什么不会创新,而只是一味的模仿呢?

傲游的清除记录、在线收藏,被TT模仿了;搜狗浏览器的教育网加速,被TT模仿了(见图);Safari的九宫格,被TT模仿了......TT似乎是一个优秀功能的集合,但是模仿毕竟是模仿,总有不到家的地方。网友们不要认为模仿是好的,能促进别人推出新技术,能让更多的好技术基于一身,可是一旦这些自主创新的企业被TT击垮了,TT又靠什么发展呢?又怎么能满足大家的要求呢!

67af56ecc360d1f82e2e2137

举个例子吧,QQ2009在08年一月就有内测版本,我是当时的试用用户,与现在的差别仍然相差无几——没有竞争对手或走在前面的人的结果!

腾讯,不要再干这样的事情了!自主创新吧!

腾讯!如果这世界上只有你一家软件公司,你们一定会一百年不变的!

可是也不能说腾讯人没有创新能力,只要对于钱这一方面,腾讯人还是很会想招的。

第二方面就是技术方面。腾讯的“技术”,在于在QQ的面板上放上了TT的图标。QQ用户群大,自然只要有十分之一的人为了方便选择TT,就是一个广大的市场。也许和我一样还是因为好奇吧,这是个什么图标呢?就安装使用了TT。这时,只要在适当的时候,跟一下别人的脚步,就大功告成了。可是跟也跟不到位,功能上总是比原装缩水啊!

腾讯的技术,还在于霸占市场上。QQ拼音可以让除了他自己以外的拼音输入法全部“消失”,可以让自己控制个人电脑上的媒体关联,TT当然也可以让别的浏览器装了也白装

当然了,腾讯是贪多嚼不烂,他的每一个产品(Except QQ)都没有一个扩展网页、论坛等等交流的场所,这也就在某种程度上导致了自主开发的失败。我不会在腾讯转变之前接受TT的!

好了,下面就是最后的一段话了,为什么选择傲游——

为什么选择傲游

傲游浏览器,我们的网际冲浪首选!官方网站:http://www.maxthon.cn/

1.内核优化,浏览方便

傲游浏览器1~2使用的是饱受诟病的IE浏览器内核。前面已经说到了使用IE内核的好与坏。但是在中国,用户的体验是第一位的,这也正是傲游的宗旨。因此,我觉得他们选择IE内核还是尊崇了大多数用户的习惯。但是总不能对这一内核不管不顾吧,所以呢,对于内核的优化就显得至关重要。

傲游的浏览速度较IE有大幅提升。安全系数有大幅提高。有图为证:ca6f1bd39a94bf2a3bf3cf1d

对于程序进行监控,可以完全清除历史记录,令访问踪迹一扫而空。

两大浏览加速,保证浏览速度提高

自主创新技术,智能度高,启用方便,屏幕下方即可选择是否开启

eb0973df1e74c239485403f5

2.功能众多,方便快捷

首先,就是这个79bf85d3c2d2331e960a16fd 想要在新标签打开还是不想?你说了算啊。网速太慢,开启智能加速啊。快速收集内容?收集面板帮你。拦截广告?没问题。缩放网页,可以!看时间、看内存、看IP地址......统统都可以。还有最新的消息、好笑的笑话等你。

289782c3fcec787fb219a8ce 然后,就是右上角的搜索框和增强功能和一条工具了~a378a01006014b2b203f2ed0

搜索引擎随便挑啊,还能多重搜索(点后面的放大镜)和关键字高亮。浏览网页的时候想要设置本机,快速点击“增强功能”,就能完成了!

22be6c34d70b4364251f14a9

虽然不是很起眼吧,但效果可是一等一的,工具使用频度高啊!

最后是重头戏,傲游设置中心:max:config. 再发一个图给大家看:

59b91b7a43bd39c72e73b3b2

这是设置中心的鼠标手势设置,可以定制的程度非常高。可以自己定义什么样的手势干什么,手势线用什么颜色,鼠标的动作控制的浏览器动作......另外,各种高级功能(在左边一栏,每一个选项都有亮点)都可以在这里通过鼠标点击完成,而不是像火狐一样,只能把源代码堆给你看~~搞不好就得重新安装,囧!

傲游的功能和便捷操作有很多,这里就不细说了,大家可以看:

http://www.maxthon.cn/overview.htm

3.更新迅速,沟通快速。

有什么问题,有什么想法,都可以在傲游论坛里和软件工程师(傲游开发组)或是测试用户组(扑虫华击团)那里找到解决办法和反馈!反应一般是很及时的,即便一时不能解决的问题,也会告诉你是什么原因,并争取在下一次的版本中予以改进。

版本更新更是不用说,大家可以看我摘录的更新记录:(原始网页:http://www.maxthon.cn/changelog.htm这是2.X的:

2.5.5.308 [2009-08-18]

[核心]
* 修正了了一个退出浏览器时导致崩溃的问题
* 修正一些鼠标键盘功能键无法使网页前进后退的问题
* 修正了IE6系统上,列表有时候无法多选的问题
* 修正了Google Reader在浏览器最小化还原后布局显示错误的问题
* 修正了Webplayer 及一些播放控件全屏时被挡住的问题

[界面]
* 为地址栏右键菜单增加了快捷键

[收藏]
* 修正导入 IE8导出的收藏文件收藏项目名称显示为乱码的问题

[设置默认]
* 修正了一些情况下,关联文件的图标未转成傲游样式的问题

2.5.4.159 [2009-08-04]

[核心]
* 修复一个可能导致崩溃的问题
* 修复一些页面导致浏览器锁死的问题
* 修复了Turkish 键盘布局下,q键输入可能重复的问题

2.5.3.80 [2009-07-21]

[核心]
* 解决了一些键盘布局在页面内无法输入的问题
* 解决了 Gmail 无法添加附件的问题
* 解决一些网站的自定义控件无法输入的问题
* 解决了百付宝安全控件无法输入中文的问题
+ 下载工具增加了对网际快车3/比特彗星/迷你迅雷 的支持

2.5.2.7058 Final [2009-07-02]

[核心]
* 解决了一些flash视频全屏的问题
* 解决了一些可能会导致kernelbase.dll崩溃的问题
* 在老板键隐藏时不再能安装插件等相关内容

[界面]
+ 增加了html文件等协议相关联的图标
* 修改启动提示是否设置默认浏览器的对话框

2.5.2.6929 beta5 [2009-06-25]

[核心]
+ 支持了http方式使用在线收藏
* 一些输入法开启后无法输入符号/数字等的问题
* 解决了一些web播放器无法全屏的问题
* 解决了一些嵌有Real或者WMP的页面无法点击的问题

[界面]
* 修复一个老板键隐藏时安装插件会导致窗口异常的问题
* 修复一个定制过刷新按钮图标后,合并刷新停止按钮无效的问题

[其它]
* 修改了设置默认浏览器无效及影响的一些问题

2.5.2.6608 beta4 [2009-06-01]

[核心]
* 修复一些输入法无效或者定位错误的问题
* 修复一个Flash视频全屏时会被主界面挡住的问题
* 修复一个自动运行的script插件和IE8导致页面排版错误的问题
* 修复了一个IE6下,自动完成表单和下拉表单无法选择的问题
* 修复在安装了IE8的系统上,进行页面缩放后中键点击链接无效或错误的问题
* 修复交行密码输入框点击后无法输入的问题
* 修复一个通过电子邮件发送当前链接/邮件错误的问题
* 修复一个使用浮动按钮调用外部工具下载无效的问题
* 增快了光标键的响应速度
* 修复一个分屏时输入法选字框定位错误的问题
* 解决了一些导致页面透明的问题
* 修复一个快捷键会影响标签防假死效果的问题
* 解决一个关闭全部标签可能导致崩溃的问题

[界面]
* 修复一个"强制在新标签中打开链接"选项导致一些情况下广告在新标签打开的问题
* 修复了一个保存浏览进程失效和滚动条位置错误的问题
+ 现在撤销的页面能够保存滚动条位置了
* 修复一个在安装IE8的系统上,一些情况下浮动按钮的坐标错误的问题
* 解决了一些对话框在安装了WindowsBlind的系统上无法激活的问题
* 修正一个从其他窗口点击过来无法获得焦点的问题(地址栏/搜索栏/右键/中键)
* 修复一个用老板键隐藏后,打开外部链接,显示的页面位置错误的问题
* 修复一个当弹出窗口不在标签中时,大小不正确的问题
* 修复一个当任务栏在屏幕左方或者上方时,浏览器坐标错误的问题
- 因为一些不稳定因素,暂时去掉了页面内右键菜单的皮肤支持

[浮动按钮]
* 修复一个浮动按钮另存为成功后打开的路径错误的问题
* 修复一个点击右键菜单后页面失去焦点的问题

[其它]
* 修正任务管理器里面出现多个程序的问题。

2.5.2.5442 beta3 [2009-04-15]

[核心]
* 解决了任务栏有时候状态不正确的问题
* 初步解决了多线程下的输入法问题
* 解决了一些网站链接点击无效的问题
* 解决了一些和IE8相关的兼容性问题
* 修正一个设置默认浏览器无效的问题
* 修正DVBBS 发帖不正常的问题

[界面]
+ 页面右键菜单现在支持皮肤了
* 修复一个导致弹出窗口焦点错误的问题
* 修复一个批量关闭标签可能导致出错的问题
* 修复了一个右键菜单复制快捷方式失败的问题
* 解决了一些vista和win7下闪烁的问题
* 修正非激活的标签不能拖拽的问题
* 修正上次访问页面顺序错乱的问题
* 修正保存浏览进程的标签顺序错乱的问题

2.5.2.3272 beta2 [2009-03-13]

[核心]
* 提升了同时关闭多个页面时的性能
* 修正后台页面切换到前台闪烁的问题
* 修正打开本地页面时显示白色页面的问题
* 修正打开外部链接时显示白色页面的问题
* 修正一个导致内存泄漏的问题
* 修正了一个window.close导致崩溃的问题
* 修正了页面内frameborder不显示的问题

[界面]
* 修正了当前页面是空白页时,安装插件页面消失的问题
* 修正在IE8下,设置中心的布局问题
* 修正了分屏时出现空白的问题
* 修正了插件快捷键无效的问题
* 修正一个添加所有标签到收藏夹没有标题的问题

[浏览辅助]
* 修正了切换标签后,键盘对网页的操作失效的问题(142540)
* 在收藏侧边栏,现在右键选择打开全部链接时不再包括子目录中的链接了
* 修正了傲游加速按钮失效的问题
* 修正几个阅读标签相关的问题
* 修正了一个外部链接有时候不重用空白页的问题(142556)
* 修正一个后台打开页面抢焦点的问题

[插件]
* 修正了一个com插件导致主框架死锁的问题

2.5.2.2801 beta1 [2009-03-02]

[核心]
* 优化整体结构和性能
* 解决了些许2.5.1框架存在的问题

......

[广告过滤]
* 解决一个浮动广告过滤误删除的问题

[傲游下载]
* 解决一个批量下载较慢的问题

2.1.3.2430 [2008-08-08]

修正部分影响使用的 bug.

2.1.3.2418 [2008-08-07]

[新增]
* 奥运版插件

[快捷键及鼠标手势]
* 改进了鼠标手势在一些情况下的性能
* 修复在弹出窗口上使用鼠标手势(快捷键)时会作用到当前活动标签的问题

[浏览辅助]
* 一些页面的按键处理问题,如一些Flash页面等
* 解决一些情况下关闭阅读标签后,原页面链接无法打开的问题(85047)
* 一些非法网址访问后,标签内容透明的问题(87064)

[页面内查找]
* 修复一个关闭标签会导致浏览器崩溃或者退出的问题

[界面]
* 解决一个站点图标不显示的问题(E73473)

[FEED]
* 解决一个无法标记为已读的问题

[傲游下载]
* 解决一个下载全部链接时会出现多个傲游进程的问题

[广告过滤]
* 解决一个对过滤结果显示Content Filter的问题

[浏览辅助]
* 解决侧边栏选择"只显示最爱收藏"后"打开全部链接"会打开最爱收藏以外的链接的问题(90892)

[安装程序]
* 安装程序最后一步增加了查看更新内容选项

2.1.2.649 [2008-06-30]

[浏览核心]
* 解决几个浏览器相关的安全问题

[浏览辅助]
* 修正不启用收藏服务时,不自动导入收藏的问题
* 修正发送到桌面等访问系统相关文件夹失败的问题
* 解决一些情况下退出浏览器缓慢的问题

[页面内查找]
* 页面内查找框支持鼠标滚轮切换查找结果
* 页面中没有查找结果时,编辑框变红
* 修正点统计链接,有时会出现空结果的问题
* 修正查找栏 查找文本颜色 与皮肤不一致的问题
* 焦点在查找结果列表中时,支持上下键前后滚动查找结果

[其它]
* 增加了打印的页面设置菜单(需重置菜单栏)
* 解决一个打开DEP时,自动更新程序崩溃的问题

2.1.1.1717 [2008-06-17]

[界面]
* 全新设计的页面内查找工具条
* 全新设计的自动更新模块(暂时还不支持皮肤、插件更新)
* 地址栏图标更新延迟的问题(81712)
* 地址栏下拉时隐藏浏览器会导致出错的问题(79578)
* Explorer崩溃后,系统栏图标不重新载入的问题(79947)
* 多显示器情况下,没有记住最大化所在显示器的问题
* 切换帐号时,有时候会被同步收藏对话框卡住的问题
* 一个分屏模式下关闭页面导致崩溃的问题
* 安全模式下对界面进行的调整不保存
* 增加关闭标签后激活上一个访问的标签模式
* 增加找回密码窗口
* 状态栏按钮拖到网页工具栏后无效的问题(78737)
* 网页工具栏上编码的"自动选择"功能无效的问题
* 在查看菜单中增加了编码子菜单(需重置"菜单栏")
* 尝试解决一个导致GDI泄漏的问题

[皮肤]
* 增加了页面内查找工具栏的皮肤设定

[浏览辅助]
* 一个RSS导致崩溃的问题
* 一个IE6下,中键打开链接时乱码的问题
* 在新标签中打开 Feed 频道页面选项有时候无效的问题(80205)
* 新建帐号时如果有共享帐号,则导入共享帐号收藏

[快捷键及鼠标手势]
* 一个鼠标手势滚动页面的问题

[插件及外部工具]
* 插件命令readFile读取的问题(81122)
* 外部工具的参数"当前网页标题" 无效的问题
* 删除某个插件后,会造成插件栏中的插件排列顺序丢失

[傲游下载]
* 增加了不保存下载历史选项
* 增加了下载错误提示
* 部分网页下载附件后原页面关闭的问题(78679)

[其他]
* 傲游插件、皮肤、语言、过滤包等相关文件不使用下载工具

2.1.0.2082 [2008-05-15]

* 修正侧边栏重新打开不记得之前选择的问题
* 工具栏右键菜单、查看菜单 中增加网页工具栏、侧边栏(需重置菜单栏)
* 解决一些页面上滚、下滚一页无效的问题(76862)
* 将截图质量默认设为高
* 修正中文版本 关联的文件右键菜单显示为 傲游(Maxthon)
* 修正链接上点击右键,在菜单中选择添加收藏时,添加收藏对话框没有自动填写标题的问题(76641)

这是1.X的

1.6.5 build 18 [2008-09-28]

* 起始页恢复为奥运版之前的版本
* 自动删除奥运版专用的几个插件
* 界面右键-自定义对话框上,确定取消的中文语言翻译
* 修改傲游网站、傲游帮助、推广傲游的错误链接
* 翻译服务由雅虎翻译改为谷歌翻译
* 侧边栏搜索精简,去掉失效项目
- 快捷组中去掉无效链接
- 选项-搜索中删除失效搜索串,加入淘宝购物搜索

1.6.4 build 20 [2008-08-14]

* 解决了一个插件退出时造成的问题
* 启用了新的起始页(全新安装用户生效)
+ 加入了奥运新闻快递功能(需启用News插件)

1.6.3 build 80 [2007-10-12]

* 解决多个内部错误

1.6.2 build 60 [2007-08-08]

+ 加入了2.x的防假死功能 [测试]
+ 侧边栏插件加入页面完成事件 'sidebar_tab_complete'
* 修正了一个填写表单的 bug

1.6.1 build 50 [2007-05-31]

+ 搜索框加入自动提示. 在 Maxthon 选项 > 搜索 里面可以开启和关闭
+ Maxthon 选项 > 搜索 中加入选项, 使用旧的多引擎搜索按钮
* 修正 Windows Vista 下窗口大小错位的问题

......

* 增强起始页
+ 添加 RSS 侧边栏右键菜单"放置到起始页"
* 修正部分内部 bug

v1.5 build 95 [2005-10-05]

* 解决默认缩放无效的问题
* 解决有时候点主页按钮无法打开主页问题

v1.5 [2005-09-30]

+ 在注册为默认浏览器的时候,完全截获各种软件对IE的调用。
* 修正了一个造成某些script error的问题。
* 解决一个造成搜索丢失的问题。
* 解决rss侧边栏隐藏的时候,也会显示rss tooltip的问题.
+ 友好的 404 页面
# 改进了去除浮动广告的效率

v1.3.3 [2005-07-31]

+ RSS 侧边栏添加'更多RSS'按钮.
+ 搜索栏实时下来菜单.
* 修正了一个造成 'error load menu' 错误的问题.
+ 支持 Podcasting(播客).
+ 在线更新将记忆更新条目是否选中的状态.
* 内存占用进行了一些调整.
+ feed.maxthon.com , Maxthon Feed 目录.

v1.3.1 [2005-05-31]

+ 新的 RSS 通知弹出窗口.
+ 新的致谢服务 - 收藏服务(测试).
* 在地址栏输入地址的时候, 焦点会保持在地址栏.
+ 在启动对话框加入'离线打开的选项'.
+ 在高级选项加入: 不自动刷新当前页面.
+ 当只有一个空白页面的时候, 不要求退出确认.
* 点击状态栏IP地址, 自动拷贝地址到剪贴板.

v1.2.5 [2005-05-05]

* 修正了网页对话框过滤有时候会造成script error的问题.
* 提供了语言文件自动更新的方式.
* 增强了稳定性.

v1.2.4 [2005-04-21]

* 修正了造成很多script error的问题。
* 解决了一个影响稳定性的问题。

v1.2.3 [2005-04-14]

* 修正 GMail 登陆的问题.
* 加快 Maxthon 关闭速度.
* 增强浏览效率.
* 修正关闭后驻留内存的问题.

v1.2.2 [2005-04-08]

* 修正了一些潜在的安全问题.
* 函数 max_activex 将只可以在本地网页上运行.
* 加强了弹出窗口过滤.
* 修正了几个错误.

当然,更少不了3.X的:(http://gocn.maxthon.com/web/mx3/changelog/index.htm

3.0.0.145

[主框架]
+ 完善站点图标显示
* 修复了与 pitaschio 软件冲突的问题
* 修复了一个网站图标显示问题
[Webkit核心]
+ 增加平滑滚动配置项,默认关闭
* 调整平滑滚动的步长和速度
* 解决了超链接文本的下划线没有重绘的问题
* 解决了滚动条的位置在页面刷新前后不一致的问题
* 关闭了按下鼠标滚轮后的平滑滚动

3.0.0.144

[主框架]
+ 在主框架范围内支持了鼠标和键盘特殊功能键
+ 新的标签管理框架设计,在这种框架下:
     * 解决某些情况主框架崩溃的问题
     * 解决某些情况下页面脱离主框架控制的问题
* 解决有时收藏丢失,重新打开恢复正常的问题
* 解决导入由IE8导出的html收藏文件时出现乱码的问题
[Webkit核心]
+ 增加了使用鼠标滚轮平滑滚动页面功能
+ JavaScript引擎升级,速度最高提升20%
* 解决透明图层创建失败后使用空指针的问题
* 解决访问cctv.com首页出现崩溃的问题

3.0.0.140

[Webkit 核心]
+ 支持DNS预读
+ 支持鼠标和键盘上的特殊键
* 0000751: 基础认证对话框改进:
     * 支持认证对话框中在密码框按下回车提交
     * 支持认证对话框的提示文本里显示认证提示和URL

3.0.0.139

[主框架]
+ 将“停止”按钮与“访问”按钮合并
* 优化批量关闭标签效率,标签-->右键菜单-->关闭其它标签/关闭右侧标签
* 优化退出速度
* 解决 0000833:中文路径切换模式的问题
* 解决0000832:收藏夹按名称排序混乱的问题
* 解决0000831:新添加的收藏位于收藏栏最前端的问题
* 解决0000697:CTRL+T或CTRL+N后,焦点不在地址栏的问题
* 解决0000583:地址栏焦点定位快捷键的输入问题
[Webkit核心]
+ 支持中键按下后的页面平滑滚动
+ 默认禁掉了脚本自动弹出新窗口的支持
* 解决了 Windows7 下登录需要认证的路由器失败的问题
* 支持论坛Ctrl+Enter发帖
* 添加对页面accesskey的支持
* Discuz论坛“发表回复”在极速模式将可正常使用
* 解决页面文本框内键入退格键(Backspace)导致页面后退问题
* 解决 0000829:新浪邮箱极速模式登陆显示浏览器版本太低的问题
* 解决上海移动个人营业厅不能选择的问题
* 解决google首页“更多”超链接不能下拉问题
* 解决小红伞中国论坛的登录时不能选择问题
* 解决小红伞中国论坛注册时不显示验证码的问题
* 解决 0000615: IT168极速模式崩溃的问题
* 解决一些网站的登陆问题
* 解决 0000828:登陆Dz7论坛的时候,问题选择下拉框没有选项的问题
* 解决 0000802:Gmail“更多“菜单问题
* 解决 0000809: Live Mail内某些JS链接点击后无反应的问题
* 解决 0000806:Acid3 测试上的 Alert 出不来的问题
[界面]
+ 增加对站点图标的支持
[地址栏模块]
+ 焦点在地址栏时,键入Alt + D则将地址栏内文字全部选中
+ 地址栏内无输入时,显示提示文字
+ 增加快捷键F4,显示地址栏下拉列表
[在线更新模块]
+ 增加了浏览器在线升级更新功能

怎么样,很长吧,这都是一步一步的走来的。傲游的浏览器进程,现在有3条线。主线是MX2,是现在的主打产品,MX3是副线,但总有一天要转正的,MX1是0号线,基本处于停滞状态,但支持仍然没有停止,有用户需要啊。

4.扩展众多,个性便利

安装插件,就可以享受更多的功能。插件有傲游的开发组提供的,更多的还是众多的傲友们的杰作。可以看天气、查股票、找翻译、听广播......安装插件本身很快捷,可以说是安装使用都是乐趣

皮肤更是少不了,喜欢酷酷的黑色,纯洁的白色,质感的金属,可爱的卡通,都有,成千上万的皮肤供你选。都不满意,没关系!傻瓜式操作的Skin Maker(感谢ABC老大!)帮助你打造自己的皮肤!别忘了上传和大家分享哦!

这么多的功能,难怪:

"Maxthon 出色地将 IE 核心扩展成了一个具有更高安全性和易用性的浏览器, 对于用户而言, Maxthon 将会带来更好的使用体验. 许多微软的员工也在使用 Maxthon, 包括我本人."

- 微软 Windows 产品市场主管 Gary Schare

"Maxthon 的经历带有半传奇色彩, 在没有任何市场宣传的情况下通过单纯的口口相传的方式吸引了成千上万的用户. Maxthon 浏览器的优秀品质是这个奇迹发生的最根本原因."

- Piper Jaffray & Co 市场主管, 著名网络分析家 Safa Rashtchy

怎么样,还在用别的浏览器,换成傲游试试看!身边的朋友还在用IE?劝他们换成傲游吧!

声明:我不是枪手,人家还是规矩的良民啊。同志们要逐一核查我的语句,保证句句属实!

     每天,小蚂蚁很早来上工,并且一来就开始做事。  
  她的生产力很高,并且工作愉快。  
  身为老板的狮子,非常惊奇蚂蚁能自行工作而不须监督。  
  他认为在没有监督下的蚂蚁生产力是如此的好,如果有人监督的话她的生产力应该会更好才对!  
  因此他招募了有丰富经验的蟑螂作为监督员,蟑螂以擅长撰写优良报告而闻名。  
  蟑螂的第一个决定是设立了打卡计时系统。  
  他也需要一个秘书帮助他缮写和键入报告和……  
  他招募了蜘蛛,负责管理档案和监管所有电话。  
  狮子对蟑螂的报告非常高兴并要求他用图表描述生产率和分析趋势变化,因而他能在董事会上用这些资料来报告。
  因此蟑螂必须买一台新的计算机和激光打印机和…  
  并招募苍蝇来管理信息部门。
  曾经是很有生产力和轻松的蚂蚁,恨透了这些耗尽她大多数时间的过多文书作业和会议…!  
  狮子做出结论这是提名蚂蚁工作部门负责人的时候了。  
  这个位置被赋予给了蝉,蝉的第一个决定是为他的办公室买一张地毯和一把符合人体工学的椅子。  
  新的人负责,蝉,也需要一部计算机和一位从他原先部门带来的个人助理,来帮助他准备工作和预算控制策略优化计划…
  蚂蚁工作的部门现在是一个哀伤的地方,不再有人会笑,而且大家变得抓狂…  
  就是那时蝉说服狮子上司,强调要开始进行组织气候调查的绝对必要性。  
  在审查了蚂蚁的部门运作费用后,狮子发现生产力比以前大幅减少。  
  所以他招募了猫头鹰,一位有名望和显耀的顾问来执行稽核工作并建议解决之道。  
  猫头鹰在部门待了三个月并且产生了一份有数册之多的巨大的报告,结论是:「部门成员人数过多…」  
猜猜狮子首先解雇谁?
  当然,是蚂蚁,因为她「显现出缺乏做事的动机并且态度消极」。

以前是一个人闷头写代码。工作久了,发现同行们的代码基本都不能看,当然不少还来自大公司。因此大公司的代码也基本不能看。在学校里就听说过许多同学的憧憬,要进什么大公司学技术,现在看来真是好笑,能学到才怪呢。
游戏行业我还蛮清楚,暴雪不知道,反正一直很崇拜,代码应该牛逼,看招聘就能看出来,不懂游戏的别来这里玩。牛逼。
其他公司,包括所有的日本公司+中国公司代码都不堪入目。

1.首先我觉得写代码之前要了解自己,所为有所为,有所不为,并不是所有优雅的东西都是每个人都能写出来的。如果人人都能写出美的东西,那也不能称之为美了,大便之所以不香是因为你随便就能得到。因此有时候一味去追求好的设计,无异于搬起石头砸自己脚。游戏行业更是这样,面对纷繁复杂的需求,需要对自己有清醒的认识。

2.技术上,一定要了解计算机,二进制编码系统。居然很多计算机系出身的人不懂汇编与现代计算机体系结构,这基本上跟文盲没什么太大区别了。(这里插一句,C++的内存模型大多数也不知道。迭代器的++iter;iter++ 90%程序不知道区别。如果你看了也不知道,你每天要多花3-5个小时补课了。)

3.C++语言各个特性对设计的影响。我见过很多C过来的牛逼程序员,当然更多的是垃圾程序员,懂了继承以后就到处继承,懂了多态不得了了,全是多态,懂了模板,程序基本就不能看了。当然C++也有很多我不满意的设计,比如很多语法正确语义不当的东西,一定程度上也造成程序的可读性不高。

4.数据结构,算法。再快的计算机也禁不起杀手们的调教,我见过内存杀手,显卡杀手,CPU杀手,你不是卡马克,你的杀戮行动不会推动计算机进步,只能使你的程序慢的象蜗牛。数据结构和算法懂太多也不为过,别以为有了stl,有了boost就万事大吉了,记住:没有银弹。

以下说一些设计上的东西。大部分人不用看了,因为看了你们也不懂。
1.项目相关人员应该在项目初期共同制定好口头词汇,项目概念,指定规范的行业概念,特别是游戏行业,我觉得规范特别缺乏,因为大家觉得反正迟早要改,所以不如无规范。这个观念是十分错误的。我认为无论项目有多紧张,规范都是首位的,没有的后果就是项目一直紧张,最后Cancel。(插一句:我认为中国游戏策划是最傻逼的职业之一,如果你不是为了混口饭吃,而是理想要做一名策划的话,我劝你赶紧回头是岸。)

2.模块的划分很重要,便于你考虑每个模块的参与人数和数量分配。并不是一切都要模块化,刚才说了,不要懂了个模块就开始天天模块了。这点我非常同意云风的话,设计所谓框架是最最最不靠谱的事情,当然一开始就设计模块也是很呆的,除非你是本杰恩,否则不推荐,为了抽象的抽象只是让你离真实更远,记住“kiss”法则。好的程序不应该比我们说话还拗口。

3.最重要的!良好的接口所有的特征审核表,把他贴在你计算机任何一个醒目的地方吧
a.功能的正交分解
b.最小化的接口
c.最明确的函数调用语义(注意是语义,不是语法,所以收回你那些狗屁不通的接口吧)
d.最适合出错检查机制(象c++爸爸说的,我写第一句代码时就想到该如何调试了)

4.不要过分痴迷于接口,多写点用户代码,多体验一下用户。别写“公务员”式的接口,很多脑残设计用都没法用。

5.不要吝惜笔墨来描写代码描述及文档,微软为什么牛逼,看看多少人在写msdn文档就知道了。

6.尽量引诱那些愿意使代码高质量的程序员参与进来。很幸运的是我手下有一个。

7.精益求精,如果你把写不仅仅把写代码当作谋生工具的话,我觉得你应该付出多一点。就算他只是你吃饭的本钱,我也觉得你应该有点职业精神。程序员这个行业很特殊,代码臭并不一定很显然,不象外科医生开的刀痕,机械工人做的零件。所以很多东西要靠自己审视。

msdev是visual studio 6.0的IDE程序, devenv是visual studio 2005的IDE程序
两种IDE程序, 既可以工作在图形模式下,也可以工作在命令模式下.
其中, 直接运行msdev 和 devenv将打开vs6和vs2005的IDE界面. 命令行则支持不同的选项.
Msdev的命令行用法:
Usage:
  MSDEV [myprj.dsp|mywksp.dsw]  - load project/workspace
        [<filename>]            - load source file
        /?                      - display usage information
        /EX <macroname>         - execute a VBScript macro
        /OUT <filename>         - redirect command line output to a file
        /USEENV                 - ignore tools.options.directories settings
        /MAKE [<target>] [...]  - build specified target(s)
              [<project> - <platform> <configname>]
              [[<project>|ALL] - [DEBUG|RELEASE|ALL]]
              /CLEAN            - delete intermediate files but don't build
              /REBUILD          - clean and build
              /NORECURSE        - don't build dependent projects
比如projectdsw, 此工程文件由包含很多的子项目.
编译所有项目Debug版本为:
  msdev project.dsw /make "all - Win32 Debug x86"
其中有一个project有许多其他projects组成,就是build_all, 包含了C/C++的动态库,各种工具程序,还有各种示例程序. 编译此project Debug版本就为:
  msdev project.dsw /make "build_all - Win32 Debug x86"
如果还想编译Java的动态库, 在vc6中设置好java后, 运行如下命令即可:
  msdev project.dsw /make "db_java - Win32 Debug x86"
在工程文件外,还有一个用来衡量性能的程序, project_micro,编译该程序的命令为:
msdev project_micro.dsp /make "project_micro - Win32 Debug x86"
即,对于项目文件而言, 其只有一个project, 就是其本身.
对于自动化程序而言, msdev有一个弊端,就是程序返回值.  当项目文件/工程文件不存在的时候, msdev的返回值居然是0!, 和编译成功的一样, 也许msdev认为不存在就是成功吧.
devenv命令的格式就长了一点, 基本语法是:
devenv  [solutionfile | projectfile | anyfile.ext]  [switches]
比如, 为了方便VC2005以上的编译, project将会同时提供vc6所用的dsw文件同时, 也会推出一个sln文件,这sln文件就是solutionfile
使用此文件编译project默认配置的Debug版本为:
devenv project.sln /build "Debug|Win32"
只编译db的动态库则为:
devenv project.sln /build "Debug|Win32" /project db
编译project_micro则复杂点,因为vc2005默认的project file是.vcproj的,而不是.dsp格式的,而test_micro只有.dsp格式的故而,需要先转化为.vcproj格式的, 可以用VCBuild工具:
VCBuild project_micro.dsp /upgrade
这样就产生了project_micro.vcproj
用devenv编译就是:
 devenv project_micro.vcproj /build "Debug x86|Win32"
  之所有配置与上面不同在与, project_micro中是适用于VC6的配置, 转化过来以后, 配置是保留的.
与msdev不同, devenv将文件不存在视为编译失败. 更加适合程序处理.

附:devenv的命令行帮助

Microsoft (R) Visual Studio 8.0.50727.762 版。
版权所有 (C) Microsoft Corp 1984-2005。保留所有权利。

用法:
devenv  [solutionfile | projectfile | anyfile.ext]  [switches]

devenv 的第一个参数通常是一个解决方案文件或项目文件。如果您希望在编辑器中自动打开文件,也可以使用任何其他文件作为第一个参数。当您输入项目文件时,IDE会在项目文件的父目录中查找与该项目文件具有相同基名称的 .sln 文件。如果不存在这样的 .sln 文件,IDE 将查找引用该项目的单个 .sln 文件。如果不存在这样的单个.sln 文件,则 IDE 将创建一个具有默认 .sln 文件名且未保存的解决方案,其基名称与项目文件的基名称相同。

命令行编译:
devenv solutionfile.sln /build solutionconfig [ /project projectnameorfile [ /projectconfig name ] ]
可用的命令行开关:

/Build          使用指定的解决方案配置生成解决方案或
                项目。例如“Debug”。如果可能存在多个平台,
                则配置名称必须用引号括起来
                并且包含平台名称。例如“Debug|Win32”。
/Clean          删除生成结果。
/Command        启动 IDE 并执行该命令。
/Deploy         生成并部署指定的生成配置。
/Edit           在此应用程序的运行实例中打开
                指定文件。如果没有正在运行的实例,
                则启动一个具有简化窗口布局的新实例。
/LCID           设置 IDE 中用于用户界面的默认语言。
/Log            将 IDE 活动记录到指定的文件以用于故障排除。
/NoVSIP         禁用用于 VSIP 测试的 VSIP 开发人员许可证密钥。
/Out            将生成日志追加到指定的文件中。
/Project        指定生成、清理或部署的项目。
                必须和 /Build、/Rebuild、/Clean 或 /Deploy 一起使用。
/ProjectConfig  重写解决方案
                配置中指定的项目配置。例如“Debug”。如果可能存在
                多个平台,则配置名称必须用引号括起来
                并包含平台名称。例如“Debug|Win32”。
                必须和 /Project 一起使用。
/Rebuild        先清理,然后使用指定配置生成
                解决方案或项目。
/ResetAddin     移除与特定外接程序关联的命令和命令用户界面。
/ResetSettings  恢复 IDE 的默认设置,还可以重置为
                指定的 VSSettings 文件。
/ResetSkipPkgs  清除所有添加到 VSPackages 的 SkipLoading 标记。
/Run            编译并运行指定的解决方案。
/RunExit        编译并运行指定的解决方案然后关闭 IDE。
/SafeMode       以安全模式启动 IDE,加载最少数量的窗口。
/Upgrade        升级项目或解决方案以及其中的所有项目。
                并相应地创建这些文件的备份。有关备份
                过程的更多信息,请参见
                “Visual Studio 转换向导”上的帮助。

产品特定的开关:

/debugexe       打开要调试的指定可执行文件。
                命令行的其余部分作为它的参数
                传递到此执行文件。
/useenv         使用 PATH、INCLUDE、LIBPATH 和 LIB 环境变量
                而不是使用 VC++ 生成的 IDE 路径。

要从命令行附加调试器,请使用:
        VsJITDebugger.exe -p <pid>


vcbuild 的命令行帮助

Microsoft(R) Visual C++ 项目生成器 - 命令行版本 8.00.50727
版权所有 (C) Microsoft Corp 1993-2003。保留所有权利。

用法: vcbuild [options] [project|solution] [config|$ALL]

选项:
/clean (/c)     只清除生成输出
/error:<str>    输出到 stderr 时添加到错误行的前缀
/errfile:<file> 将所有错误记录到指定的文件
/htmllog:<file> 将输出记录到指定的 html 文件
                (默认值: $(IntDir)\BuildLog.htm)
/implib         为 DLL 配置创建导入库(不链接)
/info:<str>     输出到 stdout 时添加到信息行的前缀
/link (/l)      执行链接,而不生成源
/logcommands    将命令和响应文件打印到屏幕
/logfile:<file> 将所有输出和生成信息记录到指定的文件
/override:<file> 使用给定属性表文件中的设置
                重写项目设置

/M<number>      指定要运行的并发生成的数量(如果可以运行并发生成)
/msbuild:<opt>  将 <opt> 传递至 msbuild.exe

/nocolor        在输出错误信息和警告消息时不使用颜色突出显示
/nohtmllog      不编写 HTML 生成日志文件

/noimplib       不生成导入库。
                注意: 此选项会重写 /implib。
/nologo         取消显示版本和版权信息
/nondefmsbuild  不要使用位于 .NET
                Framework 安装中的 msbuild.exe 副本
/platform:<str> 只为给定平台生成配置
/implibobjs:<s> 管理员的其他依赖项
/rebuild (/r)   清除生成输出并执行生成
/forcelink      强制链接,而不生成源
/showenv        在 html 生成日志中显示环境
/time           从开始到结束的生成时间
/upgrade        将项目文件升级到受支持的最新格式
                注意: 升级开关不执行生成
                注意: 对于解决方案文件,会忽略此选项
/useenv (/u)    使用 INCLUDE 和 LIB 路径的环境变量
/wrnfile:<file> 将所有警告记录到指定的文件
/warning:<str>  输出到 stdout 时添加到警告行的前缀
@<file>         从指定的响应文件读取选项

默认行为:
===============================================================================
如果没有指定项目,并且目录中只有一个 .vcproj 文件,
将会生成该项目。
如果没有指定配置,并设置了 VCBUILD_DEFAULT_CFG 环境
变量,将会生成该变量指定的配置。如果未设置
该变量,将会生成所有的配置。

默认操作是生成指定的配置,而不执行清除。

还将从 VCBUILD_DEFAULT_OPTIONS 环境变量中读取
选项。
===============================================================================

1.  创建Camera.
      1)通过 NiNew NiCamera的方式获得
      2)通过读取NIF文件,找到适合的Camera Node
2. 创建NiRect<float>对象, 设置Camera视口大小(假设对象为NiRect<float> kRetViewPost)
      1)全屏幕 kRetViewPost = NiRect<float>(0.0f, 1.0f, 1.0f, 0.0f);
      2)特定大小
         假设当前窗口大小800*600, 我们要在大小为200*100, 相对坐标为 (cx = 300, cy = 100)的范围内显示Camera的内容, 那么视口大小为:
         计算视口比例: ratioLeft = cx / 800, ratioButon = 1.0 - (cy + 100) / 600; ratioRight = (cx + 200) / 800, ratioTop =  1.0 -  cy / 600;
         kRetViewPost = NiRect<float>(ratioLeft  ratioRight , ratioTop , ratioButon );
3. 创建NiFrustum对象, 设置Camera截面体比例大小
      NiFrustum(float fLeft, float fRight, float fTop, float fBottom, float fNear, float fFar, bool bOrtho = false)
      fLeft/fRight/fTop/fButtom的值是相对于显示区域的中心点和显示模式而定的.
      1) 显示模式:
            a) 正交模式 (bOrtho = true)
               假如显示区域是200*100的大小, 那么fLeft = -(200/2),fRight = 200/2, fTop = 100/2, fButtom = -100/2;
            b) 非正交模式 (bOrtho = false)
               不管显示区域多大, fLeft/fButtom的值都在[-0.5, 0.0)之间,  fRight/fTop 的值都在(0.0, 0.5]之间; 如: (-0.4, 0.4, 0.46, -0.46)
            正交与非正交的区别在于, 使用非正交模式时, Camera的映像大小会受到与聚焦物体间的距离影响(即可实现缩小放大的功能), 而正交模式则不会.
      2) 显示比例
          在正交模式下通过调用AdjustAspectRatio来设定, 而在非正交模式通过fLeft(fRight)与fButtom(fTop)的比值来设定.
      3) 裁剪距离(例如fNear = 1.0f, fFar = 1000.0f)
4. 通过NiCamera::SetViewPort(const NiRect<float>&)和Camera::SetViewFrustum(const NiFrustum& )分别设定ViewPort和Frustum

  我不向往苏轼那种“大江东去,浪淘尽,千古风流人物”的豪迈气概,也不向往易安那种“才下眉头,却上心头”的婉约凄凉,更不具有杜甫“大庇天下寒士俱欢颜”的伟大胸怀,因为现实不是这样的时代。我所向往的生活,就是快乐幸福、安定和谐。
  “燕草如碧丝,秦桑低绿枝。”在风和日丽的春天,伴着清脆的鸟鸣,携着飘香的鲜花,和一群知心的朋友在和煦的阳光下,嬉戏、玩耍。让碧丝般的小草,轻抚我们疲倦的身体;让轻柔的春风,抹去我们心中的烦恼;让悦耳的鸟鸣,唤醒我们青春的活力。这是我神往的生活。
  “接天莲叶无穷碧,映日荷花别样红。”在烈日炎炎的夏天,最快不过于伙伴们像鱼儿一般在水中自由自在地穿梭,你追我,我赶你,时儿水花四溅,时儿欢声笑语。让清凉的溪水冲刷快要蒸发的身体,使我们依旧像新生的嫩叶一般鲜亮;让水花和笑声一起飞溅,使我们仍然充满生机地迎接下一步的挑战。这是我追求的生活。
  “人道天凉好个秋。”秋高气爽的天气里,拿本书,音乐在耳中穿梭,迎着习习的凉风,坐在窗台边享受闲适的午后,忘了生活的烦恼,忘了学习的压力,忘了时间的流逝,就这样安静的看着书,听着音乐,好好体验一番“少年不识愁滋味”。这是多么惬意的生活啊,我向往!
  “梅须逊雪三分白,雪却输梅一段香。”我没有雪一般的洁白,也不会有梅的百里飘香。在这个老鼠都不愿意出来偷吃的季节,我没有梅与雪的情操,我所向往的只是能像冬眠的动物一般,蜷缩在自己那个温暖而又温馨的空间里,做上一个甜甜的美梦,隐约听到妈妈不停的叫唤时,睁开朦胧的双眼,迎着厨房里飘出的阵阵清香舒展。“睡觉睡到自然醒”一定是人生一件快事。在寒假里让我睡个饱觉吧,这是我渴望的生活!!
  让和煦的阳光抚慰我疲倦的心灵吧;让清凉的溪水冲刷去一身的烦恼吧;让恬静的秋意抚平我内心的躁动吧,让充足的睡眠为我的生活加煤加炭吧!我向往这样的生活!
  听竹声瑟瑟,看世事萧萧。

 

欧盟最近通过法律手段让微软在欧洲销售的Windows 7操作系统中去掉IE浏览器。不过此举遭到了欧洲IE拥护者的反对。欧洲网站jcxp.net称,微软目前因为反垄断诉讼,不得不在Windows 7中删除IE浏览器。微软在自家系统中预装自己的浏览器何错之有?而造成此目前状况的幕后推手正是欧洲浏览器厂商Opera。欧盟在裁定微软去除IE浏览器之后,Opera仍然发表声明说,“这是不够的,Opera认为合理的解决方案是让微软预装多个浏览器,让用户来选择浏览器使用”。

该网站声称,基于以上原因可以看出Opera的真正目的是通过打压不受欢迎的IE浏览器,从而用合法的手段得到更多市场份额。这与百事可乐控告可口可乐可乐罐设计侵权一样可笑。

他们宣称:“够了!我们呼吁全民抵制Opera!”

1136180494300649

基于此,该网站推荐用户使用以下浏览器作为Opera的替代。

PC平台:

Internet Explorer
Mozilla Firefox
Google Chrome
Apple Safari

移动设备:

Skyfire
Iris
Bolt

Opera作为最后一名,被发布不久的Chrome超过而不思进取用这种卑劣的手段.
虽然我不在欧洲,也可能不会使用正版软件(因为没买不起),但还是要抵制Opera.

今天听朋友讲了一个调侃国内制作人的段子,强悍。转发在此,供大家一笑。

某人来游戏公司面试。

考官问曰:
会程序吗?“不会”
懂美术吗?“不懂”
策划会写吗?“不会”
哦!那你只能当制作人了!

打开C:\Windows\System32\drivers\etc\hosts,加入以下内容保存.

202.89.236.211 cn.bing.com
202.89.236.211 www.bing.com
202.89.236.211 bing.com
202.89.236.211 bing.com.cn
202.89.236.211 bing.cn

如果还是打不开运行ipconfig /flushdns清空DNS缓存就可以了.

经过半小时下载,终于下载完成了VSTS2010Beta版,以下是安装截图:

sshot-1 sshot-3 sshot-4 sshot-5  未标题-2 未标题-3 未标题-4 未标题-5sshot-9 未标题-6

第一次启动VSTS2010

未标题-9 未标题-10 未标题-11

这个就是新个界面了,在这个版本中微软正式加入了F#

未标题-12 未标题-13 未标题-14 未标题-15

新功能太多了,去MSDN BLOG上看吧.

作为高级程序员,以至于系统分析员,也就是对于一个程序项目的设计者而言,除了应该具备上述全部素质之外,还需要具备以下素质:

第一,需求分析能力

  对于程序员而言,理解需求就可以完成合格的代码,但是对于研发项目的组织和管理者,他们不但要理解客户需求,更多时候还要自行制定一些需求,为什么这么说呢?

  一般而言,进行研发任务,也许是客户提出需求,也许是市场和营销部门提出的需求,这时候对于研发部门,他们看到的不是一个完整的需求,通常而言,该需求仅仅是一些功能上的要求,或者更正规些,可能获得一个完整的用户视图;但是这都不够,因为客户由于非技术因素多一些,他们可能很难提出完整和清晰,或者说专业性的性能需求,但是对于项目组织者和规划者,他必须能够清醒认识到这些需求的存在并在完成需求分析报告的时候适当的提出,同时要完整和清晰的体现在设计说明书里面,以便于程序员编码时不会失去这些准则。

  程序设计者必须正确理解用户需求所处的环境,并针对性做出需求的分析,举例而言,同样一个软件通过ASP租用方式发布和通过License方式发布,性能需求可能就是有区别的,前者强调的是更好的支撑能力和稳定性,而后者则可能更强调在各种平台下的普适性和安装使用的简捷性。

第二,项目设计方法和流程处理能力

  程序设计者必须能够掌握不少于两到三种的项目设计方法(比如自顶至下的设计方法,比如快速原型法等等),并能够根据项目需求和资源搭配来选择合适的设计方法进行项目的整体设计。

  设计方法上选择不当,就会耽误研发周期,浪费研发资源,甚至影响研发效果。

  一个程序设计者还需要把很多功夫用在流程图的设计和处理上,他需要做数据流图以确立数据词典;他需要加工逻辑流图以形成整体的系统处理流程。

  一个流程有问题的系统,就算代码多漂亮,每个模块多精致,也不会成为一个好的系统。当然,做好流程分析并选择好项目设计方法,都需要在需求分析能力上具有足够的把握。

第三,复用设计和模块化分解能力

  这个似乎又是老调重谈,前面基本素质上不是已经说明了这个问题吗?

  作为一个从事模块任务的程序员,他需要对他所面对的特定功能模块的复用性进行考虑,而作为一个系统分析人员,他要面对的问题复杂的多,需要对整体系统按照一种模块化的分析能力分解为很多可复用的功能模块和函数,并针对每一模块形成一个独立的设计需求。举个例子,好比是汽车生产,最早每辆汽车都是独立安装的,每个部件都是量身定做的,但是后来不一样了,机器化大生产了,一个汽车厂开始通过流水线来生产汽车,独立部件开始具有一定的复用性,在后来标准化成为大趋势,不同型号,品牌甚至不同厂商的汽车部件也可以进行方便的换装和升级,这时候,汽车生产的效率达到最大化。软件工程也是同样的道理,一个成熟的软件行业,在一些相关项目和系统中,不同的部件是可以随意换装的,比如微软的许多桌面软件,在很多操作模块(如打开文件,保存文件等等)都是复用的同一套功能模块,而这些接口又通过一些类库提供给了桌面应用程序开发者方便挂接,这就是复用化的模块设计明显的一个佐证。

  将一个大型的,错综复杂的应用系统分解成一些相对独立的,具有高度复用性的,并能仅仅依靠几个参数完成数据联系的模块组合,是作为高级程序员和系统分析员一项最重要的工作,合适的项目设计方法,清晰的流程图,是实现这一目标的重要保证。

第四,整体项目评估能力

  作为系统设计人员,必须能够从全局出发,对项目又整体的清醒认识,比如公司的资源配置是否合理和到位,比如工程进度安排是否能最大化体现效率又不至于无法按期完成。评估项目整体和各个模块的工作量,评估项目所需的资源,评估项目可能遇到的困难,都需要大量的经验积累,换言之,这是一种不断总结的累计才能达到的境界。在西方一些软件系统设计的带头人都是很年长的,比如4,50岁,甚至更老,他们在编码方面已经远远不如年轻人那样活络,但是就项目评估而言,他们几十年的经验积累就是最重要和宝贵的财富。中国缺这么一代程序员,主要还不是缺那种年纪的程序员,而是那种年纪的程序员基本上都是研究单位作出来的,都不是从专业的产品化软件研发作出来的,他们没有能积累那种产品化研发的经验,这也是没有办法的事情。

第五,团队组织管理能力

  完成一个项目工程,需要团队的齐心协力,作为项目设计者或研发的主管人,就应当有能力最大化发挥团队的整体力量,技术管理由于其专业性质,不大同于一般的人事管理,因为这里面设计了一些技术性的指标和因素。
首先是工作的量化,没有量化就很难做到合适的绩效考核,而程序量化又不是简单的代码行数可以计算的,因此要求技术管理人员需要能真正评估一个模块的复杂性和工作量。

  其次是对团队协作模式的调整,一般而言,程序开发的协作通常分为小组进行,小组有主程序员方式的,也有民主方式的,根据程序员之间的能力水平差距,以及根据项目研发的需求,选择合适的组队方式,并能将责权和成员的工作任务紧密结合,这样才能最大发挥组队的效率。

  一个代码水平高的人,未必能成为一个合格的项目研发主管,这方面的能力欠缺往往是容易被忽视的。

  综上可以看到,作为一个主管研发的负责人,一个项目设计者,所需要具备的素质和能力并不是程序代码编写的能力,当然一般情况下,一个程序员通过不断的总结提高达到了这种素质的时候,他所具有的代码编写能力也已经相当不简单了,但是请注意这里面的因果关系,一个高水平的项目设计者通常已经是代码编写相当优秀的人了,但是并不是一个代码相当优秀的程序员就可以胜任项目设计的工作,这里面存在的也不是智商和课本的问题,还是在于一个程序员在积累经验,逐步提升的时候没有意识到应当思考哪方面的东西,没有有意识的就项目的组织和复用设计进行揣摩,没有经常性的文档习惯和总结习惯,不改变这些,我们的合格的项目设计者还是非常欠缺。

  另外,为防止有无聊的人和我较真,补充一点,本文针对目标是作商业化的软件项目和工程,那些科研机构的编程高手,比如算法高手,比如图象处理高手,他们的工作是研究课题而非直接完成商业软件(当然最终间接成为商业产品,比如微软研究院在作的研究课题),因此他们强调的素质可能是另外的东西,这些人(专家),并不能说是程序员,不能用程序员的标准去衡量。

一个犁牛半块田,收也凭天,荒也凭天
粗茶淡饭饱三餐,早也香甜,晚也香甜
布衣得暖胜丝绵,长也可穿,短也可穿
草舍茅屋有几间,行也安然,待也安然
雨过天青驾小船,鱼在一边,酒在一边
夜归儿女话灯前,今也有言,古也有言
日上三竿我独眠,谁是神仙,我是神仙
南山空谷书一卷,疯也痴癫,狂也痴癫

最近没啥好八卦的,拿这个来充数.HOHO.0day在文章最后面.

|=---------------------------------------------------------------------------=| |=----------------------=[ 专访wordexp ]=---------------------=| |=---------------------------------------------------------------------------=| |=---------------------------------------------------------------------------=| |=-------------------=[ By wordexp ]=------------------=| |=---------------------------------------------------------------------------=|

[目录] 1. 据您所知现在都还有哪些严重的0DAY没被公开? 2. 挖漏洞有什么窍门?可以具体谈谈fuzzer怎样构造样本么? 3. 请问您对0day市场有什么看法? 4. 您建立wordexp这个blog的初衷是什么?为什么叫wordexp,而不是pdfexp或者是exclexp? 5. 请问0day是咋来的? 6. 请问在安全圈子谁是您的偶像? 7. 请问溢出这面红旗还能打多久? 8. 您对我们杂志以及我们小组的发展有什么建议? 一、据您所知现在都还有哪些严重的0DAY没被公开? 主流应用软件方面目前微软公司的IE6/7和PPT 2003 SP3前一阵子就有EXP在外面跑了, adobe公司的FLASH产品中也有一个能被利用的漏洞,拿到的人应该也不少,往后的一到三个月 内就应该出补丁或是有相关新闻,当然以我们目前的视界能看到的只有很少很少的一部分,其 实国外的很多安全机构比如:idefense和zdi可以确定还有不少没被公开的漏洞,只是这些漏 洞可能并不是我们想象的那么通用,成功率也许有限。 其实经常听到朋友问这个问题,说白了就是个消息的打听,这个一方面要提高自已的敏感 度,注意随时关注国内外相关网站的新闻,比如NORTON和MCAFEE的网站经常有一些抓到的0DAY 样本的新闻,有时还有一些细节。还有就是消息的共享,你提前能知道消息并告知朋友,以后 也许人家也会这样对你。 二、挖漏洞有什么窍门?可以具体谈谈fuzzer怎样构造样本么? 这个问题太为难我了,很多人比我更有资格回答这个问题。我只是斗胆胡说几句。 要说窍门,应该是不同软件的洞窍门还不一样,然后还要看挖洞的目的,如果是为了出名 在bugtraq之类的邮件列表上能多露几次脸,那么可以尽可能的找那种用户少关注少的软件特 别是WEB脚本程序的洞。如果是公司有任务必须往CVE、MS上报多少条漏洞那么可以找大公司 的二三线产品的漏洞或是有一定用户数但版本很久不更新的软件的洞,而且这些洞是不一定 要可利用的。如果是为了混zdi、idefense那么可以把fuzz到的POC只要看起来有可能被利用 的都提交上去,也可以找默认情况下不支持的功能的洞,多少可以骗点钱。 如果是要挖卖得出去也能利用的洞,比较通用的一些窍门我能想到的是: 1. 找大众软件生僻功能,生僻协议/文件格式的洞 2. 找几乎没有文档化的功能的洞 3. 新版本软件为了向下兼容所支持的老协议/老文件格式的洞 4. 新版本软件增加的新功能/新格式 5. 不容易fuzz到的洞,比如数据是加密/压缩/编码过的,或是有验效的 6. 某软件某功能刚出了漏洞,马上测试其它同类软件同类功能是否有类似漏洞 7. 多分析老漏洞,善于总结前人挖漏洞的经验技巧,很多不同的洞其实都有相类似的发 掘方式和思路 第二个问题,我以文件型漏洞举例子,fuzz样本的构造,首先是按照上述几个窍门来生成 原始模版,这样相对可以弄出一些人家不太容易fuzz到的数据格式结构,当然在生成原始模版 的前期功课也是很花时间的。做好样本后就是写具体的fuzz程序, 如果对文件格式比较熟, 那么可以节约很多的时间,我比较喜欢的一个办法是fuzz某一些功能的洞,那么就先看格式, 把数据在文件中的位置先手工定位,然后小粒度的测试,要注意的是可能与某功能相关联的数 据比较杂乱数据很可能并不是连续存放的。一般1-4KB的数据要不了多少时间就可以手工测 试完毕。另外具体测试时,数据替换的长度(一次替换几个字节),替换的内容也是非常重要的。 为此我们将提供一个PPT 2003 sp3的“0day”poc,在这个“0day”中数据替换的步进就必须为1 字节,而且值也必须为一个固定的值才能触发出错。最后要注意的就是错误的捕捉,有些洞是 打开就退出进程,有些是打开要停顿一定时间才退出进程,有些是CPU 100%程序挂起,有些是 关闭时触发,甚至有些是文档打开后进行某种操作才会触发,当然还有一种情况进程不退出, 也没有提示,也不出错,象这种情况一般依靠进程/窗口/CPU来检测错误的fuzz就失效了。 三、请问您对0day市场有什么看法? 很复杂的一个圈子,搞技术的不搞技术的啥人都有,不过目前看来很多都是为了各种利益 混这个圈子。简单说就是: 池塘不大但人杂,水深。 四、您建立wordexp这个blog的初衷是什么?为什么叫wordexp,而不是pdfexp或者是exclexp? 初衷就是团队成员工作之余发发劳骚,聊聊八卦的地方,希望大家别见怪。另外这个名字 是因为我们几个人搞客户端的漏洞都比较多,所以随便就取了这么个名字。 五、请问0day是咋来的? 最初当然是某个人找出来的。从这个0DAY的发掘者到最终的用户中间可能会只有一层关 系,也可能会有N层关系,也许直到这个0DAY被补上,使用者也不知道洞是谁挖到的。下面举几 个例子吧: 情况一:A挖到一个0day,但对黑产没有了解或接触,或者也不想靠这个赚钱,或者觉得漏 洞不值钱,或者压根以为漏洞不能够被利用,那么A有可能把这个漏洞公开给类似PST的网站, 网站上的代码通常是POC或是只有一部分细节。这时黑产中的漏洞研究者B,很快会看到这个 消息,并且分析POC然后写出EXP。随后B再联系具体的使用者C或是自已使用。最终或是因为 这个0DAY的POC被公开,也或许因为EXP被杀毒软件公司抓到样本等等,软件厂商推出补丁。在 这个过程中B可能是一个人也可能是很多水平各不相同的人,所以公开的0DAY的EXP有时是千 差万别,有的好用,有的很差。 情况二:A是黑产中的一员,挖到一个0DAY并卖给X,或是接受使用者X的定制并找到0DAY, X偷偷的使用0DAY,这样的情况一般0DAY的生存期会比较长一些,因为这才算是真正的私洞,知 道的人不多。但是在X的使用中,EXP可能被别的黑产从业者Y抓到样本,然后Y把样本提供给技 术员T分析并重新写出EXP,而成果Y和T分享。这时T可能再次把EXP卖给其它的黑产使用者W, 同样X或Y在使用一段时间后也可能交换或者再出手给其它的买家,而且这个过程是可以无限 次重复的,当然时间越久知道的人越多,0DAY就越掉价。 情况三:白帽子A挖到一个0day,并提交给软件厂商B。假设A是个真真正正的白帽子,也假 设这个0day的确也只被A发现了,但0day到了厂商B那儿,最终会找公司内负责安全的部门对漏 洞进行研究,假设这个公司内部的研究者是C,C有可能在圈子中也有其它从事黑产的朋友或是 自已本身就偷偷的在参与黑产,那么在金钱或是感情的作用下C完全有可能违背道德,写出EXP 出售或是使用。象这种情况,0day可能刚出来没几天就被补上了,或者圈子里的很多人根本就 没机会见到0day,知道有这么个东东的时候早就被补上了。 情况四:软件厂商B在代码审计或软件测试过程中发现了漏洞,自已在新版本中偷偷的补 上了漏洞,但并没有在相对老的版本中打补丁,也没有公开任何细节和公告。 研究人员A通过 补丁比较,直接定位出老版本中的漏洞位置,然后动态调试找到触发方式,并写出EXP,由于很 多情况下老版本的软件反而用户更多,所以这样的0day还是有一定的价值。 情况五:研究员A挖到了一个Nday而这个Nday以前在圈内并不为人所知,或是研究员A研究 出某Nday的新利用方式,比如说可以和某某软件结合看起来和以前的EXP完全不一样,或是成 功率有很大的提高。研究员A以较低的价格出售给中间人B。B拿到EXP后,发现圈内还没人有, 成功率各方面也还不错,于是号称0day到处叫卖。如果买家发现问题,B就装傻说自已也上当 了。现在象B这样的人其实也是不少的, 因为很多最终用户对技术并不是特别懂,而且有些 Nday测试起来也不是那么简单,如果刚好EXP效果不错,可能就忽悠过去了。那么我们能看到 的情况就是,江湖传言又出了个0day,或是某某手上有0day,但等呀等就是见不到东东,最终传 言不了了之或是被人家揭发出来。 所以要搞到0day可以自已挖,可以补丁比较,也可以分析已公开信息快速写出EXP,可以买, 也可以换,不要命也可以偷抢骗,技术手段非技术手段都是可能的。也正是因为上述情况的多 样性,所以经常有不怎么搞技术的人,手上也有些0day。 六、请问在安全圈子谁是您的偶像? 我的偶象是那种啥技术不懂,还能发大财的,不PF不行。 七、请问溢出这面红旗还能打多久? 仅仅是溢出这块,我们团队里面意见也大不相同,另外几个成员还是比较乐观的,如果比 较全面的分析这个问题,首先要看站在什么人的角度来看这个问题,是黑产工作者是安全公司 还是软件生产商。假设以黑产工作者的角度来看,那么我是非常非常悲观的,因为溢出漏洞从 技术角度上说:有一个通用性和成功率的问题,直观的说就是有一个效果的问题,再深一点说 就是经济成本的问题。往后走溢出漏洞单从个数上说还是会有很多的。但是现在从编译器和 OS(/GS、/SafeSEH、/DYNAMICBASE、DEP、PEB随机等等)到CPU(NX),软件公司和硬件厂商已 经越来越关注安全问题,几十年来溢出漏洞最关键的命脉无非是数据能够被当做代码来执行, 以前这一点基本上不被软硬件厂商所重视,这几年来人家开始重视了,开始从体系上解决这个 问题,那么这个命脉也将因为各种防范检测技术的运用被卡得越来越死,另外现在很多软件也 有自动升级功能了。 往后走是个什么样的情况,我想应该是上面提到的各种技术随着新型CPU和OS的占有率越 来越高,被越来越多的应用。一个溢出漏洞的成功率将会大大下降,再加上主流软件公司的产 品也越来越安全,以后那种一个漏洞打天下的局面将会越来越少(现在黑产工作者的网马都是 漏洞合集了,无非就是提高成功率),具体的情况也许就是现在我有一个IE的0DAY,100个人看 也许能中10-20个,以后可能手上能用的就变成某个第三方控件的0DAY,100个人看网页就能中 1-2个吧。当你使用溢出漏洞的时间,人力,金钱成本和产出完全不成正比的时候,也基本上算 溢出这面红旗倒下的时候。 估计也就三四年以后,具体指标就是上面提到的各种检测技术的普及率,至少往后的发展 不会是车到山前必有路。如果把挖溢出漏洞当成一个产业,也就是个夕阳产业。 八、您对我们杂志以及我们小组的发展有什么建议? 不走商业路线是正确的,反正你们那群人也不差钱,就不定期搞搞科普工作吧,为普及中 国安全事业做点贡献,同时也可以锻炼你们各方面的能力,继续努力! -EOF-

某类领导
在我们眼里,他们没文化,没水平,没魄力,他一无是处
但是他对上级忠诚,唯命是从,鞍前马后,忠诚得像一条哈巴狗
凭借着这种忠诚,甚至是卑贱,他总是有骨头啃,总是能明目张胆地拿着鸡毛当令箭
这种人创造的,往往都是一种非常压抑的气氛
他不停地给你找事做,他尽可能剥夺你学习时间和上进的机会,他不希望任何他能影响的人,变得比他聪明
你若反对他,他就变成狼狗,悄悄地却狠狠地咬你,咬你的时候他还装作自己也很受伤的样子
若有告状的,上级领导就会出来说:“xx其实是个好人,他也不容易,相互理解支持嘛”
年底,xx必然有各种奖状,“勤勤恳恳、大胆泼辣、敢于管理”
等到某一天,xx求我办事
这事跟他切身利益直接相关,我一手把握的,我才突然感觉他很可怜
但是,谁又来可怜我呢
山不转路转,路不转水转,水不转人转,终于转到老子手上
呵呵,不符合游戏规则的,没办法处理的,统统法办
相信你肯定可以理解我的
就像当年我可以理解你的那样
组织,是有胸怀的
每一个人,总是要有觉悟和勇气为自己的所作所为付出代价的
不能把握的东西,你还不如不去占有

 

评论:出来混总是要还的。这种领导一般还有一些特性,比如中饱私囊、成事不足败事有余。

1.缺乏信任

      该问题源于成员大都害怕成为别人攻击的对象。大家不愿意互相敞开心扉,承认自己的缺点和弱项,导致无法建立相互信任的基础

2.惧怕冲突

      缺乏信任的团队无法进行直接而热烈的思想交锋,取而代之的是毫无针对性的讨论一级无关痛痒的意见。

3.欠缺投入

      团队成员如果不能切实投入,在热烈、公开的辩论中表达自己带意见,即使他们似乎在会议上达成一直,也很少能够真正统一意见,做出决策。

4.逃避责任

      由于们没有在计划或行动上真正达成一致,所以即使最认真负责的人发现同事的行为有损集体利益的时候,也会犹豫不决而不去予以指出。

5.无视结果

     当团队成员把他们的个人需要(如个人利益、职业前途或能力认可)甚或他们的分支部门的利益放在真个队伍共同利益之上的时候,就导致无视结果。

好的团队:

1.成员之间相互信任。

2.针对不通的意见进行直接的辩论。

3.积极投入到决策和行动计划中去。

4.对影响工作计划的行为负责。

5.把重点放在集体成绩上。

缺乏信任的团队中的成员具有以下表现:

1.相互隐藏自己的弱点和错误

2.不愿请求别人的帮助,不愿给别人提出建设性的反馈意见

3.不愿为别人提供自己职责以外的帮助

4.轻易对别人的用意和观点下结论而不去仔细思考

5.不愿承认和学习别人的技术和经验

6.浪费时间和精力去追求自己的特定目标

7.对别人抱有不满和怨恨

8.惧怕开会,寻找接口,尽量减少在一起的时间

充满信任的团队中的成员具有以下表现:

1.承认自己的弱点和错误

2.主动寻求别人的帮助

3.欢迎别人对自己所负责领域提出问题和给予关注

4.在工作可能出现问题时,会相互提醒注意

5.愿意给别人提出反馈意见和帮助

6.赞赏并且相互学习各自的技术和经验

7.把时间和经理花在解决实际问题,而不是形式主义上

8.必要时向别人道歉,接受别人的道歉

9.珍惜集体会议或其他可以进行团队协作的机会

解决办法:

个人背景介绍:

成员工作效率讨论:指出同事为团队做出的最大贡献,以及需要改进的地方,最好从领导开始。

个性及行为特点测试:迈尔斯-布里格斯(Myers-Briggs)性格类型指标(MBTI)

360度完全意见反馈:

集体外出实践:

团队的弱点挖掘:但是很难把握好坏。

团队领导的主要任务:

率先承认自己的不足;更重要的是保证大家承认弱点后不会因此而受到不利影响;最后,真诚的分析自己的弱点

///////////////////////////////////////////////////////

惧怕冲突的团队具有一下特点:

1.团队会议非常枯燥

2.使用不正当手段在别人背后进行人身攻击

3.避免讨论容易引起争论的问题,而这些问题对于企业成功是非常别要的

4.不能正确处理团队成员之间的意见和建议

5.把时间和精力用在形式主义上

拥抱冲突的团队具有一下特点:

1.召开活跃、有趣的会议

2.汲取错有团队成员的意见

3.快速地解决实际问题

4.将形式主义控制在最小限度

5.把大家持不同意见的问题拿出来讨论

解决办法:

1.挖掘引起争论的话题

2.实时提醒

3.其他方式:托马斯-基尔曼冲突模式测试工具(thomas-kilmann Confilct Mode Instrument)TKI

团队领导的主要任务:

团队领导在发动有益争论时,克服维护自己的成员,怕他们受到伤害的倾向。

冷静旁观,顺其发展,即便看上去很乱,也不要随意打断。领导们要以身作则参与争论。

///////////////////////////////////////////////////////

欠缺投入

投入由两步组成:阐明问题和达成共识。优秀的团队很快达成共识。

欠缺投入的两个最重要的原因,就是追求绝对一致以及要求绝对把握。

1.不要追求绝对一致 优秀的团队清楚追求绝对一致的代价太大,所以他们能够互相给予必要的让步。即使不能完全取得一致意见,也可达成共识。因为一个理性的人并不是一定要大家都接受自己的意见,而只是要求别人确实倾听自己的想法并予以考虑。优秀的团队保证大家真正听取每个成员的意见;当无法达成一致时,团队领导有权做出最终决定。

2.不要要求绝对把握 优秀的团队为他们能够齐心协力地为集体制定出的目标奋斗而感到自豪,尽管有时候他们并没有一定可以取得成功的把握。能够做出决定胜过没有决定。与其坐以待毙,不如大胆地行动起来,中间不断调整。

欠缺投入的团队具有以下表现:

1.队伍中的指令和主要工作任务模糊不清

2.由于不必要的拖延和过多的分析而错过商机

3.导致大家缺乏自信,惧怕失败

4.反复讨论,无法做出决定

5.团队成员对已经做出的决定反复提出质疑。

投入的团队具有一下表现:

1.制定出明确的工作方向和工作重点

2.公平听取全体成员的意见

3.培养从失误中学习的能力

4.在竞争对手采取行行动之前把握住商机

5.不存犹豫,勇往直前

6.必要时果断地调整工作方向,不存在犹豫和过多内疚

克服团队欠缺投入的建议:

统一口径:5分钟统一口径

制定最终期限 :

意外和不利情况的分析:

低风险激进法:强迫在调查不足的情况下做出决定。

团队领导的主要任务:

应该比其他成员更能够接受可能做出错误决定的事实。如果问题本身模糊不清,即使最热心负责的员工,也很难去插手别人的工作。

///////////////////////////////////////////////////////

逃避责任

逃避责任的团队具有以下表现:

1.成员对于团队里工作表现突出的同事心怀怨恨

2.甘于平庸

3.缺乏明确的时间观念

4.把责任压在团队领导一个人身上。

负责任的团队具有以下表现:

1.确保让表现不尽如人意的成员感到压力,尽快改进工作

2.发现潜在问题时毫无顾虑地想同事提出

3.尊重团队里以高标准要求工作的同事

4.在管理和集体活动中避免过多的形式主义。

克服团队 逃避责任的方式:

1.公布工作目标和标准

2.定期进行简要成果回顾

3.团队嘉奖

团队领导的主要任务:

建立整体的责任机制。然后担负仲裁人角色。

///////////////////////////////////////////////////////

无视结果

集体成绩:

个人成绩:

不重视集体成绩的团队表现:

1.无法取得进步

2.无法战胜竞争对手

3.失去得力的员工

4.鼓励团队成员注重个人职业前途和目标

5.很容易解体

重视集体成绩的团队具有以下表现:

1.有得力的员工加入

2.不提倡注重个人表现

3.正确对待成功和失败

4.团队成员能够为团体利益牺牲个人利益

5.凝聚力强,不会轻易解体

克服无视结果的建议:

1. 公布工作目标

2. 基于集体成就的奖励(奖励的依据是工作成果而不是“努力工作”的名义)

团队领导的主要任务:

明确表达注重集体成就,克服自我主义,建立客观的团队,奖励那些真正为集体利益做出贡献的成员。

团队评估调查表

说明:请使用一下计分标准衡量您的团队。评估的真实性很重要,应避免反复推敲答案后再选。

3=经常

2=有时

1=很少

----1.团队成员在讨论事务时非常热烈,且无相互提防的情况。

----2.团队成员相互提醒各自的缺点或不利于工作的行为。

----3.团队成员了解同事所负责的工作,知道该工作对集体利益的作用。

----4.团队成员的言行不当或有损于集体时,他们马上真诚地承认错误。

----5.团队成员原以为集体的利益牺牲部门或个人的利益(如申请预算的多少、头衔等)。

----6.团队成员敢于公开承认自己的缺点和错误。

----7.团队的会议令人鼓舞而不枯燥。

----8.尽管开始的时候有分歧,但是会议结束时,大家相信所有人都能够按照达成的一直意见行动。

----9.如果集体目标不能实现,士气将大受影响。

----10. 在会议期间,大家把最重要的,也是最棘手的问题拿出来共同探讨。

----11. 如果有人被解聘,团队成员都很关注这件事。

----12. 团队成员了解彼此的业余生活,而且可以相互攀谈这些内容。

----13. 团队成员讨论问题后能够找到明确的解决方案,并且马上开始实施。

----14. 团队成员相互监督各自的工作计划和进展。

----15. 团队成员不急于得到别人对自己做出的贡献的肯定,但能够很快指出他人的成绩。

第一种障碍    第二种障碍    第三种障碍    第四种障碍    第五种障碍

 缺乏信任      惧怕冲突      欠缺投入      逃避责任      无视结果

第4题:         第1题:       第3题:          第2题:        第5题:

第6题:         第7题:       第8题:          第11题:       第9题:

第12题:        第10题:      第13题:         第14题:       第15题:

总分:          总分:        总分:           总分:          总分:  

8-9分说明您所在的团队不存在这些机能障碍

6-7分说明您所在的团队存在这些机能障碍

3-5分说明您所在的团队存在这些机能障碍严重

《荣枯鉴》 

冯道 著
东东枪 译
 
·圆通卷一
 
善恶有名,智者不拘也。
善恶这种事儿都有个定义,但真正有智慧的人根本不理会。
 
天理有常,明者不弃也。
世上什么事儿都有个规律,真正的明白人不会随意视而不见、自以为是。
 
道之靡通,易者无虞也。
是不是合乎道理,顺应变化的人根本也不关心这个。
 
惜名者伤其名,惜身者全其身。
珍视名声者,名誉易损,爱惜自己者,保全自身。
 
名利无咎,逐之非罪,过乃人也。
名利不是坏事,追名逐利也不是罪过,以此为恶是人的主观想法而已。
 
君子非贵,小人非贱,贵贱莫以名世。
君子没什么可自以为尊贵的,小人也没什么低贱的,尊贵还是低贱都是虚名,不足以称道一世。
 
君子无得,小人无失,得失无由心也。
君子不一定就能得到什么,小人也不一定会失去什么,得到、失去,跟思想境界也毫无关系。
 
名者皆虚,利者惑人,人所难拒哉。
名誉都是虚的,利益才能真正诱人,是人就难以抗拒。
 
荣或为君子,枯必为小人。
事成显贵的,有可能会被传颂为君子;身败落魄的,必定会被当作小人。
 
君子无及,小人乃众,众不可敌矣。
因此,君子永远是少数(因为即使成功也不都是君子),小人永远是多数,多数人的力量,无可抗拒。
 
名可易事难易也,心可易命难易也,人不患君子,何患小人焉?
名誉容易转变,思想境界可以变化,但事情的成败、人生的命运,却难以更改。反正君子小人不是根本问题,你觉得当君子受苦没有什么不好,当小人来享福又有什么可怕的呢?反正名誉根本都不靠谱。
 
 
·闻达卷二
 
仕不计善恶,迁无论奸小。
做官不做官,升职不升职这类事情,根本不是以善还是恶、君子还是小人来作为判断标准的。
 
悦上者荣,悦下者蹇。
让上边的领导高兴的,日子必定好过;让下边的群众高兴的,碰到的困难却会更多。
 
君子悦下,上不惑名。
君子让下边的群众高兴,可上头的领导并不觉得你在群众里的好名声有什么意义。
 
小人悦上,下不惩恶。
小人讨好上头的领导,下边的群众可能会反感,但是,这样的反感并不能对你有任何损伤。
 
下以直为美,上以媚为忠。
下边的群众以道德高尚刚正不阿为美德,上头的领导会把谄媚顺应当做忠诚。
 
直而无媚,上疑也;媚而无直,下弃也。
道德高尚,但是毫不顺应领导,上头就该不信任你了;顺应领导,但是让下头人觉得你不地道,下头人就该反对你了。
 
上疑祸本,下弃毁誉,荣者皆有小人之谓,盖固本而舍末也。
可是,上头不信任你,你就完了——这是根本,下头反对你,顶多是给你来个坏名誉——无所谓的事儿。因此,那些功成名就大富大贵的人都难免被人称作小人,就是因为他们选择了保住根本,顾不得那些没有意义的名誉了。
 
富贵有常,其道乃实。
想富贵么?规律很简单:一切从实际出发。
 
福祸非命,其道乃察。
祸福其实并非命运注定,也有规律可循:看你是否善于观察和判断。
 
实不为虚名所羁,察不以奸行为耻。
一切从实际出发,就别受那些毫无实际意义的虚名的束缚。善于观察判断,就别老以坏人坏事为耻辱,那会搞得很不客观。
 
无羁无耻,荣之义也。
没有名誉的羁绊,没有耻辱感的束缚,你离显贵发达也就不远了。
 
求名者莫仕,位非名也。
要是真想追求名誉,你就别去当官,好名誉不是当官儿可以当出来的。
 
求官者莫名,德非荣也。
要是真想当官,你就别管什么名誉了,道德高尚跟富贵荣华是两码事儿。
君子言心,小人攻心,其道不同,其效自异哉。
君子讲的是道德、理念,小人则专门对付这种道德理念,价值观不同,行为不同,结果自然不同。
 
 
·解厄卷三
 
无忧则患烈也。
什么都不操心,你就离倒霉不远了。
 
忧国者失身,忧己者安命。
不过,操心根操心不一样。为国家操心的人,只能把自己搭上;为自己操心的人,却能乐享安然。
 
祸之人拒,然亦人纳;祸之人怨,然亦人遇。
祸事是人不想要的,但也是人自找的,人人都讨厌有祸事,但人人都难免碰上。
 
君子非恶,患事无休;小人不贤,余庆弗绝。
君子不做坏事儿,但倒霉事儿一个接一个,小人不干什么好事儿,却能够常年乐乐呵呵。
 
上不离心,非小人难为;下不结怨,非君子勿论。
让上头领导对自己完全放心,不是小人就难以做到;让下头群众不怨恨自己,不是君子您就别想了。
 
祸于上,无辩自罪者全。祸于下,争而罪人者免。
上头要找别扭的时候,只有装孙子认罪才能保全自己;要是下头起了负面意见,就只有抢先把责任推到别人头上,装好人,才能免去责任。
 
君子不党,其祸无援也。小人利交,其利人助也。
君子不爱拉帮结伙,所以,真有了祸事,没人会帮助君子。小人有一大帮酒肉朋友,成事解围,全都靠这帮人帮助。
 
道义失之无惩,祸无解处必困,君子莫能改之,小人或可谅矣。
不讲道义不会造成什么实际的恶果,有了祸事没人帮可就必然倒霉。做君子倒了霉只能束手无措,所以,大家选择做小人,也就是可以理解的了。
 
 
·交结卷四
 
智不拒贤,明不远恶,善恶咸用也。
真正的聪明人不拒绝好人,也不疏远坏人,这两款都有用。
 
顺则为友,逆则为敌,敌友常易也。
都是拿顺应自己的人当朋友,拿反对自己的人当敌人——敌人朋友是随时可以转化的。
 
贵以识人者贵,贱以养奸者贱。
用尊重的态度看待别人的人,日后将发达显贵,用轻贱的态度对待别人,日后难免潦倒。
 
贵不自贵,贱不自贱,贵贱易焉。
显贵的人不自重,不知道摆出个尊贵的样子来,而潦倒的人不做轻贱别人的贱事儿,贵贱就该掉个儿了。
 
贵不贱人,贱不贵人,贵贱久焉。
显贵的人永远不轻视别人,潦倒的人永远不尊重别人,贵贱就这么一直下去了。
 
人冀人愚而自明,示人以愚,其谋乃大。
人盼着别人傻自己聪明,但还是成天装傻给人看,这是真正有主意的人。
 
人忌人明而自愚,智无潜藏,其害无止。
不乐意别人机灵自己傻,就玩儿命抖机灵,这就纯属作死。
 
明不接愚,愚者勿长其明。
聪明的人不接触傻子,接触傻子不会让聪明人变得更聪明。
 
智不结怨,仇者无惧其智。
有智慧的人不跟人结仇,仇人不会因为你聪明就怕你。
 
君子仁交,惟忧仁不尽善。小人阴结,惟患阴不制的。
君子人用仁义与人交往,生怕自己不够仁义;小人满怀阴损与人交往,生怕阴损的不够,达不到目的。
 
君子弗胜小人,殆于此也。
君子注定吃小人的亏,就是因为这个。
 
·节仪卷五
 
外君子而内小人者,真小人也。
外表君子作派,内心小人肚肠的,这是真小人。
 
外小人而内君子者,真君子也。
行事手段并不比小人差,内心却有君子情怀的,这才配称真君子。
 
德高者不矜,义重者轻害。
道德高尚的人以道德高自居,就不太知道保重自己,看重仁义的人太重仁义,总是忽视自己面对的危害。
 
人慕君子,行则小人,君子难为也。
人们满嘴说的都是仰慕君子,办出来的却还都是小人事儿,那谁要真当君子,谁就该倒霉了。
 
人怨小人,实则忘义,小人无羁也。
人们口口声声憎恶小人,实际上做事情还是不仁不义,也就是说,做小人其实是没有任何阻碍的——憎恶全是空喊。
 
难为获寡,无羁利丰,是以人皆小人也。
可谁也不愿意当倒霉蛋,因为倒霉蛋比别人倒霉,谁都愿意没有任何阻碍,因为没有任何阻碍就比别人牛B,所以,所有人就都成了小人了。
 
位高节低,人贱义薄。
社会阶层越高,气节越低——因为要装孙子;人越贫贱,义气越是狗屁——因为先要活着。
 
君子不堪辱其志,小人不堪坏其身。
君子最受不了的是精神屈辱,小人最受不了的是身体上的困苦。
 
君子避于乱也,小人达于朝堂。
所以,一有乱子,君子就躲起来自保高洁去了,小人却常能当上国家领导。
 
节不抵金,人困难为君子。
气节比不上金钱实在,所以,人一穷了,就做不成君子——因为讲不起气节。
 
义不抵命,势危难拒小人。
义气也不如生命重要,所以,身处危困就没办法不当小人,因为活命更重要。
 
不畏人言,惟计利害,此非节义之道,然生之道焉。
不管别人如何夸奖或批评,只管自己的利益存亡,这不是追求气节仁义的道理,却是能让你安身立命、生存下来的道理。
 
 
·明鉴卷六   
 
福不察非福,祸不预必祸。
有福气,可你自己不知道,这就白费。有祸事,你自己不能预先避免,那就准得倒霉。
 
福祸先知,事尽济耳。
要是福祸都能提前预知,那就牛B了。
 
施小信而大诈逞,窥小处而大谋定。
偶尔装装实在,大阴谋就能得逞;多偷偷看看细节,大的决策就能搞定。
 
事不可绝,言不能尽,至亲亦戒也。
做事情要留后路,说话要留半句,纵然是亲爹也得防着点儿。
 
佯惧实忍,外恭内忌,奸人亦惑也。
心里头有火儿也要憋着,假装畏惧,心里头满是仇恨也得藏着,假装恭敬,您要能这么办,坏心眼儿再多的人也得上当。
 
知戒近福,惑人远祸,俟变则存矣。
知道克制自己的表现、学会迷惑人,就可以少惹事儿、多成事儿了——反正就是得会变化、会掩饰,您就放心大胆的活着吧。
 
私人惟用,其利致远。
只跟用得上的人套近乎,讲交情,这是可以长远地对你有利的。
 
天恩难测,惟财可恃。
别指望领导的保护,包括领导在内的一切都是钱的孙子。
 
以奸治奸,奸灭自安。
用坏人治坏人,坏人被整死了,整人的那位自己也知道了厉害,也就老实了。
 
伏恶勿善,其患不生。
别干什么坏事儿,但也别傻了吧唧干什么好事儿,这样就能永远不惹事儿。
 
计非金者莫施,人非智者弗谋,愚者当戒哉。
计策不牛逼,就别一条道走到黑;要是知道谁傻B,就别跟丫商量事儿,珍惜生命,远离傻B——如果您自己脑子就不怎么好使,那就更得注意以上这两条儿。
 
 
·谤言卷七
 
人微不诤,才庸不荐。
职位低贱的人,没必要老给他提意见帮助他成长,真没什么本事的那些货,也别到处瞎推荐,推了也没用——该整的要整,该毁的要毁。
 
攻其人忌,人难容也。
攻击一个人,就找他最遭人羡慕嫉妒恨的那一点,大伙儿就都帮你毁他了。
 
陷其窘地人自污,谤之易也。
或者把他推到一个进退两难怎么办都只有难办的境地,别人就会替你开始戳他脊梁骨了,这是简易诽谤法。
 
善其仇者人莫识,谤之奇也。
好好对待那些跟他有仇的人,他们早晚会跳出来毁他,而别人又不知道跟你有关系,这就又上一个层次,算是奇招了。
 
究其末事人未察,谤之实也。
把别人不知道的他干过的各种小事儿揪出来,挑出毛病公诸于世,这是实在有效的毁谤法。
 
设其恶言人弗辩,谤之成也。
把关于他的种种坏话全给散播出去,真真假假的谁也分辨不了,这算直接毁谤成功了。
 
谤而不辩,其事自明,人恶稍减也。
被人毁谤,要是不争辩,只等事实慢慢儿冒出来,旁人的厌恶或许还能稍微减少一些。
 
谤而强辩,其事反浊,人怨益增也。
可要是他非争辩不可,只能是越描越黑,纯属找死。
 
失之上者,下必毁之;失之下者,上必疑之。
上头对谁印象不好了,你看着吧,很快下边的人也该开始毁他了。同样,要是下头的人对谁不满意了,上头很快也将对这人产生怀疑。
 
假天责人掩私,假民言事见信,人者尽惑焉。
借助上头的意见打压别人实现自己的目的,或者借助下头的舆论来说事儿讨取上头的信任,任谁都得上当。
 
 
·示伪卷八
 
无伪则无真也。
没有虚假,也就没有真实。
 
真不忌伪,伪不代真,忌其莫辩。
真的不怕假的,因为假的无论如何也真不了,怕的是真真假假掺合一块儿分不清楚。
 
伪不足自祸,真无忌人恶。
虚伪却又虚伪的不够,那就会给自己惹祸;真诚要是真诚到毫无忌讳,那就是缺心眼儿。
 
顺其上者,伪非过焉。
顺应上头的意思,哪怕是装的,也不是什么过错。
 
逆其上者,真亦罪焉。
悖逆上头的意思,哪怕是真诚,也是找倒霉。
 
求忌直也,曲之乃得。
要求什么东西,别说的太直了,用点技巧含蓄点,才容易成功。
 
拒忌明也,婉之无失。
拒绝什么东西,也别有什么说什么,委婉点儿,照样能达到目的。
 
忠主仁也,君子仁不弃旧。
往往会指向,仁厚的人不忍弃旧,自然也就忠了;
 
仁主行也,小人行弗怀恩。
往往就要起而行之,君子知道通过行动来感恩,这就是仁,而小人就不会这样。
 
君子困不惑人,小人达则背主,伪之故,非困达也。
君子落魄了也不会骗人,小人一发达了就开始在主子背后耍花活,这是因为君子不虚伪、小人虚伪,跟发达不发达毫无关系。
 
俗礼,不拘者非伪;事恶,守诺者非信。物异而情易矣。
如果是虚礼俗套,一副浑不吝偏不服就跟别人不一样的姿态,也不算什么虚伪,明明是坏事儿,还说一不二一条道走到黑的,也算不上什么实诚,得具体问题具体分析。

 
·降心卷九
 
以智治人,智穷人背也。
用智慧来管理下属,智慧什么时候枯竭了,那些人也就都背弃你了。
 
伏人慑心,其志无改矣。
改用攻心,让他们从心里、从灵魂深处被慑服住,那么无论什么时候他们也不会改变方向了。
 
上宠者弗明贵,上怨者休暗结。
被上头宠信的人,别太拿自己当回事儿;被上头瞧不上的,也别私下解党与上头作对。
 
术不显则功成,谋暗用则致胜。
权谋手段,隐蔽的好才能成功,要悄悄地来,打枪地不要。
 
君子制于亲,亲为质自从也。
君子的弱点在于他们珍爱亲属,拿他们亲属做人质相要挟,也就从了。
 
小人畏于烈,奸恒施自败也。
小人的弱点在于害怕比他们更狠的,你就比他们更恶毒,他们就服了。
 
理不直言,谏非善辩,无嫌乃及焉。
说理、劝谏不一定是有什么说什么或者跟人争辩,别遭人恨才能达到目的。
 
情非彰示,事不昭显,顺变乃就焉。
有什么态度、做什么事情,也没必要先弄得天下人都知道,顺应形势该藏着就藏着才能成功。
 
仁堪诛君子,义不灭小人,仁义戒滥也。
仁义二字,能够拖累死君子,却灭不掉小人,还是不要滥施仁义,适度才好。
 
恩莫弃贤者,威亦施奸恶,恩威戒偏也。
施好处别忘了那些你以为不喜欢好处的好人,惩罚措施也别忘了给那些谄媚的坏人来点儿,好事儿坏事儿得掺合者来,得让吃肉的也挨挨板子,挨板子的也来点儿肉尝尝。
 
 
·揣知卷十
 
善察者知人,善思者知心。
善于观察,就能了解人,善于思考,你才能理解人。
 
知人不惧,知心堪御。
了解了他们,你就不会怕他们了;理解了他们,你就已经能搞定他们了。
 
知不示人,示人者祸也。
智慧别让别人看见,让别人看见就会惹祸。
 
密而测之,人忌处解矣。
偷偷地猜度、揣测,不让他们知道,人们对你的嫉恨就会消除掉。
 
君子惑于微,不惑于大。
君子总是在大事儿上明白,小事儿上糊涂。
 
小人虑于近,不虑于远。
小人总是在眼前事儿上考虑多,未来的事儿上考虑少。
 
设疑而惑,真伪可鉴焉。
掌握了这个规律,制造些问题给他们,看看他们的反应,你就知道谁真诚谁虚伪,谁是君子谁是小人了。
 
附贵而缘,殃祸可避焉。
然后认准你觉得有前途的、能富贵的,攀附一下,以后的祸事就可以避免了。
 
结左右以观情,无不知也。
结交各路朋友,留神各路的消息和反映,那就什么事儿也瞒不过你了。
 
置险难以绝念,无不破哉。
常如身处险境般心存忧患,抛掉无关的累赘想法——恭喜您,您已经神光护体,攻无不克了。
 
<完>

建议准备做项目和正在做项目的都来看看,吸取一下教训。

1.过多的工作压到了同一个人身上

在很多小公司[或小项目组]里,总有那么一个核心程序员,负担了几乎所有的编程任务。这个人即使是个天才,也会被繁重的工作压的没有学习和自我提高的时间。

比如设计模式这样的思考方式也是近几年才在中国普及开来,却并非那么容易学习。整天迫于项目压力,就无法领悟新的东西,去用更好的方法解决问题。

独自一个人总揽大局,在项目后期很容易因为想早点结束,而把整个代码补丁打得满目沧夷,只求能解决眼前碰到的BUG而不为长远的结构稳定去考虑了。

结果整个工程无法分出明显的模块,各部分耦合度太高,牵一发而动全身,一直到新的BUG出来后无可救药。

2.过分的弹性工作制

游戏程序员好似天生追求自由的一群人,白天办公室里经常看不到几个人,晚上通宵达旦地在电脑前奋战。不否认好的程序员在精神兴奋的时候可以连续工作写出质量不错的代码,但是停下来时几天没有进展也是时有发生。尤其到了项目后期,一旦BUG重重,程序员备受挫折,仿佛眼前的活永远都干不完,而且调试程序也失去了编写程序时的新鲜感,最终假借弹性工作制的名义,消极怠工拖垮项目的先例已经有很多了。

弹性工作制不等于没有计划,不等于可以随意为之。在项目没有进展,而程序员却整天不干正经事,只知道聊天,浏览网页的时候,程序员并非没有心理压力,他可能只是不知道下一步该怎么做,或是问题太多已无从入手,这说明项目已经失控了。

3.没完没了的变化,没完没了的返工

大家都想把自己的作品做的更好,往往正在做的还是自己的处女作。自己的游戏做了一半,看见新上市的游戏有了什么新玩法,新东西,都想抄到自己的东西里来。

新发现什么技术可以让画面效果更绚,就迫不及待地实现出来看看。又或者,新做出来的东西老是不满意,三天两头地放弃重做,力求完美。最终,游戏老是做不完,看不到尽头。如果从投资方来了时间压力,最后一咬牙将有缺漏的版本交出去,等待着的是玩家没完没了的投诉电话。

4.没有及时的测试

谁都知道软件做完了是需要做测试的,测试出问题就应该修正,这似乎是天经地义的事情,但是落到实处,早期的国产游戏却很少有严格的测试。因为很多人忽略了一点,无论是哪种软件开发方法,测试都不是在软件全部开发完毕后才进行的。等到大家看到项目好像已经完工,这时候对游戏做整体的测试已经完了。必定发现一大堆的BUG,已经到了无处着手的地方,如果只是头痛医头脚痛医脚那还真的不如借这次的经验教训,把程序推倒重来做个更好的设计呢。

5.项目的主导严重地偏向了某一个职位上

早期的游戏大多是程序员主导整个游戏的设计的,程序员说应该怎么做就怎么做,说今天要怎么改就怎么改,甚至没有单独的游戏策划一职,全部由程序员包办。

这对小型游戏倒没什么,对于规模较大的游戏,最终即使游戏程序本身没有大的问题,但是在游戏性方面却让玩家难以接受。作为技术人员,很容易把目光注视到技术的枝节上,而忽略了玩家的感受,大多数情况玩家并不把技术人员洋洋得意的地方放在眼里,游戏毕竟是给人玩的。

后来又出现了策划为主导的游戏,策划拍脑袋一想,我们应该加点什么,那么程序员就日日夜夜地加班完成。如果实在是技术解决不了的还就算了,最怕的是,本来技术解决有问题,可能新加的设计会影响到整体的框架结构、对硬件的过分要求等,暂时像贴皮膏药一样把功能补上去看起来工作得很好,可是早早地就给日后的持续开发留下了隐患。程序员在实现的时候盲目听从策划的安排,没有仔细地全面思考,造成了项目无法完成。

我也听说过美术甚至市场人员为主导的项目,但并没有接触过这样的团队,就不太清楚会出现什么问题了。

总而言之,游戏开发是一个需要大家共同努力的事情。我们应该把自己的思考都带入到开发中,盲目地跟从别人的想法或固执地坚持自己都有可能影响整个项目。

引言:

GameBryo拥有一套复杂的材质系统,这套材质系统可以根据渲染对象的状态和属性生成不同的shader代码,提高了渲染流程的适应性,可以使你定义一套材质能适应多种渲染对象。同时,GameByro将shader的初始化和使用插件化,方便与美术工具集成,并且实现了平台无关性。为了实现这些目的,GameByro使用了一套复杂的机制,本文主要解析GameByro如何生成、编译并使用shader代码。

Shader

GameBryo的shader的接口封装在NiShader中,顶点数据流声明,常量表的访问,渲染状态的设置都是通过这个类(有点类似于D3Deffect)。在程序运行NiShader是由NiShaderFactory负责管理的,NiShaderFactory通过NiShaderLibrary从文件中创建shader,用全局性的map管理起来。NiShaderLibrary通过解析shader文本创建NiShader对象,并调用3D图形接口编译shader代码,将这个类以dll的形式封装,就可以作为插件来使用。NiShader类的创建可以通过解析文件来进行,也可以通过C++的类来定制,只需从NiShader上继承即可。GameByro为PC平台提供了一个NiD3DXEffectShaderLib库,这个库提供了解析shader文件和初始化shader对象的功能。用户只需按GameByro定义的格式编写shader代码的语意和注释,NiD3DXEffectShaderLibrary就会根据文本来创建NiD3Dshader对象,在应用程序中就可以通过Techinqe的名称来访问这个对象。通过这种机制,我们将shader文本文件放在相关美术工具指定的目录下,在工具中就可以使用这些shader,并且能够通过shader的语意和注释为相关参数和变量生成UI,方便美术调试。

WIN平台上的整个流程如下:

1. 应用程序在启动时会先初始化整个shader系统,接下来导入Shader解析库和加载库(dll的形式)。

2. 接下来应用程序将NiD3DShader的初始化工作委托给NiShaderLibrary来处理,NiShaderLibrary首先通过NiD3DXEffectLoader载入所有的shader文本文件,并通过NiD3DXEffectParser解析文本生成NiD3DXEffectFile对象,同时NiD3DXEffectLoader还负责将shader代码编译成二进制形式的GPU程序。

3. 最后由NiD3DXEffectTechnique负责通过NiD3DXEffectFile上的信息生成NiD3Dshader对象。

4. 所有的shader对象创建后,NiShaderLibrary的初始化就结束了,最后由NiShaderFactory负责统一管理。

材质:

NiMaterial为渲染对象生成和定义Shader,NiMaterialInstance为渲染对象分配 和Cach Shader。NiFragmentMaterial提供了一个Shader Tree框架,在它的继承类中可以使用这个框架搭建shader tree。这个机制允许NiFragmentMaterial根据对象不同的渲染状态生成不同的shader代码,Cach在内存中,并保存到磁盘文件。GameByro描述符的概念大量使用,包括前面提到的Shader解析过程也是通过描述符来传递信息。在材质系统中主要使用了NiMaterialDescriptor和NiGPUProgramDescriptor这个两个类做描述符,这两个类中保存的信息是兼容的,都是为了描述某种材质在渲染对象的某一特定渲染状态下所对应的GPU程序的特征。NiFragmentMaterial通过渲染目标的状态和属性生成NiMaterialDescriptor,并通过NiMaterialDescriptor查找匹配的shader,如果找不到,则通过shader tree生成相应的shader程序,并保存到磁盘文件中。当下一次应用程序启动时就可以通过这个文件直接创建NiShader对象。可以说通过NiFragmentMaterial生成的shader代码是为特定的渲染对象在特定的情况下量身打造的。

整个过程的详细流程如下:

1. 在每次渲染一个物体之前,NiMaterialInstance会先判断这个物体的shader程序是否需要更新,如果不需要更新,就直接返回当前Cach的NiShader;如果需要更新, NiMaterialInstance首先会根据物体的渲染状态为其生成一个NiMaterialDescriptor,然后将这个NiMaterialDescriptor和当前Cach住的NiShader进行比较,如果匹配仍然返回当前Cach的NiShader,如果不匹配,将获得shader的工作转交给NiMaterial进行。

2. NiMaterial首先通过这个NiShaderFactory 查询匹配这个NiMaterialDescriptor的NiShader,如果找不到,就通过NiMaterialDescriptor生成NiShader,同时生成一段Shader代码,并保存到以shader描述符中的特征码来命名对应的shader文件。

3. 当获得相应的NiShader对象后,NiMaterialInstance会调用NiShader的SetupGeometry接口,在这个接口中会进行顶点声明。

以下是NiMaterialInstance为Geometry选择shader的代码:

NiShader* NiMaterialInstance::GetCurrentShader(NiRenderObject* pkGeometry,

const NiPropertyState* pkState,

const NiDynamicEffectState* pkEffects)

{

if (m_spMaterial)

{

bool bGetNewShader = m_eNeedsUpdate == DIRTY;

if (m_eNeedsUpdate == UNKNOWN)

bGetNewShader = pkGeometry->GetMaterialNeedsUpdateDefault();

// Check if shader is still current

if (bGetNewShader && m_spCachedShader)

{

bGetNewShader = !m_spMaterial->IsShaderCurrent(m_spCachedShader,

pkGeometry, pkState, pkEffects, m_uiMaterialExtraData);

}

// Get a new shader

if (bGetNewShader)

{

NiShader* pkNewShader = m_spMaterial->GetCurrentShader(

pkGeometry, pkState, pkEffects, m_uiMaterialExtraData);

if (pkNewShader)

{

NIASSERT(m_spCachedShader != pkNewShader);

ClearCachedShader();

m_spCachedShader = pkNewShader;

if (!pkNewShader->SetupGeometry(pkGeometry, this))

ClearCachedShader();

}

else

{

ClearCachedShader();

}

}

m_eNeedsUpdate = UNKNOWN;

}

return m_spCachedShader;

}

如果想通过NiFragmentMaterial实现自己的shader tree就需要在NiFragmentMaterial提供的接口中实现自己拼装代码的逻辑,代码块由NiMaterialLibraryNode封装,NiMaterialLibraryNode既可以直接写C++代码来定义,也可以先写成XML脚本,再由专门的解析工具转换成C++代码。

由NiStandardMaterial生成的shader代码文件如下图所示:

clip_image002

文件名就是NiMaterialDescriptor的掩码,用来标识的shader代码的行为。

Shader代码的行为描述如下:

Shader description:

APPLYMODE = 1

WORLDPOSITION = 0

WORLDNORMAL = 0

WORLDNBT = 0

WORLDVIEW = 0

NORMALMAPTYPE = 0

PARALLAXMAPCOUNT = 0

BASEMAPCOUNT = 1

NORMALMAPCOUNT = 0

DARKMAPCOUNT = 0

DETAILMAPCOUNT = 0

BUMPMAPCOUNT = 0

GLOSSMAPCOUNT = 0

GLOWMAPCOUNT = 0

CUSTOMMAP00COUNT = 0

CUSTOMMAP01COUNT = 0

CUSTOMMAP02COUNT = 0

CUSTOMMAP03COUNT = 0

CUSTOMMAP04COUNT = 0

DECALMAPCOUNT = 0

FOGENABLED = 0

ENVMAPTYPE = 0

PROJLIGHTMAPCOUNT = 0

PROJLIGHTMAPTYPES = 0

PROJLIGHTMAPCLIPPED = 0

PROJSHADOWMAPCOUNT = 0

PROJSHADOWMAPTYPES = 0

PROJSHADOWMAPCLIPPED = 0

PERVERTEXLIGHTING = 1

UVSETFORMAP00 = 0

UVSETFORMAP01 = 0

UVSETFORMAP02 = 0

UVSETFORMAP03 = 0

UVSETFORMAP04 = 0

UVSETFORMAP05 = 0

UVSETFORMAP06 = 0

UVSETFORMAP07 = 0

UVSETFORMAP08 = 0

UVSETFORMAP09 = 0

UVSETFORMAP10 = 0

UVSETFORMAP11 = 0

POINTLIGHTCOUNT = 0

SPOTLIGHTCOUNT = 0

DIRLIGHTCOUNT = 0

SHADOWMAPFORLIGHT = 0

SPECULAR = 1

AMBDIFFEMISSIVE = 0

LIGHTINGMODE = 1

APPLYAMBIENT = 0

BASEMAPALPHAONLY = 0

APPLYEMISSIVE = 0

SHADOWTECHNIQUE = 0

ALPHATEST = 0

NiStanderMaterial就是根据这些掩码的数据来生成shader代码,用户可以通过重载GenerateVertexShadeTree、GeneratePixelShadeTree、CreateShader这些接口来定义自己的shader生成规则。

增加自己的渲染效果:

通过前几节我们可以了解到,想定义自己的材质,一是通过编写shader代码完成。在应用程序初始化的时候,这些shader代码会被初始化成NiShader对象,进一步的通过NiShader对象来初始化NiSingleShaderMaterial对象,并分配给渲染对象。在GameByro默认的渲染流程中,这些步骤都是自动进行的,美术只需在3DMAX插件中为几何体的材质指定Shader程序,导出到nif文件,应用程序就能正确加载并渲染;二是定义自己的NiMaterialFragment类,在类中定义如何生成shader,在应用程序运行时只要将这个类的实例指派给几何体,这个类就会自动为几何体生成shader。这两种方式对于美术人员来说,主要区别在于,采用第一种方法定义的材质,其渲染数据的设置必须严格符合shader代码中所需的数据,否则就会报错。(比如说,顶点数据流必须严格符合shader程序的定义,必须为shader中每个采样器提供格式正确的纹理);而采用第二种方法定义的材质,就有很高的容错和适应性,但是这种容错性和适应性需要自己写代码来完成,GameByro提供的NiStanderMaterial就提供了这套完整的机制。每个贴图槽内的贴图如果你设置就会生成相应的贴图处理流程,如果不设置,就没有这张贴图的处理流程。

为了验证这个过程,笔者尝试增加了一个自己的shader特效——SubSurfaceScattering,简称3s,其原理是模拟光在半透明物体中散射的效果。由于该效果无须预处理过程,所有的贴图均来自磁盘文件,所以比较容易融合到GameByro工作流中。

笔者将在FX COMPOSER中调试通过的fx文件放入SDK中的SDK\Win32\Shaders\Data目录下,在3DMAX的材质面板选择GameByroShader,然后就可在显示shader的组合框中看到文件中定义的Techinqe,选择点击apply按钮,就会出现自定义的参数调整界面。

clip_image004

clip_image006

通过调整参数,最终得到皮肤和玉器的渲染效果如下:

clip_image007

皮肤

clip_image009

玉器

总结

GameByro的这套开发流程非常方便直观,但是美术仅能为shader程序分配静态的数据源,比如说光照图等,CubeMap等;而一些在程序中实时生成的纹理数据则无法整合到美术工具中,比如说阴影图、折射图、反射图等,这些都需要程序写代码来实现。调试起来就不大方便了。大部分情况下,我们只需要使用GameByro提供的NiStanderMaterial就可以完成大部分材质的需求,特殊的效果可以自己写shader或者通过引擎提供的shader库来完成,只有当我们需要即根据复杂的情况做很多不同的处理时,我们才需要重载NiFragmentMaterial搭建自己的shader tree。不过搭建shader tree的程序一般比较复杂,编写难度大,虽然引擎允许通过XML文件来编写材质节点,但是使用起来仍然不方便。GameByro并没有提供相关的后期处理的开发工具,后期处理的特效并不能所见即所得,这方面还需完善。

GameByro为几何体在特定的环境下生成专用的shader代码,具有一定的灵活性,但是也付出了以下代价:

l 分析几何体的属性和当前状态,为其生成shader代码的过程有性能损耗。

l Shader代码生成后会保存到磁盘文件中,这个过程如果不使用异步,可能会引起阻塞。

l 生成的NiShader对象会有内存消耗。由于GameByro默认的实现是将所有的shader文件初始化成NiShader对象,所以当游戏运行的时间久了以后会生成大量的shader文件,这时候内存的消耗可能会很可观,同时加载的时间也会增加。不过可以自己控制加载的流程,在这里进行性能优化。

作者:叶起涟漪

引言:

GameByro作为一款次世代引擎,使用了复杂的材质系统,用来满足各种各样的需求。材质代表了物体受到光照后所呈现出的质感,而这种质感在计算机图形学中需要着色代码来完成,所以当前流行的图形引擎设计是使用被渲染对象的材质与shader相关联,GameByro也不例外。GameByro的材质系统可以通过shade tree生成shader程序,增强了应用程序层对可编程渲染管线的控制能力。

渲染架构概览:

在GameByro中,对象表面的色彩、纹理、光滑度、透明度、反射率、折射率、发光度等可视属性与传统的材质系统分离,独立的成为了对象的渲染属性(NiProperty),而材质(NiMaterial)仅用来对着色程序的封装,这样就实现了渲染数据和渲染方法的分离,降低了耦合性。如上所说的这些可视属性在Gamebyro中会封装成一个属性对象,在应用程序中如果对对象挂载这个属性对象,在GPU程序中就可以访问这个属性对象的值。渲染属性对象可以在创建时指定其类型,如纹理、浮点、矩阵、向量或数组,此外一些全局性的对象也可以通过在Shader中用语意声明为全局object对象,如灯光和摄影机等,这样就可以以同样的方式来访问这些对象上的属性。

GameByro每一帧的渲染(NiRenderFrame)划分为多个步骤(NiRenderStep),每个步骤又包含很多个批(NiRenderClick),NiRenderFrame封装了上层对渲染系统调用的接口,而NiRenderClick则代表了图形硬件的一次绘制操作(对渲染队列中所有的对象的顶点缓存调用DrawPrimitive),当应用程序调用NiRenderFrame的Display接口时, NiRenderFrame会依次调用每一个NiRenderStep的Render()接口,NiRenderStep就会执行所有的NiRenderClick操作。

对于每个NiRenderClick来说,首先要设置视口和渲染目标,也就是渲染数据流的入口和出口。视口建立以后就可以通过关联的摄影机对场景图中的对象进行裁剪(默认的有视口裁剪和遮挡裁剪,此外还可以通过回调函数加入自己的裁剪方式),将未被裁剪的对象放入渲染队列。然后Gambyro会根据材质来对渲染队列中的对象进行排序,让材质相同的对象处于相邻位置,这样可以减少切换shader的开销。

clip_image002

如图所示为帧渲染系统的结构图(简化版)

材质系统:

GameByro中的材质代表渲染对象所采用的方法。前面说过。纹理属性包含了着色所需的原料,那么材质就指定了对这些原料的加工方法。基于当前可编程渲染管线设计,材质就成为连接对象与GPU程序的中间层,应用程序可以通过材质将shader应用于几何体。

NiMaterial类是所有材质的基类,这个类通过一个Map来保存当前应用程序中所有NiMaterial的指针,当然这个Map是静态也就是说相当于全局变量,通过static NiMaterial* NiMaterial:: GetMaterial(const NiFixedString& kName)接口对这个全局的Map进行访问。也就是说,当前环境中所有的NiMaterial对象是通过NiMaterial类来管理的。此外NiMaterial类还通过静态成员变量保存了一个工作路径(即shader文件路径),通过这个路径加载shader文件。NiMaterial就像是一个中介,全权代理对对象的渲染工作。用户可以通过重载NiMaterial来实现自己的渲染机制。每个NiMaterial都是全局性的,可以作用于多个甚至是所有的渲染对象,但一个渲染对象也可以拥有多个NiMaterial,但只能有一个处于激活状态的NiMaterial。

NiMaterial的派生类NiFragmentMaterial提供了对可编程渲染管线完整的控制机制,内部保存了NiShader的哈希表、一个NiGPUProgramCache数组。并且NiFragmentMaterial会生成一个用来编译GPU程序的shade tree(后面会有解释)。这样的话,每个NiFragmentMaterial可以对应多个shader程序,这样就提供了一种机制,在运行时根据不同的运行环境和渲染对象不同的状态,来选择合适的shader程序。在NiRenderClick依次渲染可见集中的每个对象时,首先会判断其是否需要被渲染的标记(flag),如果需要被渲染,则使用NiMaterial::IsShaderCurrent接口判断当前shader(上一次渲染所使用的shader)是否有效,所谓有效就是仍然存在并且可以应用于本次的渲染对象,如果无效,则会调用NiMaterial::GetCurrentShader获得shader,用于本次渲染。NiMaterial::GetCurrentShader会根据渲染对象的属性和当前环境硬件条件来选择合适的shader程序。当然,可以通过重载IsShaderCurrent和GetCurrentShader接口来指定自己的有效性判断规则和如何选择shader程序的方案。 NiFragmentMaterial提供了一套搭建shade tree的框架,用户可以通过重载来搭建自己的shade tree,当然,如果不想通过shade tree的形式生成shader程序也可以,使用NiSingleShaderMaterial可以从文件生成shader程序。

Shade Tree

什么是shade tree呢?我们通常编写的shader代码是线性执行的,即每个pass流程执行的是文本上定义好的shader流程,每一段shader功能模块是按一定顺序依次执行的。如果需要修改流程中的某一部分就需要更改相关的shader代码并重新编译。而shade tree将shader代码以树形结构组织起来,每一个shader代码块(一般是一个函数)都会被编译成一个节点,通过定义输入变量和输出变量来提供数据流的入口和出口,这些节点的插入和删除可以通过应用程序来控制,从而灵活的控制整个渲染过程。这样shader程序中的一些核心模块可以由美术通过工具生成,然后插入到shade tree中,只要输入和输出的接口不变,就无须修改其他代码,从而降低了美术开发shader的门槛。

GameByro通过以下几个类搭建shade tree:

l NiMaterialConfigurator:shade tree被封装在这个对象中,Uniform constants被封装在NiMaterialResource中,而NiMaterialNode封装了相关的shader代码,所有的资源和节点通过NiMaterialResourceBinding连接起来。当所有的连接都确立以后,NiMaterialConfigurator会调用Evaluate接口生成GPU程序和一个输入Uniform资源的集合。

l NiMaterialFragmentNodes:这个类包含了一个shader代码片段的集合,这些代码片段为不同的平台和编程语言所编写。这就为shader程序员提供了更大的灵活性,用以控制他们的代码在不同平台和图形硬件上的表现。例如:在高端平台可以采用高级的shader model提供更好的效果,而在低端平台上可以关闭一些特效来加快速度。

l NiMaterialNodeLibraries:这个类是一个NiMaterialNode的集合,其实也就是一个shader库。它允许shade tree节点完全基于数据驱动。shader库的生成可以通过两种方式,解析XML文件或用XML文件生成C++代码。GameByro提供了相关的解析器和代码生成器。

l NiMaterialResources:shade tree中的Uniform constants,支持多种数据类型,包括Constant、Predefined、Attribute、Global、Object。

固定管线的渲染:

GameByro支持固定管线的渲染,其纹理混合过程如下。

clip_image004

固定管线的着色处理流程

上图很清楚的显示出了每个stage的操作,平行的表示两张纹理的采样是同时进行的,特定情况下右边的纹理可能被忽略。

大部分情况下,应用程序不会使用上面所有的stage,开启或者关闭那个stage可以由应用程序来指定。

以下为多重采样的原理图:

clip_image006

固定管线的纹理多重采样

缺省的着色处理流程:

GameByro提供了一个默认的着色处理流程,封装在NiMaterial的派生类NiStandardMaterial中,这个类执行类似于固定管线的流程,在不同阶段将纹理采样、并将采样到的数据混合到最终的结果中去。

GameByro默认的材质系统的特性如下:

  • Skinned and unskinned transformations. Skinned transformations can support up to 30 bones per draw call.
  • Vertex colors
  • Base maps
  • Normal maps
  • Parallax maps
  • Dark maps
  • Detail maps
  • Bump environment maps
  • Gloss maps
  • Glow maps
  • Decal maps (up to 3)
  • Cubic and spherical environment maps
  • Point/Spot/Directional/Ambient lights contributing to the diffuse, specular, and ambient color. Up to 8 total lights. Per-pixel or per-vertex.
  • Projected light maps. Clipped or unclipped. (Up to 3)
  • Projected shadow maps. Clipped or unclipped. (Up to 3)
  • Texture transforms per map.
  • Per-vertex fog

下图显示为不同的纹理、灯光、材质属性的组合过程,不过需要注意的是,视差贴图和凹凸贴图属于特殊的情况,它们仅仅影响到纹理采样的UV坐标,而并非直接对最后的颜色值产生贡献。视差贴图会改变所有贴图采样的UV坐标,而凹凸贴图仅对环境贴图的UV产生影响。

clip_image008

以上流程完全由shade tree构建,NiStandardMaterial提供了大量的函数接口用于对每个流程的控制,用户可以通过重载相关的接口,插入自己的shade tree节点,修改每一步的操作或处理过程。例如:

virtual bool HandleBaseMap(Context& kContext, NiMaterialResource* pkUVSet,

NiMaterialResource*& pkDiffuseColorAccum,

NiMaterialResource*& pkOpacity, bool bOpacityOnly);

当然,整个流程的顺序和结构修改起来比较困难,如果有需要可以定制自己的材质系统,搭建自己的shade tree。

NiStandardMaterial提供了若干回调函数,这些函数可以动态的修改流程,分割PASS,对shader运行失败进行容错。

l SplitPerPixelLights/SplitPerVertexLights:这两个函数分别作用于逐顶点光照和逐像素光 照,当物体所受的光源数量太多,超过了顶点或像素着色器的能力时,通过这些函数可以将失败的pass分割成两个,如果分割出的pass仍然不能执行,那么函数会被递归调用,直到每个pass只有一个光源为止。

l SplitTextureMaps:这个函数会把对纹理采样的pass进行分割,当纹理查询过多时,顶点或像素着色器就会过于复杂,这时就可能导致shader运行失败。此函数只能迭代一次,生成一个额外的pass。

l DropParallaxMap:这个函数用来从几何体上移除视差贴图,且不产生额外的pass。

l DropParallaxMapThenSplitLights:这个函数首先调用DropParallaxMap移除视差贴图,然后一直调用SplitPerPixelLights直到失败为止。

NiMaterialInstance:

NiMaterial并不是直接与NiRenderObject相关联,而是经过了NiMaterialIstance这个中间层,由它来代理将NiMaterial关联到几何体,它负责调用NiMaterial为NiRenderObject生成NiShader,通过改变NiMaterialIstance上的接口SetMaterialNeedsUpdate,可以决定每一帧NiRenderObject所使用的材质是否需要被更换,通过接口SetDefaultMaterialNeedsUpdateFlag,可以决定当前材质所需的数据(即当前渲染流程所需的数据)是否要被更新。这样每个NiMaterialIstance只能被一个NiRenderObject所拥有,而多个NiMaterialIstance可以共享一个NiMaterial,这样就减少了重复创建NiMaterial的时间和空间上的开销,同时降低了渲染对象个材质之间的耦合度。

如下为材质系统的类结构简化图:

clip_image010

渲染属性:

前面提到过,GameByro将渲染所需要加工的数据全部封装在了NiProperty中,只要在shader中用指定的语法进行声明,就可以访问这些属性的值。

目前引擎中已经定义了12种属性,均派生自NiProperty,分别代表渲染数据的12种不同类型:

l NiAlphaProperty

l NiDitherProperty

l NiFogProperty

l NiMaterialProperty

l NiRendererSpecificProperty

l NiShadeProperty

l NiSpecularProperty

l NiStencilProperty

l NiTexturingProperty

l NiVertexColorProperty

l NiWireframeProperty

l NiZBufferProperty

用户也可以自定义属性类型,但所对应的数据类型要被shader语言所支持。

光照与阴影:

光照与阴影密不可分,因为阴影就是由光照产生的,前面在材质系统中已经提到过光照对着色的影响,这里重点阐述,GameByro是怎样根据光源产生阴影的。由GameByro提供的阴影均基于ShadowMap技术,

但也提供了ShaowVolume的示例代码。

Shadowing System是完全建立在帧渲染系统上的, 通过一个RenderClick生成ShadowMap,然后在正常渲染流程开始之前将ShadowMap更新到可见集内每一个渲染对象上。这样当渲染对象使用NiStandardMaterial时就会根据光源的阴影技术来对ShadowMap进行采样,并将结果与最终的输出颜色按一定比例混合。

阴影系统由以下几个类构成:

GameByro提供了三种类型的Shadow Write Materials,分别为NiPointShadowWriteMaterial、

NiDirectionalShadowWriteMaterial、NiSpotShadowWriteMaterial,适用于三种不同的光源类型。

  • Shadow Technique:这个类封装了阴影算法的细节,包括生成ShadowMap和使用ShadowMap投射阴影。
  • Shadow Render Click: 这个类是一个生成ShadowMap的批,这个类的对象是由shadow click generator负责生成。
  • Shadow Click Validator: Shadow Render Click:通过此类对象判断接受阴影的几何体对于shadow generator来说是否可见。
  • Shadow Map: 每个ShadowMap对象包含一个作为阴影图的纹理,shadowmap对象由shadowManager直接管理,每个shadowmap对象都被一个shadow generator引用。
  • Shadow Cube Map: 同shadowmap作用相同,只是阴影图的纹理类型为CubeMap。主要用于点光源生成的全方向阴影。
  • Shadow Generator: 阴影生成器,每个ShadowGenerator都对应一个NiDyamicEffect(NiLight的基类),也就是为这个NiDyamicEffect代表的光源生成阴影, 生成阴影所采用的技术由对象引用的ShadowTechnique来决定。
  • Shadow Click Generator: 生成ShadowMap的Shadow Render Click都由此类负责创建。这个类为每个ShadowGenerator指定ShadowMap,并负责每帧更新ShadowMap和ShadowMap所对应的变换矩阵。
  • Shadow Manager:所有的ShadowMap、ShadowTechnique、ShadowGenerator、shadow render click对象都由ShadowManager统一管理,并负责使用一个shadow click generator 在每一帧生成一个shadow render click的列表。

阴影系统静态结构如下:

clip_image012整个阴影渲染的流程大致如下:

1. 在应用程序初始化阶段,通过调用NiShadowManager的Initialize()接口实现对整个阴影系统的初始化,此时应用程序会注册所有的ShadowTechnique,并初始化NiShadowClickGenerator。

2. 当我们创建一个NiLight以后,我们可以通过NiShadowManager为这个NiLight新建一个NiShadowGenerator,NiShadowGenerator会通过NiLight的类型来选择合适的NiShadowTechnique,此时NiShadowManager会为新的NiShadowGenerator创建一个NiShadowRenderClick。

3. 当帧渲染系统启动后,NiShadowRenderClick的PerformRendering()接口会被调用,此时NiShadowRenderClick会通过引用的NiGenerator获得阴影生成的着色程序和所需的数据(例如深度偏移),同时通过NiGenerator引用的Camera获得场景图中的可见集。下一步就是对可见集中的渲染对象添加ShadowWriteMaterial并设为激活状态,而ShadowWriteMaterial的类型是根据NiDyamicEffect的类型指定的。最后NiRenderClick就会启动渲染流水线,将可见集中的对象的深度全部渲染到ShadowMap中。

4. 在第一个RenderClick中生成了ShadowMap,下面就要使用这些ShadowMap投射阴影。在每一帧开始之前,用户还可以自己指定不接受阴影的节点,手动将其插入NiShadowGenerator::m_kUnaffectedReceiverList中。在渲染BackBuffer的RenderClick中,首先会对场景图中的节点进行一次遍历,将不受阴影的节点放入NiShadowGenerator:: m_kUnaffectedCasterList的列表。在对每个节点进行渲染时,会遍历NiShadowManager中所有的NiShadowGenerator,判断这些NiShadowGenerator是否对这个节点有影响,判断的规则是此节点是否存在于UnaffectedReceiverList和UnaffectedCasterList这两个链表中,如果存在于任何一个链表,则节点不受此NiShadowGenerator影响,如果受此NiShadowGenerator影响,那么就将该NiShadowGenerator上的ShadowMap和数据更新到节点上的渲染属性中,NiStandardMaterial会根据这些数据选择对ShadowMap采样的方式,并将结果混合到最终的输出颜色中。

值得注意的是,点光源的shadowMap默认的是采用CubeMap实现,用户可以通过接口选择不使用CubeMap实现,当采用CubeMap实现时,光源无法产生软阴影。

渲染系统的扩展:

为了验证GameByro渲染系统的扩展性,笔者尝试着加入了一个后期处理特效Screen Space Ambient Occlusion(SSAO),即屏幕空间的遮蔽,由于仅仅为了熟悉GameByro的渲染流程,所以笔者并未对SSAO算法做深究,仅仅用了自己简化的算法。

在渲染过程中先单独使用一个RanderClick将场景中的深度渲染到一张纹理上,然后在渲染到后台缓冲区的RenderClick中对深度纹理进行采样,执行SSAO算法,将结果混合到最终的结果中。采样点的偏移坐标是通过对一组随机向量进行归一化再乘以0~1之间的随机数而生成的,即长度为0~1之间的随机向量。

PS代码如下:

float VerticalRange:GLOBAL; //控制XY方向采样范围变量,可以在应用程序层对其进行调整

float HorizontalRange:GLOBAL; //控制在Z方向采样范围的变量

float calAO(float2 texCoord,float dw, float dh ) //通过当前像素所标和偏移量计算AO

{

float2 coord = float2(texCoord.x + dw, texCoord.y + dh);

float4 CenterPos = tex2D(DepthSampler,texCoord);

float4 CurPos = tex2D(DepthSampler,coord);

float depthDiff = clamp(CenterPos.z - CurPos.z,0,VerticalRange);

float ao = depthDiff/length(CurPos.xyz - CenterPos.xyz);

return ao;

}

// Pixel shader

float4 PS_SSAO(VS_OUTPUT In) : COLOR

{

float2 texCoord = In.BaseTex;

float depth = tex2D(DepthSampler,texCoord).z;

float ao = 0.0;

float scale = HorizontalRange/depth; //因为采样范围会受深度影响,故除以此系数。

for(int i=0; i<32; ++i)

{

float2 offset = arrRandomPt[i].xy* scale;

ao += calAO(texCoord, offset.x, offset.y);

}

ao/=32;

float4 color = tex2D(BaseSampler,texCoord);

color.xyz *= (1.0 - ao);

return color;

}

最终实现效果如下:

clip_image014clip_image016

SSAO生成的明暗图 无SSAO材质

以下两图上图为无SSAO效果,下图为开启SSAO后的效果。

clip_image018

clip_image020

总结:

GameByro的帧渲染系统是比较灵活,想加入自己的渲染流程是比较容易的,此外由于RenderTarget和RenderView都可以由用户指定,所以想实现自己的shader效果不是很难。然而,NiStanderMaterial的shade tree比较复杂,总共高达6000行代码以上,过程非常复杂,这就是说,如果想实现自己的材质处理流程也要付出相当大的工作量,阴影系统虽然实现了较低的耦合度,但是实现过于复杂,不够简洁高效。

作者:叶起涟漪

★ 你好,我去杀几个人,很快回来。
★ 我去后山和黑山老妖研究吃唐僧的事,有事回来再说。
★ 便秘中。。。。。勿搅。。。
★ 你终于来啦,我找你N年了,去火星干什么了?我现在去冥王星,回头跟你说个事,别走开啊
★ 您所呼叫的用户尚未安装QQ......
★ 你呼叫的人现在不在,当你听到硬盘“咔”的一声,请对着鼠标留言,谢谢......
★ 主人不在。到哪儿去了?就......就是不告诉你!真要找的话,请按住电脑power键4秒钟后留言......
★ 该用户没有回应,可能用户忙,请稍候再试。或按Ctrl+Alt+Del返回.
★ 自杀中,稍后再说...
★ 有事找我请大叫!
★ 你现在连接到的是海狼的冰箱,放入食物后请断线,谢谢合作。
★ 我正在下五子棋,上次分心把裤子输光了。这次再输会被拍裸照!我可不想让人看见,等这盘下完了一定回你。
★ 嘀,这里是自动应答,MM请再发一次,我就与你联系;JJ请再发两次,我就与你联系;GG、DD就不要再发了,因为发了也不和你联系!
★ 腾讯服务器系统崩溃,请稍后再试!
★ 计算机正在处理你的信息,请稍侯,如果长时间没有响应,请重新启动计算机!
★ 你好,现在我在玩一个叫CS(或其他)的游戏,有事请按下电脑上“RESET”键,在听到“嘀”一声之后留言,谢谢
★ 你有权保持沉默,你所说的一切都将被作为存盘记录。你可以请代理服务器,如果请不起网络会为你分配一个。
★ 您使用的QQ是未注册版本。您可以继续使用本软件,但将屏蔽发送短信息的功能。支持国产软件,请您注册新版!
★ 广告之后,马上回来!
★ 正在澡澡哦~~不要偷看~~~嗯~啊~~嗯~啊~~~
★ 在加本人为好友前请详细阅读以下条款:1.未满18岁者请在父母指导下与本人聊天;2.非专业聊天人士,不承担主动招呼义务;3.谢绝你问我答制。在本人不回复的情况下请自觉停止一切信息!
★ 你所呼叫的用户正在系统整理,请稍后再呼。
★ 此人正在被国际刑警组织全球范围内通缉,如果您有此人的消息,请拨打当地报警电话120,请对着电话说如下密语言:我真的不是疯子,我不是疯子,我真的不是疯子!然后汇报你的所在地谢谢合作。我们的专业人员会去保护您的安全。
★ 您的QQ已经中了我安插的病毒,请不断向本人发信,否则本人一有闲暇立刻动手!
★ 您好,QQ今天休假,我是NETANTS......
★ 由于大气电离层影响,与该用户的卫星连接已中断,请稍后再试。
★ 对不起,由于服务器的原因,您刚才发的信息丢失,请重发一面。
★ 机主正在裸奔,机主已奔出服务区。
★ 正在格式化你的硬盘,请稍候......
★ 唉呀~你可真调皮!你看,我话还没说完你又来了~~
★ 嗨~我现在不在,如果有事请在听到“逼”的一声后留言······逼!
★ 对不起,网路不通,请重新发送...
★ 你要机主不在,请等到“嘟~”声后拿起鼠标留言。。。
★ 对不起,您所呼叫的用户不在计算机旁,请你现在立刻猛击你的显示器直到它冒火花为止,听到响声后我会给你回复
★ 你好。这是腾讯服务中心自动回复。收到这条信息表明您的操作系統出了问题。请按Ctrl+Shift+Del
★ 您所呼叫的用户先不再服务区内......可能是网络不通...想解决此类问题...请您将头用力撞向显示器......以保证网络通畅......
★ 本人现在位置:WC; 姿势:下蹲; 脸部:抽搐; 状态:用力中。。。。
★ 注意:使用腾讯移动QQ的用户可能无法立即获取你的留言。
★ 我去吃饭了,如果你是帅哥,请一会联系我,如果你是美女.................................就算你是美女,我也要先吃饱肚子啊
★ 你要和我说话?你真的要和我说话?你确定自己想说吗?你一定非说不可吗?那你说吧,这是自动回复,反正我看不见
★ 你好,我是XXX的自动回复,现在他不在,跟我说什么我也就这几句!
★抽筋中……请勿打扰……
★悟空啊,你想和为师说话么?想说话你就说呀,你不说为师怎么知道你想和为师说话呢?

超仔刚刚推门进来,屁股还没有碰到他的椅子上已经让人感觉到他欢喜轻飘的神色,我抬头望着他眼睛,神色中洋溢的满是欢快。我看着他那兴奋的样子,微微笑着问道:“签完了?结果还可以吗?”
“还不错!”
“能满意就可以,继续努力。”
“嗯。”
我知道超仔刚刚和公司签了新的合同,在新合同里他的工资有了一定的提高,这些都是因为对于他去年的绩效考核成绩还不错应该得到的结果。
年底对于我来说,可真是多事之秋,因为我需要在年底前完成对我团队这些人的一年的绩效评定,这些不但关系到他们年终的奖金,也影响到来年他们工资的涨浮。虽然自己一直讲究的是赏罚分明的做事方法,但是往往对于我来说要清晰分析哪个人在过去的一年中犯了什么样的错,对于这些错误去做一个评定,算其功过,工作不亚于一个项目的开发。一方面如果我评定的尺度太严格,那么最明显的一个影响就是年底年终奖金和来年的工资,在工作中涉及到这部分利益的东西处理起来本身就是敏感,所以自己一直都是平时严厉甚至苛刻,但是到这个时候,我反而会手下留情,只要态度对位,错误可以酌情考虑。对于我来说,一个人的态度决定他的一切。
“我的工作目标就是要替掉你。”这是超仔在面试的时候留给我印象最深的话,也因为这句话我发而对他有不少的好感。人最应该有的是有自信,超仔是刚刚毕业一年的新人,在面试时候做在我前面表情僵硬,全身紧张的他,在我问“你希望进入公司之后,能够有什么养的发展方向时?”这样的回答可能是一种自大,但是在我看来,这也是他的自信。也这是这种自信让我决定录用这个计算能力不算好,但是我觉得各种条件还算合格的小伙子。
当然我也非全凭一句“就要替掉你。”就把小伙子招聘进来,然后放到自己身边使劲搂拧,我想自己还不至于有这种变态的爱好。我喜欢面试的时候让应聘人员都手动填写一份简历,虽然很多时候他们自己都带了一份打印的现成简历,但我还是会让他们把公司那份表格填写完整,虽然很多时候他们自要把内容抄写过去就可以,但是这也是我对他们的第一个考验。很多程序员的字写的都有大师级的水平,对于他们来说,楷书,行书都不足以表达他们的意境,狂草,唯有这个才能体现他们的追求。有不少程序员在填写这个简历的时候,字迹就和天书一样,当然文字也像蛇一般的在纸上盘绕。
对于我来说,我只是通过这张简历看看他对自己的一个态度,我不要求他们的字能够达到书法家的水品,但是至少要工整,整个纸张让人看起来要干净清晰。我很难看到你对目前的工作有多少的渴望,但是我可以通过你写下来的文字看出来你是否重视这个事情,如果连工作机会都不重视,那以后的态度就值得担忧。所以通过这个我也放弃掉不少的人,虽然有些人在和我免谈的时候给我感觉也非常不错,但是如果两者结合在一起评定,如果后面没有做好,那么我只能认为他是学院派的,能说未必能做。
超仔长的不像程序员的样子,一米七五的个子,相貌也有几分帅气,留着平头短发,每日衣着新潮个性。他平时个性活泼开朗,又一次他还请了一天的假,说是去参加超男的选拔赛,结果回来之后,感慨道:“强人太多了,人外有人。”不过自己到没有为被淘汰的事情耿耿于怀,倒是很享受乐在其中的过程。
超仔进入公司的时间也只有半年左右,在这边年里面他不到两个月就给他转正了,比公司规定的三个月试用期提前了一个月多。肯学习和努力的态度让我对自己当初挑选他感到非常满意。在第一个月培训的时候,让他整理了以前遗留的旧的项目,那些项目本身缺少相关部分文档,但是由于项目一直在延续开发,所以久而久之,也就这么一直持续的做下来,那些已经对这些内容滚瓜烂熟的人也就没有心情去做,后来者也之能够在前辈的口传身教的情况下才能了解其中的奥妙,我一直希望能够把这部分资料补充完整。但是由于人手上不足,所以就一拖再拖。
公司对新人有比较详细的培训计划,在这些培训之外,我对超仔说:“你看看这个程序,因为你以后需要维护和开发这个,如果你有时间的话,可以把熟悉开发环境的步骤写成文档,文档的格式可以参考项目组内其他的模板,内容你线考虑一下,但是有一个要求,如果另外一个新人来接触这个程序,我需要他再看了你的稳当之后,就可以把环境搭配起来。些做的方式可以图文结合。”
结果在一周之后,超仔就给我说:“小余,我把那份文档写了一部分,你先看看有什么问题,如果不行的话我再修改。”
很多人都知道程序员非常讨厌写文档,所以很多程序员写出来的文档比写出来的代码还要难读,有时候读这种文档就是一种折磨,比读法律条款还难受,估计很多时候需要和法律文件一样,需要再配套上一本详细的解释才能把问题说明清楚。
但是超仔的文档让我非常满意的地方在两个地方,一方面再环境搭建的时候,用了截图的方式描述,而且每一幅图都是用作图工具简单的剪裁过,只保留关键部分,而避免乐像其他人那样是整个屏幕的图片,在么个图中对于操作关键区域还用红色正方形边宽标注说明,每个图片还有编号。
另外一个是整个文档是用Excel文档做成的,因为公司比较喜欢用Excel做给中开发文档,但我尝试着用打印预览的时候,让我惊奇的事情发生了,总共10页的文档,每一页都调整过,图片没有出现跨页的问题,而且打印的页头和页尾都修改过了,并没有保留上个文档的名称,作者和日期也都是正确的。
“页面打印是你调整过的?”看着文档,我轻声问道。
“我常常听到你让大家发邮件给客户的时候,要预览一下。所以我也就调了一下。”
听到这话,我心中是暗自窃喜,一个新人能够有这样的工作意识和态度,实属可造之才,技术可以学习培养,但是如果你想改变一个人做事态度其难度要远远大于技术上的培养过程。
超仔在后续半年的工作中也有犯了不少的错误,从刚刚开始技术上弱势,但是好学肯问,其进步的幅度不小,也使得他在很快的时间内能够达到对他所定位的能力要求。在于我看来这一切取决于他的态度,态度端正。
“态度端正,学习良好。”我的脑海中突然冒出这几个字,这不是小学时候,老师在每学期的期末成绩单上最喜欢用的两个评语。什么是态度?怎么才能算是端正呢?我在心中问了一下自己:“我的工作态度算不算端正呢?”或许像超仔这样的新人属于上升求学阶段,所以憧憬无限,但是对于我来说呢?当年何尝不是如此,现在还是不是一就有这样的心境呢?
“哎。”想着想着,不由自己叹了口气,难道我老了吗?怎么我还没有感觉到青春灿烂,这青春怎么就没了呢?看看坐在开发室中的其他人:老马,阿毛,木子,超仔,大师, 杰克这几个人,我们应该是活力无限的开发团队。
“Hi,小余,你在吗?”还没等我在继续发愣,MSN上的就弹出消息来。是上海的PM李。
我急忙回过去问有什么事情。
“我刚刚给你发了一封邮件,我把需要像客户移交的内容重新做了一个整理,你再看看有什么问题没有?”
我突然记起来,昨天晚上快接近9点的时候,我还在理发店修头发的时候,就接到李从上海给我打过来的电话,她问我现在有没有先前她发给我的计划列表,因为明天客户需要确认,所以她想今天晚上再把这份计划列表完善一下,如果我笔记本上有备份的话,给她转发一份,结果我刚好也只是把邮件接收到公司的机子上。最后我听到她在电话里说了一句:“那好,我明天早点去公司去修改一下,然后再给客户。”
李在一个月之前已经和公司提出离职的申请,因为她家庭的原因,她需要到国外发展。应该说再过两天她就会到美国去了,她本来是这个项目上海的项目经理,但是对于我来说,她是一个非常优秀的项目经理,从她身长我看到了一个项目能够成功的关键,态度。也就是她的这种工作态度,让整个项目有序稳定的进行。
在听完李的电话之后,我里一直佩服到,这才是工作态度。
作者:Yice(小余)
出处:http://www.yice800.cn