QiaoQiao webserver所支持的特性列表如下:
@HTTP1.1
@Keep-alive
@不限制HTTP请求头大小
@不限制GET URL长度(标准中本来也没有此限制)
@不限制POST数据大小
@内置的图像URL Alias
@内存cache
@代理模式
@压缩日志
@MIMEType
@动态图像压缩
@内置的URL定制解析
@自定义HTTP错误页
不支持的或暂不支持的特性列表:
×暂不支持CGI
×不支持Rewrite
×不支持VirtualHost
×不支持WebDAV
×不支持Frontpage扩展
程序完全依赖Linux 2.6+内核,暂不考虑移植。
QiaoQiao是专为静态文件,尤其是图像显示优化设计的WebServer,功能和扩展性的设计出发点与通用服务器如Apache等不同,无需对比。
《百战天虫》是一款接近10年的休闲游戏,通过控制几只小虫,用各种武器,各种技巧打击对方的小虫最终获得胜利的方式进行。后来,基于它的游戏模式又衍生出《疯狂坦克》等著名游戏。
《百战天虫》国内目前处于僵死状态,symbian平台的手机版,也一直不是正式版本。不过这个游戏的操作赶和趣味性非常好,而且适合联机对战。我们决定clone这个游戏的flash版本。
《百战天虫》有多个克隆,包括像开源社区中著名的Hedgewars,我们选择这个游戏不仅仅是因为它的性质适合我们的需要,更重要的是我们都喜欢这个游戏,觉得它好玩。
目前,前端部分已进入开发阶段,最终的角色形式和游戏名字均未定。
May 15th, 2009 in
Projects | tags:
游戏,
百战天虫,
联网 |
No Comments
前几天借公司里朋友项目的机会,开始写了一个关于音频的小东西。原本的要求是像Samplitude这类的多轨录音软件,把几条音频流按要求混合,找了好多个,都是需要有音频设备支持的,很少有文件级工具,于是自己动手了一下。
我随便给取了个名字,叫BS.Sndmix,是个纯命令行的工具,支持WAV,MP3和ogg输入,本来打算同时支持对等格式的输出,可是libvorbisenc和libmp3lame鼓捣了两天还没弄利索,相关文档和实例几乎没有,所以现在只支持输出WAV。
程序的输入本来是一大堆参数,后来觉得这样输入太麻烦,对一些细节参数也不好控制,于是自我发明了一种smx格式的输入文件,用来表示输入输出的各种参数。一个例子如下:
# This is a simple sound mix file
# By Dr.NP <np@bsgroup.org>
[output : output.wav]
samplerate : 22500
channels : 1
[input : b1.wav]
panning : -30
scale : 1.2
start : 5.3
[input : b2.mp3]
panning : 30
scale : 0.6
start : 12.67
[input : b3.wav]
scale : 0.3
start : 1.0
[input : b4.ogg]
start : 8.0
# End of file
其中#开头的作为注释,不参与解析,一直延伸到行尾。
[output:文件名]表示输出文件,文件格式是单纯依靠扩展名来识别的,下面是参数列表。接受的参数有samplerate(采样率)、channels(音轨数。单声道1,立体声2。我还真的几乎没见过多声道的文件)、bitrate(流量,只在mp3和ogg时生效)。
每个配置文件中只有第一个[output]段生效,而且必须指定文件名。其它的[output]会被忽略。
[input:文件名]可以有多个,分别是每一个输入文件的参数。接收参数有:panning(声道偏移,只在多声道文件中有效,-127左 - 0中 -127右,支持浮点)、scale(放大比,0 - 正无穷,默认为1.0,即原始比例,这个参数用来调整各条轨道在最终输出结果中的音量比例)、start(开始时间,单位为秒,支持浮点)、resample(重置采样率)
程序解析这个文件之后,会扫描所有合法的输入文件列表,如果有MP3或OGG,会创建临时文件进行解码,之后进行混合。
也许出于实验学习的目的,我使用了4个不同的库来进行编码解码工作。MP3->RIFF使用的是libmpg123,OGG->RIFF使用的是libvorbisfile,RIFF->MP3(还没写完)使用的是libmp3lame(这个太有名了,可惜连个像样的文档都没有),RIFF->OGG(也没写完)使用的是libvorbisenc。同时,原始RIFF操作用的是libsndfile。这个程序简直是一个音频操作库大集合~
目前可以完整实现输入的解码,混合,重置采样率等工作,而且输出文件会自动调整采样率和声道数以适应最高要求。只是我对音频的实际编码理解还不到位,现在生成的输出(尤其有各种panning、scale和混合采样率的情况)偶尔会有爆音。
速度还是可以接受的……
下面是一次执行过程:
./bssndmix sample.smx
BS.Audio toolkit, audio file mixer
Version 0.0.1 by Dr.NP
Checking sound file…
Input file : b1.wav
Format : Microsoft PCM WAV
Frames : 8799887
Samplerate : 44100
Channels : 2
Playing time : 199.5439 sec(s)
Starting time : 5.3000 sec
Scale : 1.2000
Panning : -30.0000
Input file b2.mp3 has the format <MP3>, starting convertion…
bssndmix_file_pcm_.MEHth8 created, OK
Input file : b2.mp3
Format : MPEG layer 3
Frames : 8073839
Samplerate : 44100
Channels : 2
Playing time : 183.0802 sec(s)
Starting time : 12.6700 sec
Scale : 0.6000
Panning : 30.0000
Input file : b3.wav
Format : Microsoft PCM WAV
Frames : 10173359
Samplerate : 44100
Channels : 2
Playing time : 230.6884 sec(s)
Starting time : 1.0000 sec
Scale : 0.3000
Panning : 0.0000
Input file b4.ogg has the format <OGG>, starting convertion…
bssndmix_file_pcm_.UA9EzM created, OK
Input file : b4.ogg
Format : OGG Vorbis
Frames : 8908415
Samplerate : 44100
Channels : 2
Playing time : 202.0049 sec(s)
Starting time : 8.0000 sec
Scale : 1.0000
Panning : 0.0000
Mix starting…
Output file samplerate increased to 44100
Output file channel increased to 2
Output file : output.wav
Samplerate : 44100
Channels : 2
Format : Microsoft PCM WAV
81739680 bytes memory allocated for output buffer
Mixing … Writing to RIFF file …10217460 frames done.
OK
Temporary files cleaned
我在考虑要不要把这个作为一个独立的项目来做~
经过一段时间的思考和尝试,现在正在为第一个引擎的类型做选择,是否定位在45度斜角+第三人称视角,还是非网格物理引擎,或者是棋牌引擎,很快就会敲定下来,并着手准备。
晚上在准备引擎的地图工具时,由于有一个看似无礼的需求——获取外部swf中的class列表,在google上到处翻,最终是看到了两位高人的解决办法,基本是走入了swf文件内部格式,于是挪用了一部分代码,扩展了comodo的LoaderBase,使它可以返回被加载的swf中的类列表,这样地图工具才可以在选择了一个地图资源库后,显示库中的所有元件,供选择和拖动。
工具应该是AIR或者flash的,直接用win32程序操控swf,目前我还没有这种能耐~~
April 3rd, 2009 in
Underlife | tags:
class,
comodo,
swf,
列表,
破解 |
2 Comments
BS.Play项目先扩展为服务器端平台和Flash客户端引擎两部分,服务器端开发代号依然使用“Comoro”这个有点神秘色彩的名字,客户端引擎的开发代号为“Comodo”。这是一个音乐术语,含义为“自在地”(节奏),我选择了和“Comoro“只有一个字母之差的词来作为客户端的开发代号,表示了这两部分之间紧密的关系。
目前做了一点小尝试,做了一个移动动画,放在了我家里的破机器上:http://54np.net/bsp/
刚才改了服务器端的一个很小但是很严重的bug,新的版本地址依然不变。Comodo的代码现在部分是纯AS3的,写一点加一点,地址为:http://www.54np.com/mirror/comodo.tar.gz
迟疑了相当长的时间(对我来说),终于打算走进游戏的前台。我最近开始学习OpenGL,并且在看卡马克大师的q3。做3D引擎估计我还早,现在可能有想法的只有Flash的2.5D引擎,类似乐土的风格,用来制作MMO或者别的类型的Flash联机游戏。
服务器端引擎暂时还是沿用Comoro的代号,我更新了一个基本算是可以使用的版本,并且部署了一份在外网。同时我写了一个简单的PHP连接器,用来查看服务器的实时状态: http://220.194.55.142/bspcp/
至于客户端,由于我是第一次接触游戏客户端引擎,所以暂时只是从思考者开始。目前似乎没有一个很好的开源Flash游戏引擎,可以支持外挂脚本的服务器端引擎好像也只有我一家(SmartFoxServer的服务器端AS属于流氓行为),不知道我能不能以一己之力真的做出一点像样的东西来。
挂个小图片:

我在这里消失了不短的时间,BS.Play的更新也中断了,因为Comoro项目对BSP的升级,所以很长时间没有做更新。
“Comoro“不是”科莫多“龙,是”科摩罗“群岛,是一个地名,不是一种动物,大家不要误会。
这一段时间,我整理了BSP alpha的所有代码,重新构建了Comoro体系。这是一个支持分布式结构的新的服务平台,它分为Base、Bridge和Center三部分,分别处理对客户端连接、中转和游戏逻辑处理。
Comoro使用了和BSP不同的通讯数据封装方式,API中是直接收发数组的。
Comoro的event queue基本是重写的一个简化版BSQ,不再使用不停创建线程的方式循环队列,事件触发只支持调用lua函数,并且支持数组的参数传递。暂时取消了“小时-分钟-秒“的分组队列。
Center接管了之前由lua管理的大量用户数据,在内存池中集中存储用户和组信息,并提供给runner更多的函数入口。
几乎所有的池都使用了自增,不再在初始化时申请一块很大的内存空间。
内存回收这方面我还是比较注意的。
日志文件加了互斥锁。
Runner列表改由一个根状态定义,保存在/etc/bspd.runner.conf中,这个文件本身就是一个lua脚本,列表只是一个数组。
启动接收配置文件位置和执行方式的参数。执行方式包括Base、Center和混合模式三种。
添加了一些对内存池的自动操作。
修改了加密算法。
直到刚才,我完成了除数据库接口外的编码工作。目前Comoro的纯代码数量不大,不到7000行。完全由我独自策划和开发,由于一直没有合适的合作者出现,目前只好让这样的状况继续下去。虽然不满意,但是没有办法。
关于后续内容,我有一个很大胆的设想,就是开发一种可以同时被Center和Client API解析的脚本语言,也就是说我要用AS写一个简单的脚本解析器。这听起来近似疯狂,但是我对它的需要是非常迫切的。我需要一种更直观简单的语言工具去描述游戏逻辑,并且希望它可以直接用在客户端上,使得客户端不用再重写一遍逻辑,这在棋牌游戏中的好处非常明显,只有做到逻辑的一次性编写,才算达到了BSP的游戏流水线目标。
但是,这项工作对我个人来说,挑战性是相当大的。现在我还不知道我会以什么样的方式开始这个子项目,并无法预期会在什么样的状态中结束它。在这个项目上,我始终坚持着个人英雄主义,虽然我不想这样做。由于Linux C下层开发的人丁凋零,我一直没有找到志同的合作者,解析器这种更理论性更细致质量要求更高的产品,又把门槛抬高了很大一块。
在Comoro第一个可用版本开始做压力测试后,我就会放出所有代码来,脚本解析器也许会在Comoro的测试完善中,悄无声息地开始,并很可能悄无声息地结束。我对这个光明的理想并不抱太大的希望,因为一个人的战斗能力太有限了。