严格来说,一个游戏的实现框架有三种:
- Object-Centric:面向对象方式的。
- Component-Based:面向组件的。
- Entity-System:实体系统?
我们依次来分析这三种实现方式的优点和缺点.
严格来说,一个游戏的实现框架有三种:
我们依次来分析这三种实现方式的优点和缺点.
准备做一个 RPG 的游戏。由于以前没有做过游戏,首先学习了 cocos2d-iphone 的一些资料,再从网上看了一些写游戏 的教程,自认为可以动手开始写框架的时候,发现遇到了相当大的困难。
cocos2d-iphone 的教程或者网上的一些其他教程有一个共同点:都是拿一个太空大战或者坦克大战之类的作为实现
的例子。诚然这种简单的游戏可以充分考虑展现游戏框架本身的特点,但是从游戏编程上来说,有很大的误导之嫌。再加
上由于没有游戏编程的经验,同时受这些教程或者书籍中的这些例子的误导,思维上还是以写软件的方式来写游戏,认为
游戏不过是一种特殊的软件。
做了一个 pyqt 的小软件, 其中使用了 phonon 系统来播放声音, 在开发环境中一切都正常, 但是在部署到没有安装 Python 和 PyQt 的系统上以后, phonon 系统始终无法正确播放音频, 甚至阻塞了 API 调用. 虽然已经把 PyQt 和 VS2008 的 runtime 库打包进了可执行文件中, 问题依旧. 几乎没有在 Windows 系统上开发过程序, 所以查了很多的资料才发现问题的所在, 这里写下来记录一下.
nginx-gridfs 不是很稳定, 在前一段时间折腾了几次都没有成功. 最近经过查询资料, 发现可 以使用 fuse 模块来把 gridfs 做成文件系统, 而且性能要比 nginx-gridfs 高得多.
今天使用 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_sack 和 net.ipv4.tcp.dsak 会有效果, 不过我没有实验.