2008年11月12日
#
Game组成员超过Hack组,不过Game的大部分人都不认识,有的甚至没有联系过。
我的好友中还有部分Hack没有联系上,至少应该还有20名左右吧,实际上加起来应该还比Game组的多。
我的好友中大部分应该是搞过C++或WinSDK编程的,至少是学过编程。
怀念从2000年至今的编程学习生涯,这是第三个QQ了,
最早一个QQ上的人大部分现在都应该是大牛了吧,可惜偶还是小弟,悲哀之。
这么多年过去了,发现自己依旧是那么无知无畏。
人一生所寻找的也许就是脚下的路吧,这样的人生才会意义。
这样才过的踏实一点,去年跟一朋友来到福州,来这里做游戏,
等到实际工作中才发现游戏不比传统软件行业,
这里的人比传统软件行业时的人更有想法,但大部分都不切换实际,甚至弱智。
为一点所谓的利益搞来搞去,其实真正的利益在BOSS那里,因为BOSS付出了。
不付出是得不到回报的,搞来搞去只是在牺牲自己的脑细胞。
不坚持原则,不追求完美,不追求质量,不切合实际,不明确目标。
完美的程序员至少是个政治家,虽然我不完美,但我是政治家,不要和我玩政治。
这里没有失败,因为我们只是为BOSS服务的。
损害别人并不能得到什么,因为每个人都选择的权利,因为和谁玩牌都一样。
输掉的只是大家的时间。

The Release builds include optimizaed code, but with the NiMemory system, NiMetrics, and release mode logging enabled. The Shipping builds do not have these systems enabled.
ship 和 release 工程设置基本相同,但没有NiMemory、NiMetrics、release mode logging.更像是非常稳定之后的版本.
2008年10月26日
#
不可否认
选择做程序员 源于真正意义上的兴趣和喜欢
在做程序员的这几年 我的生活也在一步步的提升
但同样 不可否认
在我个人眼里
就像选择其他种类的工作一样
只是一份职业 一种在社会上存身立足的手段
现在呢
又在想 自己以前想过 大家也时不时的都会想 的问题
那就是 程序员的人生 将如何规划
在校时 以及 工作后 都曾这么的想过:
做一个IT从业人员 做一个程序员
做上个一二年
然后 向上提升下 做一个项目经理 什么的
再然后
或许 开一家自己的小软件公司
或许 做一名软件顾问
再或者 开一个网站 开发一个自己的小软件
或者 真的不行的 利用做程序员这几年的积蓄
做一些小买卖 转行 另谋生计
总之 感觉做程序开发将是人生的一个过渡
可若真的按这种思路一过渡
就将是用我人生的青春年华大好时光的五六年 或者更多时间
遗憾的是
至今 对这种付出后的收获
我却没有把握
曾听有人言(这一定是国人说的):
一年管理成富翁
三年市场路路通
十年技术一场空
这话每每想来 心里都不免有些低落
低落的不是现在
而是在现在看来 自己一两年或几年后的生活
没有着落 没有依靠
而那时的自己
或许做了项目经理
薪资在才做程序员的后辈们看来 已很是不低
但却可能远远不够日常生活的进一步开支
因为我们每个人每时每刻都有让生活越来越好的念头和目标
我们不想自己上去了 又下去了
不想自己 由前几年刚毕业的 蓝领代码工人
好不容易辛苦努力才做到今天的 白领项目经理
接着却因年事问题 薪资待遇问题 而沦为 房奴 车奴
我们不回避 人生将由
1.幼年-童年-少年-青年
2.成年-壮年
3.老年
这三段的划分 也不忌讳自己真的有一点老不中用了
但我们不能容忍自己在
从三十岁到五十岁
这段时间里 碌碌无为
而现在
我们站在目前自己做程序员的角度
去看三五年后的而立之年
我们心里没底
我们站在而立之年的程序员的角度
去看自己30-50的人生成熟和收获的黄金时期
我们更多的可能看到的是灰暗和苦涩
那么
早知如此 何必当初
想问大家 也是在问自己 一句
程序员的人生 该将如何规划?
(
希望成功的前辈们 能多多赐教
也希望有同样思考的同辈们
能说说自己好的想法和规划
或许
这个问题
不单单是属于做程序员工作的同行们
也可能是属于所有现在 没有自己的事业 正在工作着的 各行各业的同志们
我思 故我在
没有对明天的思考 明天的我 也许就没有美好的未来
也许换种环境更好
比如出国
至少不会有职业歧视
至少技术与业务一视同仁
至少会认为每个人的工作同样重要
)
*注:转载,部分修改.
2008年10月19日
#
由于项目的原由最近接触了很多优秀的项目,其中包括HTML排版引擎,以下对其做下简单的介绍和比较.
现在浏览器的内核引擎,基本上是三分天下:
- Trident: IE 以Trident 作为内核引擎。
- Gecko: Firefox 是基于 Gecko 开发。
- WebKit: Safari, Google Chrome 基于 Webkit 开发。
- Trident
Trident (又称为MSHTML),是微软的窗口操作系统(Windows)搭载的网页浏览器—Internet Explorer的排版引擎的名称,它的第一个版本随着1997年10月Internet Explorer第四版释出,之后不断的加入新的技术并随着新版本的Internet Explorer释出。在未来最新的Internet Explorer第七版中,微软将对Trident排版引擎做了的重大的变动,除了加入新的技术之外,并增加对网页标准的支持。尽管这些变动已经在相当大的程度上落后了其它的排版引擎,如Gecko、WebCore、KHTML及Presto。
Trident引擎被设计成一个软件组件(模块),使得其它软件开发人员很容易的将网页浏览的功能加到他们自行开发的应用程序里。微软提出了一个称为组件对象模型(COM)的软件接口架构。供其它支持的组件对象模型开发环境的应用程序(如:C++及.NET)存取及编辑网页。例如,由C++所撰写的程序可以加入浏览器控件里,并透过Trident引擎存取当前显示在浏览器上的网页内容及网页的各种元素的值,从浏览器控件触发的事件亦可被程序撷取并进行处理。Trident引擎所提供的所有函式库可以透过与 mshtml.dll这个档案的连结而达成撰写程序时所需要的功能。
除此之外,微软还有另一个网页浏览器排版引擎,称为Tasman,它是使用在「Internet Explorer for Mac」的排版引擎。相较于Trident,Tasman引擎对网页标准有较佳的支持。与普遍的看法相反的是,微软已经停止了麦金塔计算机版本的 Internet Explorer的开发,但Tasman的开发仍旧持续, 新版本的Tasman引擎仍被应用在一些微软产品上,如:麦金塔计算机版本的Microsoft Office。
使用Trident引擎的浏览器有很多,比如Maxthon,腾讯TT,MyIE等等,但Trident只能应用于Windows平台.
- Gecko
Gecko是套开放源代码的、以C++编写的网页排版引擎。目前为Mozilla家族网页浏览器以及Netscape 6以后版本浏览器所使用。这软件原本是由网景通讯公司开发的,现在则由Mozilla基金会维护。 这套排版引擎提供了一个丰富的程序界面以供互联网相关的应用程式使用,例如网页浏览器、HTML编辑器、客户端/服务器等等。虽然最初的主要对象是Mozilla的衍生产品,如Netscape和Mozilla Firefox,现在已有很多其他软件现在利用这个排版引擎。Gecko是跨平台的,能在Microsoft Windows、Linux和Mac OS X等主要操作系统上运行。
Gecko是最流行的排版引擎之一,其流行程度仅次于Trident.
使用Gecko引擎的浏览器有Firefox, 网景(6至9), SeaMonkey, Camino, Mozilla, Flock, Galeon, K-Meleon, Minimo, Sleipnir, Songbird , XeroBank.
-
WebKit
WebKit是Mac OS X v10.3及以上版本所包含的软件框架(对v10.2.7及以上版本也可通过软件更新获取)。 同时,WebKit也是Mac OS X的Safari网页浏览器的基础。WebKit是一个开源项目,包含了来自KDE项目和苹果公司的一些组件。
目前使用WebKit 引擎的浏览器主要有:Safari(apple出品),Midori,chrome(google出品)等。
WebKit拥有清晰的源码结构、极快的渲染速度。
现代游戏已经不能没有声音,所以音频引擎成为游戏引擎中不可缺少的一部分.这是一篇介绍现代音频引擎的文章(http://hard.zol.com.cn/labs/2003/0520/60986.shtml).FMOD音频引擎(http://www.fmod.org)是一个非常不错的音频引擎,其使用也比较简单,下面做一些简单介绍:
一.基本准备
它是免费的,你可以从它们的主站上下载API等文件.之后,你需要添加头文件和库文件,如下(C/C++):
fmodvc.lib 用于 Microsoft Visual C++ 和 Codewarrior fmodbc.lib 用于 Borland fmodwc.lib 用于 Watcom fmodcc.lib 用于 LCC-Win32 libfmod.a 用于 MingW and CygWin fmod-3-7.lib 用于 GCC
(参考:http://www.gamedev.net/reference/articles/article2098.asp)
之后,只要添加fmod.h头文件后就可以使用了.
二.开始使用
1.初始化
开始播放声音前,需要进行初始化,很简单:
FSOUND_Init (44100, 32, 0);
第一个参数是输出HZ,第二是最大软件信道数可以不管也不会增加CPU负担,第三个参数可以设置一些标志可以不设置则赋值为0.
2.基本常识
FMOD将音频分为声音(sound)和音乐(music)两种.前者如:.MOD, .S3M, .XM, .IT, .MID, .RMI, .SGT or .FSB
等,后者如: .WAV, .MP2, .MP3, .OGG or .RAW等.二者使用不同的函数处理.都可以通过采样后流的方式来处理.不过小文件一般通过采样方式,它可以多次播放但占用内存.大文件通过流方式,减少内存消耗.
3.播放音乐
首先定义一个FMUSIC_MODULE类型变量来作为文件句柄.然后就可以通过FMUSIC API来实现,如:
装入文件:
handle=FMUSIC_LoadSong("YourFileName");
FMUSIC_PlaySong(handle);
音量控制:FMUSIC_SetMasterVolume (handle, 255);后面的参数在0~255之间,值越大声音越大.
暂停播放:FMUSIC_SetPaused (handle, true);
重开始:FMUSIC_SetPaused (handle, false);
循环播放:FMUSIC_SetLooping (handle, true);
停止播放:FMUSIC_StopSong (handle);
释放音频内存:FMUSIC_FreeSong (handle);
下面是一个命令模式下的例子:
#include <conio.h>
#include "inc/fmod.h"
FMUSIC_MODULE* handle;
int main ()
{
// 初始化
FSOUND_Init (44100, 32, 0);
// 装如
handle=FMUSIC_LoadSong ("canyon.mid");
// 只播放一次
// 播放midi文件时请关闭循环播放
FMUSIC_SetLooping (handle, false);
//播放
FMUSIC_PlaySong (handle);
// 按任一键结束
while (!_kbhit())
{
}
//释放
FMUSIC_FreeSong (handle);
FSOUND_Close();
}
4.播放声音
4.1 采样(Sample)方式
先定义FSOUND_SAMPLE类型变量,然后就可以使用FSOUND系列函数来实现,如:
装如文件:
handle=FSOUND_Sample_Load (0,"YourFileName",0,0,0); //除文件名外的参数用于多采样或其它等
FSOUND_PlaySound (0,handle);
设置音量:FSOUND_SetVolume (handle, 255);
暂听:FSOUND_SetPaused (handle, true);
重新开始:FSOUND_SetPaused (handle, false);
停止:FSOUND_StopSound (handle);
释放:FSOUND_Sample_Free (handle);
下面是一个简单的例子:
#include <conio.h>
#include "inc/fmod.h"
FSOUND_SAMPLE* handle;
int main ()
{
// 初始化
FSOUND_Init (44100, 32, 0);
// 装载和播放
handle=FSOUND_Sample_Load (0,"sample.mp3",0, 0, 0);
FSOUND_PlaySound (0,handle);
// 按任一键结束
while (!_kbhit())
{
}
// 释放
FSOUND_Sample_Free (handle);
FSOUND_Close();
}
4.2 流(stream)方式
先定义一个FSOUND_STREAM 类型变量,然后:
装入文件:
handle=FSOUND_Stream_Open("YourFileName",0, 0, 0);
FSOUND_Stream_Play (0,handle);
提示:3.7版本之前的方式是不一样的.
停止:FSOUND_Stream_Stop (handle);
释放:FSOUND_Stream_Close(handle);
其它和前面是一样的.下面是一个简单的例子:
#include <conio.h>
#include "inc/fmod.h"
FSOUND_STREAM* handle;
void main ()
{
//init FMOD sound system
FSOUND_Init (44100, 32, 0);
//load and play sample
handle=FSOUND_Stream_Open("sample.mp3",0, 0, 0);
FSOUND_Stream_Play (0,handle);
//wait until the users hits a key to end the app
while (!_kbhit())
{
}
//clean up
FSOUND_Stream_Close(handle);
FSOUND_Close();
}
5.关闭
FSOUND_Close ();
参考:
A Quick Guide to FMOD by Joachim Rohde(http://www.gamedev.net/reference/articles/article2098.asp)
FMOD wiki(http://www.devmaster.net/wiki/FMod)
2008年10月10日
#
看到Fox发表关于
成员函数的消息映射的文章,也忍不住发表的一点自己的观点,希望对大家有所帮助。
其实也就是COMMAND模式的简单实现,看代码吧。
1. XGUIEventHandlerPointer.h
namespace XGUI
{
class EventHandlerSlot
{
public:
virtual ~EventHandlerSlot() {};
virtual void execute(const EventArgs& args) = 0;
virtual void* getClass() = 0;
};
template<typename T>
class EventHandlerPointer :
public EventHandlerSlot
{
public:
typedef void (T::*EventHandler)(const EventArgs&);
public:
EventHandlerPointer() :
d_undefined(true),
d_object(NULL)
{}
EventHandlerPointer(EventHandler func, T* obj) :
d_function(func),
d_object(obj),
d_undefined(false)
{}
virtual ~EventHandlerPointer() {}
void execute(const EventArgs& args)
{
if(!d_undefined)
(d_object->*d_function)(args);
}
void* getClass()
{
return static_cast<void*>(d_object);
}
protected:
EventHandler d_function;
T* d_object;
bool d_undefined;
};
}
2. XGUIWidget.h
namespace XGUI
{
//
class Widget
{
public:
template<typename T> void addWidgetEventHandler(WidgetEvent EVENT, void (T::*function)(const EventArgs&), T* obj)
{
mWidgetEventHandlers[EVENT].push_back(new EventHandlerPointer<T>(function,obj));
}
void addWidgetEventHandler(WidgetEvent EVENT, EventHandlerSlot* function)
{
mWidgetEventHandlers[EVENT].push_back(new EventHandlerPointer<T>(function,obj));
}
bool Widget::fireWidgetEvent(WidgetEvent EVENT, EventArgs& args)
{
// If there are no User defined event handlers we are done.
if(mWidgetEventHandlers[EVENT].empty())
return false;
// Execute registered handlers
std::vector<EventHandlerSlot*>* userEventHandlers = &(mWidgetEventHandlers[EVENT]);
for(std::vector<EventHandlerSlot*>::iterator it = userEventHandlers->begin(); it != userEventHandlers->end(); ++it )
(*it)->execute(args);
return true;
}
// .
};
}
以上只为部分代码。
2008年9月22日
#
摘要: 作者:炎龙工作室 千里马肝 版本:v1.0 最后更新日期:2002-3-30 绪言 在游戏中,因为我们是中国人麻,通常都需要显示汉字,比方说交待剧情。而对于文字的显示,英文的显示要较其简单得多,因为只有26个字母,就算再加一些标点、符号什么的,用一张位图,就可以足以显示所有的单词了,而相关实现技巧,也比较轻松。 而中文的显示方法,要复杂得许多。记得原来在DOS下,汉字的显示都是读的UCDOS的点阵...
阅读全文
2008年9月18日
#
头文件,
处理憔悴,
编译器,
报错如风雪。
是谁混淆基本类,
惹变量是非。
虚基类,
构造轮回,
动态堆,
字符串唤不回。
纵然代码已经成灰,
内存不灭。
循环如三千东流水,
我嵌套一瓢爱了解,
只恋函数的递归。
你发如雪,
定义了离别,
我指针指向了谁,
邀明月,
让地址皎洁,
爱在数组里倾颓。
你发如雪,
初始化眼泪,
我联编继承了谁,
数据醉,
编程的岁月,
我用后悔,
刻电脑崩溃的碑。
啦儿啦 啦儿啦 啦儿啦儿啦
啦儿啦 啦儿啦 啦儿啦儿啦
去约会她斜扎儿马尾只因为学C++学到了崩溃
http://www.cppblog.com/Lee/archive/2008/09/17/62108.html
2008年9月13日
#
int RussianMul(int n, int m)
{
int remain = 0;
while(n != 1)
{
// odd
if (n % 2 != 0)
{
n = (n-1)/2;
remain += m;
m *= 2;
}
// even
else
{
n /= 2;
m *= 2;
}
}
return m + remain;
}
2008年9月8日
#
上周,“番茄花园”作者洪磊被警方带走,传出的罪名是涉嫌侵犯微软著作权,也就是俗称的“盗版”。(8月24日北京晨报)
从番茄花园的站长被拘捕、番茄花园网站改版开始,“番茄门”开始成为网络间仅次于奥运会的热门话题。与当初人们对“珊瑚虫事件”的反应有些类似,有一部分网民开始为番茄花园叫屈,“支持番茄花园”式的呼吁此起彼伏。
对于部分网民的这种反应,我理解他们的苦衷,但从更长远的方向看,笔者又反对这种支持番茄花园的举动。我想对他们说:为了我们自己的利益,请不要支持番茄花园。
支持番茄花园就意味着支持盗版、支持盗版就将我们置于被动的地位,这是一个很浅显很直白的道理。网民们并非不懂这些,只是因为弱者的激愤才有了前面那些不正常的支持。盗版产生并且泛滥的主要原因是消费者的经济条件与正版软件的销售价格难以匹配,如果我们普通人的财力足以接受售价上千元的微软系统并且不拿它当回事、如果微软的系统免费或者价格低的与盗版别无二致,那盗版不大可能会有源头也不大可能会有市场。但在垄断和经济条件面前我们普通消费者是弱者,所以支持廉价甚至免费的盗版这个错误的选择成了部分网民在番茄花园站长被抓后第一反应。
实际上,网民们支持番茄支持盗版的想法有些天真,他们也许认为只要我们用盗版支持盗版的话微软就无可奈何、微软就有可能因此蒙受巨大的损失。但是,部分网民的支持盗版能改变微软独霸天下的垄断地位吗?只能是加强这种地位;部分网民的支持盗版能够使微软的“天价”降低吗?这近乎于天方夜谭。支持盗版只能让微软有足够的理由在知识产权方面对中国指手画脚、支持盗版只能让微软的垄断地位毫发无损、支持盗版只能让微软的天价居高不下、支持盗版只能让国产软件业继续没落,支持盗版,对我们有什么好处?一点好处也没有。
我们普通百姓希望自己使用的软件有低廉的价格(最好是免费)、简便的操作、能够得到保障的质量,但很难实现,所以才会退而求次选择盗版。可如果正版具有远胜于盗版的优点的话你还会用盗版吗?很明显,我们当然会去用正版。那么,如果我们的政府能凭借法律的力量强迫微软实现上述目标的话,我们的目的不就达到了吗?所以,我们不应该寄希望于用盗版去打击微软,这违反了法律;我们应该推动政府用法律去制裁微软,因为已经有了微软在欧洲和美国被起诉的先例。
如果我们某些人还在为番茄花园的倒掉惋惜的话,那说明我们很短视;如果我们还在为支持番茄花园摇旗呐喊的话,那我们是在拖《反垄断法》的后腿。这对我们毫无益处。我原来以为“番茄门”是微软拖延时间的一个手段,后来我反过来一想,这何尝不是我们《反垄断法》解决微软垄断问题的一个良好契机呢?
廉价或者免费不是我们的终极目标,从长远看我们应该有更远大的理想。我想劝那些支持番茄的人们几句:你不愿意花钱,你可以去用Linux,如果使用不习惯,你可以学习或者等待,但为了我们自己的利益,请不要去支持番茄花园。