随笔 - 2, 文章 - 1, 评论 - 41, 引用 - 0
数据加载中……
Python不慢,我们的已经运营的游戏项目就是用Python做的脚本,上层所有逻辑全部都是Python写的,不管是服务端还是客户端。
我个人还是更喜欢简洁的LUA。
楼主难道就不知道C++类构造函数不要随便使用memset去初始化对象吗?一切问题都是你的memset引起的,跟string没关系。
我们的做法:
做一个更新服务器,用来匹配资源版本号。
客户端每次登陆前都先连接更新服务器,如果发现有新的版本,则去文件服务器(http,ftp服务器)下载更新包。之后客户端本地解压打包就完成了更新。
楼主认为peekmessage和OnIdle难道不是一样的吗?
下线通知周围玩家不应有是服务器的事情吗?client无论什么方式下线(掉线,宕机....)服务器都应该检测到。
A*可以考虑用二叉堆来优化。
re: 对string类的思考[未登录] christanxw 2008-06-17 18:58
类似于MFC CSting的内存结构
3- 为了避免内存拷贝,可以尝试关闭SOCKET的发送和接收缓冲区,不过代价是,你需要更多的接收请求POST到一个数据流量比较大的SOCKET,从而保证系统一直可以找到BUFFER来收取到来的数据.


关闭SOCKET缓冲区一般并不能使性能得到提升。
re: (C++)一个愚蠢的错误[未登录] christanxw 2008-06-07 22:51
楼上的,C++里结构就是类,而不是原生的C结构。用memset会把类里的一些必要数据也清零。比如如果类有虚函数,则就有虚表指针,你用memset会把虚函数表指针置为0,这样你的类还有多态吗,你的程序还是健壮的吗
突破select的FD_SETSIZE限制[未登录] christanxw 2008-05-24 20:41
多此一举。直接重新定义FD_SETSIZE不就是了,何必搞这么复杂。
多此一举。直接重新FD_SETSIZE不就是了,何必搞这么复杂。
re: 网络编程 心得2[未登录] christanxw 2008-04-25 08:57
SO_DONTLINGER的设置将会使得未发送的系统缓冲区数据丢失。更好的还是设置为重用端口。
只是主角移动而已,为什么要搬移对周围的固定物件?
re: 单链表逆序输出[未登录] christanxw 2008-04-18 23:43
递归绝对是失败的做法。
本质原因是你在线程中使用了printf()这样的非多线程安全的函数。你用它的多线程版本(/MTd或/MDd)就没问题了,或者你在使用/MLd时对printf加锁也不会出问题。
re: 一个微秒级的定时函数 christanxw 2006-09-02 15:20
Nt以上才支持
为什么不用分布式编译工具 Xoreax IncrediBuild?
google一下就知道了。
关于是用返回值还是异常一直都是个令人烦恼的话题。
不过我认为自己开发的程序如果只是自己使用的话,用返回值是最好的(当然适当的加上日志记录最好了)。因为你自己知道什么时候作错误处理。如果是开发库给别人使用,用异常可能比较好,因为你不知道你的客户该怎么去处理错误,所以应该把错误处理的主动权交给客户。
所有的游戏都是C/C++
内存映射文件才是进程间共享的根本!
re: std::string一个极其隐晦得问题 christanxw 2006-04-18 20:29
Dll的出口函数最好是用标准的C类型。
#include <windows.h>
#include <cstdio>
#include <iostream>

unsigned long cryptTable[0x500];
const int HASH = 0;
const int HASH_A = 1;
const int HASH_B = 2;

void InitCryptTable()
{
unsigned long seed = 0x00100001, index1 = 0, index2 = 0, i;
for(index1 = 0; index1 < 0x100; index1++)
{
for(index2 = index1, i = 0; i < 5; i++, index2 += 0x100)
{
unsigned long temp1, temp2;
seed = (seed * 125 + 3) % 0x2AAAAB;
temp1 = (seed & 0xFFFF) << 0x10;
seed = (seed * 125 + 3) % 0x2AAAAB;
temp2 = (seed & 0xFFFF);
cryptTable[index2] = (temp1 | temp2);
}
}
}

unsigned long Hash(char *pStr, unsigned long dwHashType)
{
unsigned char *key = (unsigned char *)pStr;
unsigned long seed1 = 0x7FED7FED, seed2 = 0xEEEEEEEE;
int ch;

while(*key != 0)
{
ch = toupper(*key++);

seed1 = cryptTable[(dwHashType << 8) + ch] ^ (seed1 + seed2);
seed2 = ch + seed1 + seed2 + (seed2 << 5) + 3;
}
return seed1;
}

struct HashItem
{
unsigned long m_nHashKeyA;
unsigned long m_nHashKeyB;
bool m_bExist;
};

int main()
{
__int64 t1, t2;
GetSystemTimeAsFileTime( (LPFILETIME)&t1 );

InitCryptTable();
FILE* fread = fopen("c:\\email.txt","r");
FILE* fwrite = fopen("c:\\emailnew.txt","w+");

HashItem *hashTable = new HashItem[780000];

char line[256] = "";
fgets(line,255,fread);
while(!feof(fread))
{
int nStart = Hash(line,HASH) % 780000;
int nPos = nStart;
if(!(hashTable[nPos].m_bExist
&& hashTable[nPos].m_nHashKeyA ==Hash(line,HASH_A)
&& hashTable[nPos].m_nHashKeyB == Hash(line,HASH_B)))
{
hashTable[nPos].m_nHashKeyA = Hash(line,HASH_A);
hashTable[nPos].m_nHashKeyB = Hash(line,HASH_B);
hashTable[nPos].m_bExist = true;
fprintf(fwrite,"%s",line);
}

fgets(line,255,fread);
}

GetSystemTimeAsFileTime( (LPFILETIME)&t2 );
printf( "经过了%I64d.%04I64d毫秒\n", (t2-t1)/10000, (t2-t1)%10000 );
fclose(fread);
fclose(fwrite);
delete [] hashTable;

std::cin.get();
}

耗时343毫秒。很不错了。呵呵。Ptyong也是C写出来的,C/C++效率是完全可以比Pyton更快的,就看怎么实现算法了。在总多的脚本语言中Python是比较慢的一个了。
re: C++代码静态分析工具-Prefast christanxw 2006-03-28 18:32
哪里可以下载?
怎么不做个例子看看?
同意一楼
外加C++网络编程,比如ACE
re: C++的类型萃取技术 christanxw 2005-11-15 16:47
《泛型编程与STL》及《STL中文版》中对类型萃取解释的很好,搂主总结的不错
美文一篇!
re: C++的静态分派技术 christanxw 2005-11-15 16:36
这在STL中有着广泛的应用
是很好的辅助工具,但装了这个,同时打开VS和金山词霸2005时,发现VS会自动被关闭,无意中发现的。
re: 找一个工作好难 christanxw 2005-09-22 08:41
游戏公司
re: 简单的变量交换 christanxw 2005-09-19 19:30
这样也可以:
#include <iostream>
using namespace std;

int main()
{
int Number1 = 23;
int Number2 = 33;

cout<<Number1<<"\n"<<Number2<<endl;

Number1 = Number1 + Number2;
Number2 = Number1 - Number2;
Number1 = Number1 - Number2;

cout<<Number1<<"\n"<<Number2<<endl;

return 0;
}

当然楼主的更猛,不会产生溢出,我这个方法可能产生溢出,呵呵_^_