码农农场

种下去的是代码, 收获的是 Bug

游戏对象模型设计与实现(2)

2013-04-19 | Comments

严格来说,一个游戏的实现框架有三种:

  • Object-Centric:面向对象方式的。
  • Component-Based:面向组件的。
  • Entity-System:实体系统?

我们依次来分析这三种实现方式的优点和缺点.

游戏对象模型设计与实现(1)

2013-04-16 | Comments

准备做一个 RPG 的游戏。由于以前没有做过游戏,首先学习了 cocos2d-iphone 的一些资料,再从网上看了一些写游戏 的教程,自认为可以动手开始写框架的时候,发现遇到了相当大的困难。

cocos2d-iphone 的教程或者网上的一些其他教程有一个共同点:都是拿一个太空大战或者坦克大战之类的作为实现 的例子。诚然这种简单的游戏可以充分考虑展现游戏框架本身的特点,但是从游戏编程上来说,有很大的误导之嫌。再加 上由于没有游戏编程的经验,同时受这些教程或者书籍中的这些例子的误导,思维上还是以写软件的方式来写游戏,认为 游戏不过是一种特殊的软件。

py2exe 打包 PyQt4 的问题

2012-05-30 | Comments

做了一个 pyqt 的小软件, 其中使用了 phonon 系统来播放声音, 在开发环境中一切都正常, 但是在部署到没有安装 Python 和 PyQt 的系统上以后, phonon 系统始终无法正确播放音频, 甚至阻塞了 API 调用. 虽然已经把 PyQt 和 VS2008 的 runtime 库打包进了可执行文件中, 问题依旧. 几乎没有在 Windows 系统上开发过程序, 所以查了很多的资料才发现问题的所在, 这里写下来记录一下.

uWSGI listen queue 队列溢出的问题

2012-04-04 | Comments

今天使用 uWSGI 启动 Python Web应用程序, 使用如下指令:

#usr/local/bin/uwsgi --paste config:/home/kerberos/testapp/production.ini \
--socket :5000 -H /home/kerberos/sandbox --workers 4 --master \
--reload-mercy 64 --max-requests 8192 --listen 2048 --socket-timeout 30 --disable-logging 

但是当查看 uwsgi 的日志时发现错误:

*** uWSGI listen queue of socket 4 full !!! (129/128) ***

但是明明指定了 --listen 2048, 看来是没有生效. 最后查看系统配置:

kerberos@avm01:~$ sudo sysctl -a | grep net.core.somaxconn
net.core.somaxconn = 128
error: permission denied on key 'net.ipv4.route.flush'
error: permission denied on key 'net.ipv6.route.flush'
kerberos@avm01:~$ sudo sysctl -a | grep backlog
error: permission denied on key 'net.ipv4.route.flush'
net.core.netdev_max_backlog = 1000
net.ipv4.tcp_max_syn_backlog = 512
error: permission denied on key 'net.ipv6.route.flush'

看来是系统 net.core.somaxconn 缺省的 128 限制导致 uWSGI 的 --listen 2048 参数没有生效生效. 还好, 编辑 /etc/sysctl.d/sysctl_kerberos_webapp.conf :

net.core.somaxconn = 2048
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_syn_backlog = 8192

执行命令

kerberos@avm01:~$ sudo sysctl -p /etc/sysctl.d/sysctl_adview.conf 
net.core.somaxconn = 2048
kerberos@avm01:~$ sudo sysctl -a | grep net.core.somaxconn 
net.core.somaxconn = 2048
error: permission denied on key 'net.ipv4.route.flush'
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_syn_backlog = 8192
error: permission denied on key 'net.ipv6.route.flush'

已经生效, 并且在 Debian 上开机会自动生效.

somaxconn 是指在一个端口号上的最大侦听队列. 在 wWSGI 上的配置超过 8192 是没有意义的, 即使超过 8192, uWSgI 最大也就使用 8192, uWSGI 的源代码中看到的. 也不排除以后会修改的可能. 另外, 这个值主要是由于 tcp 的 sack 值引起的, 或许关闭 net.ipv4.tcp_sacknet.ipv4.tcp.dsak 会有效果, 不过我没有实验.

SSH 隧道技术简介(转评)

2012-04-02 | Comments

不少人都有穿墙的需求, 穿墙对于一个普通的中国人来说, 有着不同寻常的意义. 概括简单来说有着启迪智慧, 培养思维之功效. 对于穿墙的方法, 有好多种吧. 今天想介绍一下利用SSH的隧道功能来进行穿墙的方法. 这个方法对于经常需要连接ssh 服务器进行操作的朋友来说很方便, 对于其他的朋友来说, 就显得反而有些繁杂了. 下面介绍介绍这个方法的各个方面.

在 Debian 6.0 上安装 nginx + nginx-gridfs + mongodb

2012-04-01 | Comments

网站或者论坛对于用户上传的图片管理比较麻烦, 尤其是在 Web 具有横向扩展能力的情况下. 但存把图片存放在 web 服务器的某个目录先已经不能满足各台 Web 主机同步要求. 这种情况下 使用共享式文件系统或者分布式文件系统是一个比较好的选择.