re: 《星际争霸2》引擎技术解析 海边沫沫 2008-09-03 18:49
牛X
@Kevin Lynx
你说得非常对,这几个例子都是《C++ Templates》上的,原因嘛,一是因为我觉得这些例子对于我们理解这些理论非常有帮助,二是因为以我的水平,也实在是翻不出什么花样来。
刚才去你的博客看了一下,觉得你写的那个利用宏进行代码生成的文章非常好,我想,使用模板元编程干这事,应该也是一样的吧。
我也觉得你是一个知识面非常广的实战型高手,不仅懂理论,还自己写了那么多的实现,确实令人佩服。
re: 瓦格纳的排场[未登录] 海边沫沫 2008-02-14 17:15
博主真了不起,艺术造诣这么深。
使劲顶!
其实我早就想在C++中使用IoC了,可惜能力有限,怎么都想不到一个好的实现方法,眼光有限,也找不到一个可以使用的IoC框架。
博主的这篇开山之作对我很有用。
有空多交流。
re: 写个小游戏练一练手 海边沫沫 2007-12-19 19:13
我今天稍微把游戏修改了一下,不用
if(pDlg->m_GameActionQue.empty())
{
::Sleep(100);
}
了,而是在对话框类中加入了一个CEvent类的变量m_event
然后,读取队列的时候使用
if(pDlg->m_GameActionQue.empty())
{
pDlg->m_event.Lock();
}
而在其他写入队列的时候调用
m_event.SetEvent();
这样修改之后,游戏对键盘的响应就基本上没有延时了,而且占用CPU要下降不少。
re: 写个小游戏练一练手 海边沫沫 2007-12-17 13:37
@TD
你说得不错,游戏中确实需要考虑线程同步问题。首先是多个线程访问同一个变量的时候,最好能加入竞争机制。在我这个游戏中,就没有对m_GameActionQue的访问进行控制,不过两个线程在尾部写,一个线程在头部读,倒没有出现问题。
其次是这里
if(pDlg->m_GameActionQue.empty())
{
::Sleep(100);
}
我在一个循环中不断进行判断队列是否为空,这种做法虽然可行,但是不好,因为在队列为空的时候不断循环判断很占用CPU时间。正确的做法应该是调用WaitForSingleObject使线程阻塞起来,当别的线程向队列中添加消息的时候解除阻塞。
re: MMORPG中游戏世界的构建 海边沫沫 2007-12-16 12:00
又有一个超级高手横空出现在cppblog了。
希望搂主把你安装苹果主题以及美化字体的过程都写出来。
还要告诉我们到哪里可以下载这些资源。
不错,是没有办法改变分隔符。
不过可以重载operator << 和自定义一个自己的string来实现这样的功能。
不过这样搞划不来,不如使用getline
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
int main()
{
std::ifstream input_file("D:\\emails100w.txt");
std::istream_iterator<std::string> input_begin(input_file);
std::istream_iterator<std::string> input_end;
std::vector<std::string> log_vector(input_begin,input_end);
//写入到另外一个文件
std::ofstream output_file("D:\\emails100w_copy.txt");
std::ostream_iterator<std::string> output_begin(output_file,"\n");
std::copy(log_vector.begin(),log_vector.end(),output_begin);
}
上面的代码是可以编译通过的,其中的D:\\emails100w.txt是一个包含一百万条记录的文本。
刚才我给出的代码通不过编译,确实是我的问题,主要是
std::istream_iterator<std::string> input_end;
这一行,最后应该没有括号。如果加上括号,编译器就不会认为这是一个iterator,就会调用vector的错误构造函数,就会出现博主所叙的错误。
呵呵,为什么要用list?为什么不用vector?
还有,读取文件的代码写得太不C++了,像C的代码。
C++的代码,要么是
ifstream inputfile("filename);
string tmpstr;
vector<string> log_vector;
while(inputfile >> tmpstr)
{
log_vector.push_back(tmpstr);
}
要么是
ifstream inputfile("filename);
istream_iterator input_begin(inputfile);
istream_iterator input_end();
vector<string> log_vector(input_begin,input_end);
re: 从一道简单的练习题说开去 海边沫沫 2007-12-04 17:55
内存大小和寻址快慢有关系吗?vector是可以随机访问的,像数组一样,寻址任何一个元素的时间花费都是常数。list是不能随机访问的,才会出现容器越大寻址越慢的情况。
std::set和std::tr1::unordered_set是不同的,它们的底层实现不同。std::set不是hash,而是红黑树。
@heroboy
多谢指点。由此可见,我们不能在for each中修改容器的内容。
re: 从一道简单的练习题说开去[未登录] 海边沫沫 2007-11-24 10:33
Hash table在VC++ 2005和VC++ 2008中,有hash_map、hash_set、hash_multimap、hash_multiset可用,在下一代C++标准中,它们将被更名为unordered_map和unordered_set。
用它们来去除重复项,的确很快,但是它们不能排序。
re: 从一道简单的练习题说开去 海边沫沫 2007-11-14 16:03
按楼上的建议修改后,运行结果如下:
real 0m35.157s
user 0m26.005s
sys 0m9.219s
效率的提升并不大,由此可见,你说的并不是关键问题。
re: 高起点C++学习之路 海边沫沫 2007-11-02 15:25
<a href=http://minidx.com>minidxer</a>
不好意思,有很多东西让阁下误解了。
我的第一个回帖,同时对多个人的言论进行了辩解,即辩解了不是新东西都是高起点,又辩解了不要只局限于Windows操作系统,当然,也不要局限于Unix或者Linux系统。等等。
让阁下总认为我在标榜自己是高手,看来是我回帖时太懒惹得祸了。
“高手们都知道,GNU和开源社区的东西,都是可以跨越很多平台的”,这句话只是为了进一步说明不要局限于Windows,不要局限于COM,Windows下有COM这样的好东西,开源社区肯定也有好东西和它对应,而且开源社区的好东西,同样也可以运行于Windows。
至于阁下推论的知道啥啥啥就是高手的言论,那不是我的本意。
re: 高起点C++学习之路 海边沫沫 2007-11-02 12:26
我说过我精通C++吗?我的目标是要把自己锻炼成一个C++高手。
也不要认为我对“精通”有一个很“低格调”的理解,混迹C++世界的高手们都是不敢随便说自己精通的。C++是这样一个东西,你越学得多,越是觉得自己不够,越是想往里面钻研。C++太有吸引力了。
但Windows下那一套很显然不具有这样的特质,搞着搞着就会觉得心烦,因此,对这些技术都下过苦功,能够在自己的项目中熟练应用这些技术,就随便说个“精通”了;但也并不是全都了如指掌了,往上看要能把握整个软件系统的架构,往下看要能明白每个组件的封装细节,那在下确实是大大的不足的。
re: 高起点C++学习之路 海边沫沫 2007-11-01 18:15
我可没有说新技术就是高起点哦,是不是高起点主要还是看个人的见识是不是增长了。现在的我比读书时的我,那不知是高了多少了,不管使用的是不是C++语言。
新技术有时候也会带来挑战,如64位、多核、硬件虚拟化技术,我们不得不去面对。
对于COM,难道我不懂吗?不是我吹牛,Windows下的那套在下可精得很啦,MFC、ATL、COM+以及Windows下的多线程和网络编程本人都曾下过苦功,只不过现在兴趣已经远远超过Windows了。虽然我的文中不断出现Linux/Unix字样,也并不代表着只局限于Linux/Unix系统。我关注的,是更具通用性的东西。
高手们都知道,GNU和开源社区的东西,那都是可以跨越很多个平台的!
re: Vista初体验(上) 海边沫沫 2007-10-04 19:23
看我的计算机得分
