缓冲区的作用

经常听到缓冲区的概念,但始终对它的作用与具体实现有很多疑问,最近拜读了《Linux程序设计》 4TH之后,总算有了大概的理解。 该书举了一个例子,对一个10M文件的复制操作三种不同的实现,速度有不同的体现。 首先包含头文件: 1 2 3 #include <unistd.h> #include <stdlib.h> #include <stdio.h> 首先看第一个实现,直接使用read与write的系统底层调用进行文件复制: 1 2 3 4 5 6 7 8 9 10 11 int Func1() { char c; int in,out; in = open("file.in",O_RDONLY); out = open("file.out",O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR); while(read(in,&c,1)==1) { write(out,&c,1); } } 以上程序运行之后会将file.in文件复制到file.out文件当中,我们使用TIMEFORMAT="" time ./Test 1.19user 39.37system 0:41.63elapsed 97%CPU (0avgtext+0avgdata 1172maxresident)k 0inputs+24984outputs (0major+63minor)pagefaults 0swaps 也就是我们花了39.37秒才完成了文件复制操作。 我们每次读入1个字节调用一次read函数,10M=1024KB=1048576byte,也就是我们调用了10万次read函数。 我们看下第二个实现,这个实现采用了一个1K的缓冲区: 1 2 3 4 5 6 7 8 9 10 11 12 int Func2() { char buffer[1024]; int in,out; int nread; in = open("file.

Windows10 对于 Vmare12 打unlocker208补丁失败的解决办法

VMware 如果要安装 Mac OS X 10.11 的话,就需要打 unlocker208补丁,安装 unlocker208 的时候必须保证你的电脑安装了 python 的 2.x 版本,这里建议安装 python2.7.9版本,请不要安装3.x版本。 如果在 Windows10 上面安装好 VMware12 之后打 unlocker 补丁的时候可能会出现 unlocker.exe 停止运行,这个时候请使用记事本方式打开 windows-install.cmd,将 unlocker.exe 改为 python unlocker.py 之后保存并且双击运行这个cmd文件即可。

利用STL标准库实现字符串分割

在我们的实际应用当中,字符串分割是很重要的一个功能,但是 C++ 的 string 并没有为我们提供这个功能,所以说我们只有自己动手实现.实现代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include <string> #include <vector> using namespace std; vector<string> splitString(string str,string pattern) { string::size_type pos; // 查找到的位置 vector<string> result; // 返回的字符串 str+=pattern; int size=str.size(); for(int i=0;i<size;i++) { pos = str.find(pattern,i); if(pos<size) { string s = str.substr(i,pos-i); result.push_back(s); i = pos+pattern.size()-1; } } return result; }

再谈C#与C++通信之编码

在之前博客的文章当中当中忽略了对中文字符串的处理.例如以下代码: 1 2 string str = "我a"; return str.Lenght; 以上代码会返回2,乍一看似乎是没有错的,我们数据包head的lenght会被置为2. 然后我们的对端C++服务器会读取两字节的数据来,最后的结果会出现截断的情况,这是为什么呢? 因为在UTF-8里面我们汉字是占用的3字节空间,str的长度实际为4,所以我们在C#客户端发送数据的时候应该这样来获取字符长度. 1 2 3 4 public static int getLenght(string str,Encoding encode) { return encode.GetByteCount(str); }

SDL系列教程:第一章 开始使用SDL

本博客作者保留翻译著作权,转载请联系作者。 原著链接:PacktPub.SDL.Game.Development.Jun.2013.pdf 为什么选择SDL? 不同的操作系统都有自己的绘图方式,自己的一套事件处理机制,而SDL则为我们提供了一套统一的接口来调用。这样我们只需要集中精力开发游戏,而不需要为游戏的可移植性担心。游戏编程是一项十分复杂的工作。但是SDL则极大的减轻了我们的工作量,加快游戏的开发速度。 在Windows下面开发一个游戏,然后在Linux或者OS X上面运行,SDL则提供了这样一次开发四处运行的特性。 SDL拥有庞大的用户群体帮助更新和维护,同时SDL社区也是十分活跃,所以你可以经常访问一下SDL的官网看看有没有最新的版本。 总的来说,SDL提供了一套很完善的游戏开发库,让你专注于游戏本身,而不是再为不同的平台所烦恼。 SDL2.0是什么? SDL2.0是SDL1.2的更新版本,后者仍然在维护,2.0则提供了一些新的功能,这些新的功能详见wiki.libsdl.org/moin.cgi/Roadmap,主要有以下特点: 3D图像的加速渲染 2D硬件加速 支持Render Target 支持多窗口 提供对剪贴板访问的API 支持多个输入设备 支持7.1 声道 支持多个音频设备 提供对力反馈操纵杆的API 支持水平滚轮鼠标 提供多点触控的API 支持音频捕获 对多线程的改进 虽然以上特性我们后面的游戏编程不一定都会用到,但是这些新的特性都会使SDL成为一个良好的游戏框架。在后面我们将会用到里面的2D硬件加速来使我们的游戏拥有出色的表现。 SDL2.0 扩展库 SDL 框架有一些单独的扩展库,我们可以使用这些库来使我们的游戏变得更加完善,这些扩展库不放在前面讲述是尽量让SDL框架不显得那么臃肿。只有在我们有必要的时候,才会考虑使用这些扩展库。下面列举了一些十分常用的扩展库以及他们的用途,这些扩展库已经从原来的SDL1.2/1.3更新到支持最新的SDL 2.0: SDL_image 这是一个用于加载图像的库,支持BMP,GIF,PNG,TGA,PCX以及其他格式。 SDL_net 这是一个跨平台的网络支持库。 SDL_mixer 这是一个音频支持库,他支持MP3,MIDI,OGG这三种格式。 SDL_ttf 这个库可以让你在游戏当中使用TrueType字体。 SDL_rtf 这是一个可以让SDL支持富文本渲染的库。 在Visual C++ Express 2010当中配置SDL 下面我们会讲解如何在Visual C++ Express当中配置SDL2.0,Visual C++ Express这个IDE他为我们提供了一个免费的游戏开发环境,当然你用Visual Studio也是可以的,因为VS包含了VC++。Visual C++ Express可以在这个地方免费下载,如果说你已经成功安装了这个IDE,那么我们就可以去下载SDL2.0,如果你不使用Visual C++ Express来开发你的游戏或者说你不打算在Windows下面开发的话,后面的这些步骤你可能需要根据实际情况做一些调整。 SDL 2.0还在发展,所以现在还没有正式发布,你可以有两种方式来获得源码: 你可以下载最新源码的快照,来快速构建你的游戏。(最简单) 你也可以使用mercurial来clone源码。(能够与最新版本保持一致) 这两种方式可以在这里找到:http://www.libsdl.org/hg.php 当然,在Windows当中使用SDL2.0开发,必须使你的Direct X SDK保持最新版本,你可以在[这里](http://www.microsoft.com/en-gb/download/details. aspx?id=6812)找到最新的SDK。 在Windows下使用Mercurial获得SDL2.0 直接从不断更新的代码库来获得SDL2.0是最好的方式,可以确保你的SDL2.0是最新版本,任何的错误修复都会在上面第一时间提交。关于Mercurial的GUI工具有很多,这里我们使用tortoisehg.bitbucket.org提供的程序,我们安装了这个程序之后就能够即时的获取到最新的SDL2.0版本。 建立一个新的SDL2.0克隆 1.打开TortoiseHg Workbench窗口: 2.按下Ctrl + Shift + N 来打开克隆对话框。 3.
Built with Hugo
主题 StackJimmy 设计