08 2011 档案
摘要:// FPS info.// FPS相关变量int g_fps = 0; // FPS帧率值char g_fpsStr[16] = {0}; // 存放帧率值float g_time = 0.0f; // 系统运行时间float g_lastTime = 0.0f; // 持续的时间// 计算帧率void GetFPS(){ // Get the second in millisecond then multiply it to convert to seconds. // g_time获取操作系统启动到现在所经过的毫秒数,乘以0.001f得...
阅读全文
摘要:为了在一个基本层次上显示文本,要用到两个不同的对象,即LPD3DXFONT和RECT这两个结构。LPD3DXFONT用于创建和显示文本,而RECT用于确定要显示的文本位置。为了创建LPD3DXFONT对象,就要用到一个名为D3DXCreateFont()的函数。该函数原型如程序清单5.1所示。其成员变量如下:■ Height:字体字符的高度■ Width:字体字符的宽度■ Weight:打印字体的权重(即:粗体)■ MipLevels:文本的Mipmap级别■ Italic:字体是否为斜体■ Charset:用到的字符集■ OutputPrecision:指定Windows与期望字体大小的匹配
阅读全文
摘要:24.的程序代码源于书籍附带光盘,运行得不到正确结果,由于bool InitializeObjects(),void RenderScene()这2个函数中的代码所致。先看这2个函数,原来的代码如下:bool InitializeObjects(){ // Setup the g_Light source. g_Light.Type = D3DLIGHT_DIRECTIONAL; g_Light.Direction = D3DXVECTOR3(0.0f, 0.0f, 1.0f); g_Light.Diffuse.r = 1; g_Light.Diffuse.g =...
阅读全文
摘要:main.h main.cpp 无变化define.h#ifndef _UGP_DEFINES_H_#define _UGP_DEFINES_H_#include<windows.h>// Boolean values.#define UGP_INVALID -1#define UGP_OK 1#define UGP_FAIL 0// Light type defines.#define LIGHT_POINT 1#define LIGHT_DIRECTIONAL 2#define LIGHT_SPOT 3// Window handle (...
阅读全文
摘要:游戏中应用的例子:游戏中打开观察人物的界面,UI上显示的人物就是通过这种方式绘制出来的。渲染到纹理是D3D中的一项高级技术。一方面,它很简单,另一方面它很强大并能产生很多特殊效果。 比如说发光效果,环境映射,阴影映射,都可以通过它来实现。渲染到纹理只是渲染到表面的一个延伸。我们只需再加些东西就可以了。首先,我们要创造一个纹理,并且做好一些防范措施。第二步我们就可以把适当的场景渲染到我们创建的纹理上了。然后,我们把这个纹理用在最后的渲染上。 ?main.cpp 首先我们得声明所需要的对象。当然我们需要一张用来渲染的纹理。此外,我们还需要两个Surface对象。一个是用来存储后台缓冲区,一个用..
阅读全文
摘要:此两个参数有2个函数用到:HRESULT CreateDepthStencilSurface( UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, BOOL Discard, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle);的第四个参数。HRESULT D3DXCreateTexture( LPDIRECT3DDEVICE9 pDevice, UINT Width,...
阅读全文
摘要:修改view矩阵,例如:D3DXMATRIX g_ViewMatrix;float g_RotationAngle = 0.0f;g_RotationAngle += 0.0002f;if(g_RotationAngle >= 360) g_RotationAngle = 0.0f;D3DXMATRIXA16 w;D3DXMatrixRotationY(&w, g_RotationAngle);g_ViewMatrix *= w;g_D3DDevice->SetTransform(D3DTS_VIEW, &g_ViewMatrix);也就是眼睛摄像机的位置不停地绕着
阅读全文
摘要:通常在图形编程中,需要能够将场景渲染到纹理上,并且针对某些目的可以使用这些纹理,例如,也许想在游戏中有一个安全监视器,游戏中间有一个电视屏可以在不同的位置显示游戏的状态。这对游戏玩家而言,非常有用,并且可以在很大程度上提高程序的真实感。同样,也可以使用幕外渲染技术创建映射、阴影映射纹理和大量如场地模糊、夜视、热视力、高精度动态范围渲染等许多不同的后处理效果。在Direct3D中实现幕外渲染需要创建幕外表面,并对其渲染而不是渲染到常用的后台缓存中。然后将渲染结果存储在贴在幕外表面上的纹理图像中。并且可以像所有常用的纹理图像一样使用。要增加幕外渲染功能,只要创建一个LPDIRECT3DSURFAC
阅读全文
摘要:#include<fstream.h>main(){ int a[10]={0}; for(int i=0;i<9;i++) { a[i+1]=a[i]*10+i+1; cout<<a[i]<<endl; } ofstream rs("ok2002com.bin",ios::binary);//打开
阅读全文
摘要:在图形应用程序中,读者也希望为显示在屏幕上的内容保存一幅屏幕截图。这非常有用。幸运的是,在Direct3D中创建和保存屏幕截图非常简单明了。为了实现该功能,需要获取当前已渲染好的场景宽度和高度,创建Direct3D表面,将渲染后的场景复制到创建好的表面对象中,然后调用一个Direct3D函数将表面保存到Direct3D支持的文件格式中。该文件格式可以是前面讨论过的任何标准文件类型,如.jpg、.tga或.bmp。这意味着为了保存程序屏幕截图,就要使用4个函数。1.首先要获取当前的显示模式。这样就可以获取像渲染场景宽度和高度这样的信息。2.接下来,要创建一个幕外表面。该表面用于存储已渲染好的场景
阅读全文
摘要:使用Direct3D创建凸凹贴图在Direct3D中创建凸凹纹理贴图是非常简单的过程。使用D3DX函数D3DXComputeNormalMap()即可将Direct3D支持的所有图像格式转换成凸凹贴图。使用Direct3D函数计算法线贴图的最大优势就是在使用这些图片时,不需要知道图的生成方式。同样,还可以使用另一个D3DX函数D3DXSaveTextureToFile(),将新生成的凸凹贴图保存到文件中。D3DXComputeNormalMap()函数原型非常简单,参数pTexture是保存法线贴图的Direct3D纹理对象。参数pSrcTexture是想要转换成法线贴图的原始图像。参数pSr
阅读全文
摘要:GetLevelDesc函数在MSDN中:Retrieves a level description of a texture resource.HRESULT GetLevelDesc( UINT Level, D3DSURFACE_DESC * pDesc);ParametersLevel[in] Identifies a level of the texture resource. This method returns asurface description for the level specified by this parameter.pDesc[out] Pointer to
阅读全文
摘要:在游戏开发的早期,游戏都是2D的。这些2D游戏通常有带有sprite特征和对象的滚动背景。游戏中的sprite只是显示在屏幕上的物体的2D图像。通过轻微改变对象,可以让这些sprite产生动画,从而有一种运动的外观,而这与卡通动画系列中所做的工作一样。如果读者曾经见过一本活页书,就会对sprite动画有一个明确的了解。动画的每一帧代表了每幅图像轻微的变化。例如,想象有一幅人物静静站着的图像,然后下一系列的人物图像是他的腿慢慢的抬起。要一直这样做,只到有一幅人物走动的完整动画为止。从本质上讲,sprite只是一个2D图像集合,它使用alpha通道,分解图像中希望不可见的像素。为了让sprite显
阅读全文
摘要:设置文件或目录的属性,函数原型如下:BOOL SetFileAttributes( LPCTSTR lpFileName, DWORD dwFileAttributes); 参数: lpFileName:输入参数,为需要设置文件属性的文件或目录。 返回值: 返回BOOL值,表示是否成功。 使用说明: 文件系统中对文件属性的表示使用了DWORD类型的数据,多个文件属性用“|”运算连在一起DWORD GetFileAttributes( LPCTSTR lpFilename); 参数: hFileName: 输入参数,为需要获取属性的文件或目录 返回值: 返回DWORD值,表示文件属性。如果返回.
阅读全文
摘要:画外音:今天是个大晴天,温暖的阳光透过窗子照进了这间宽敞的办公室,办公室里三三两两的人们正在各自的计算机前努力工作,一切都显得那么的安静、祥和、有条不紊 …… “啊~!救命啊!Solmyr 你又用文件夹砸我!” “愚蠢者是应该受到惩罚的。” 画外音: …… 呃,好吧,我得承认有点小小的例外。这里是一
阅读全文
摘要:在将图像施加到表面时,并非图像的所有部分都是可见的。例如,如果有一幅叶子的图像,并且只想看到图像中实际构成叶子的那一部分内容,而不是空的场景,就需要使用名为“透明度”的技术,以帮助实现预期效果。有了透明度,就可以设置图像的一些像素可见,而另一些像素不可见。 使用RGBA纹理图像中的Alpha成分或顶点颜色的alpha成分可以控制透明度。同样,可以将像素设为半透明,而不是可见或不可见。这意味着图像的某些部分在某种程度上是可见的,而某种程度上像玻璃一样是可以看穿的。这对于像菜单或GUI对象、窗口、X射线视觉等这样的东西而言非常有用。控制图像的alpha通道或是顶点颜色的alpha通道可以控制显示给
阅读全文
摘要:多纹理贴图的基本要素就是使用多个纹理。创建和加载多个Direct3D纹理对象即可实现。当使用硬件多纹理渲染纹理时,要为每个顶点指定两套纹理坐标。这只需在顶点结构中另外添加两个浮点成员变量即可完成,即在FVF中用D3DFVF_TEX2替换D3DFVF_TEX。code:#include<d3d9.h>#include<d3dx9.h>#define WINDOW_CLASS "UGPDX"#define WINDOW_NAME "D3D Multi-Texture Mapping"#define WINDOW_WIDTH 640#d
阅读全文
摘要:纹理映射是一种将图形施加到表面的技术。以简单的一堵墙为例,这种技术可以只需要两个绘制有砖纹理的三角形即可。这样就可以为表面增加大量的细节,而不必使用大量的多边形。纹理映射使用了图像数据并将图像数据绘制(映射)到表面上。该表面看上去就像有一幅图在它上面。所以,如果有一堵墙,并将砖块的纹理施加到这堵墙上面,那么即便只是这个表面使用了两个三角形,它看上去也像场景中的一堵墙。 Direct3D中的纹理就是一幅映射到表面上的图像,这样可以让表面显示比实际上更多的细节。在3D场景中实现纹理映射,最常见的方法是从外部文件加载图像数据。该文件可以存在于硬盘、软盘或光盘等载体上,同样该文件可以在场景中的多个表.
阅读全文
摘要:该游戏项目一开始先创建名为light.h、material.h的两个文件。light.h头文件用于创建灯源结构,该结构用于创建Direct3D中的灯源对象。以某种方式实现该结构,这样也可将其用于OpenGL或其他渲染系统。光源结构模仿了Direct3D中的D3DLIGHT结构,所以它们是完全兼容的。light.h#ifndef _UGP_LIGHT_H_#define _UGP_LIGHT_H_struct stLight{ stLight() { type = 0; posX = 0, posY = 0, posZ = 0; dirX = 0, dirY...
阅读全文
摘要:在Direct3D中创建光源相对比较简单,因为只是为了使用光源,而不需要知道太多Direct3D内部使用的算法。所以即使对先前光照和阴影的讨论一头雾水,也不用担心。有一些亲自实践的经历之后,读者就可以使用Direct3D中的光照,而不必知道它的工作机理或自己动手计算光照方程。默认情况下,即使没有指定任何光源,Direct3D也会打开硬件光照。到目前为止,都是将其设置为FALSE,那是因为还没有用到光照。在初始化中调用SetRenderState()函数,并将该函数的参数D3DRS_LIGHTING设为FALSE。 为了在Direct3D中创建光源,必须创建一个D3DLIGHT对象。为了方便..
阅读全文
摘要:#include<d3d9.h>#include<d3dx9.h>#define WINDOW_CLASS "UGPDX"#define WINDOW_NAME "Built-in Direct3D Shapes"#define WINDOW_WIDTH 640#define WINDOW_HEIGHT 480// Function Prototypes...bool InitializeD3D(HWND hWnd, bool fullscreen);bool InitializeObjects();void RenderScen
阅读全文
摘要:通常在计算机图形学中有三类光源需要考虑,分别是点光源、聚光光源和方向性光源。每类光源分别描述了日常生活中见到的不同类型的光。例如,点光源可以是某个距离上向所有方向发光的任何光源,如灯泡;聚光光源通过圆锥发光,如闪光灯;而方向光则是从特定的方向,但是无法辨别的光源处发光。【注意】 方向光不同于点光和聚光的是,现实世界中并没有这样的光。另一方面,在计算机图形学中,它们确实存在而且可以由数学计算得到。 1. 点光源如本章前面所提到的一样,点光源是一种在某个距离上向所有方向发光的光源。随着光传播一定的距离,它会损失一定的能量而且亮度也会逐渐降低。可以将点光源认为是灯泡、蜡烛,或是在一定距离上可以发光的
阅读全文
摘要:工程GameProject1: main.h, main.cpp这两个文件用于创建游戏Stranded。工程GameEngine:RenderInterface.h, D3DRenderer.h, D3DRenderer.cpp, engine.h, defines.h.D3DRenderer.h和D3DRenderer.cpp用于创建Direct3D渲染系统;RenderInterface.h文件是一个基类,D3DRenderer就是从该类派生出来的;engine.h和defines.h包含了游戏引擎中要用到的Define(定义)、Function Prototype(函数原型)、Enume
阅读全文
摘要:2.3 引擎规划 和当今的商业游戏引擎相比较而言,本书中这个构建在游戏上的游戏引擎,显得微不足道。游戏Stranded的引擎小到足以包含在单独一个库中。由于游戏引擎取决于开发人员的需求,因此开发或分割游戏引擎的正确方法不止一种。通常,最好是将无关的系统分割成不同的动态链接库(DLL),这样可以更方便地将改动过的软件更新、修改和重新发布给用户。如果有任何类型的更新,那么将全部.exe文件重新发布给已经购买该款游戏的用户很不经济。只要开发人员重新发布一个动态链接库(DLL)(只是整个语系中的一小部分),那么效率将会提高很多。虽然现在的宽带Internet使得下载更新信息的速度比过去快很多,但目前所
阅读全文
摘要:#include<d3d9.h>#include<d3dx9.h>#pragma comment(lib, "d3d9.lib")#pragma comment(lib, "d3dx9.lib")#define WINDOW_CLASS "UGPDX"#define WINDOW_NAME "Template"#define WINDOW_WIDTH 640#define WINDOW_HEIGHT 480// Function Prototypes...bool InitializeD3D
阅读全文
摘要:使用诸如Direct3D这样的渲染API在屏幕上渲染图形时,就会碰到所谓的“透支”(指的是渲染全景造成的内存浪费)问题。当在屏幕上绘制交迭(重爹)的两个或多个图元时,就会出现透支。这些图元有不同的位置,但在屏幕上渲染时,它们交迭在一起。因为Direct3D不知道要绘制的图元的先后顺序,所以会出现透支问题。Direct3D不仅不知道是哪个图元遮住了哪个图元,而且还不知道是哪个图元部分遮住了其他物体。解决透支问题的一个办法是使用一种名为“深度缓存或z缓存”的缓存。深度缓存是一个后台缓存,它类似于OpenGL和Direct3D这样的API渲染,存储场景深度信息。当绘制图元时,将物体的深度信息和深度缓
阅读全文
摘要:#include<d3d9.h>#include<d3dx9.h>#pragma comment(lib, "d3d9.lib")#pragma comment(lib, "d3dx9.lib")#define WINDOW_CLASS "UGPDX"#define WINDOW_NAME "View Matrix"#define WINDOW_WIDTH 640#define WINDOW_HEIGHT 480// Function Prototypes...bool Initialize
阅读全文
摘要:#include<d3d9.h>#include<d3dx9.h>#pragma comment(lib, "d3d9.lib")#pragma comment(lib, "d3dx9.lib")#define WINDOW_CLASS "UGPDX"#define WINDOW_NAME "World Matrix"#define WINDOW_WIDTH 640#define WINDOW_HEIGHT 480// Function Prototypes...bool Initializ
阅读全文
摘要:无论计算机图形技术如何发展,只要它以二维的屏幕作为显示介质,那么它显示的图像即使多么的有立体感,也还是二维的。有时我会想,有没有以某个空间作为显示介质的的可能呢,不过即使有,也只能是显示某个范围内的图像,不可能有无限大的空间作为显示介质,如果有,那就是现实世界了。 既然显示器的屏幕是二维的,那么我们就要对图像作些处理,让它可以欺骗我们的眼睛,产生一种立体的真实感。在D3D中,这种处理就是一系列的空间变换,从模型空间变到世界空间,再变到视图空间,最后投影到我们的显示器屏幕上。·世界空间与世界矩阵 什么是模型空间呢?每个模型(3D物体)都有它自己的空间,空间的中心(原点)就是模型的中心。
阅读全文
摘要:#include<d3d9.h>#include<d3dx9.h>#pragma comment(lib, "d3d9.lib")#pragma comment(lib, "d3dx9.lib")#define WINDOW_CLASS "UGPDX"#define WINDOW_NAME "Perspective Projection Matrix"#define WINDOW_WIDTH 640#define WINDOW_HEIGHT 480// Function Prototypes
阅读全文
摘要:#include<d3d9.h>#include<d3dx9.h>#pragma comment(lib, "d3d9.lib")#pragma comment(lib, "d3dx9.lib")#define WINDOW_CLASS "UGPDX"#define WINDOW_NAME "Ortho Projection Matrix"#define WINDOW_WIDTH 640#define WINDOW_HEIGHT 480// Function Prototypes...boo
阅读全文
摘要:http://www.cppblog.com/lovedday/archive/2008/05/02/48632.html投影变换将摄影空间中的三维物体投影到二维胶片上,也就是Direct3D中的屏幕,这种三维到二维的变换过程就是投影变换,即从取景空间到摄影空间的变换。设三维物体在观察空间中的坐标为Pview,投影矩阵为Mproj,则顶点在投影空间中的坐标为:Pproj= Pview* Mproj下面分别介绍两种基本的投影变换:正交投影和透视投影,以及它们在Direct3D中的实现。1、正交投影正交投影中,投影向量和观察平面垂直,物体坐标沿观察坐标系的z轴平行投影到观察平面上,观察点和观察平面
阅读全文
摘要:#include<d3d9.h>#define WINDOW_CLASS "UGPDX"#define WINDOW_NAME "Drawing a Quad"// Function Prototypes...bool InitializeD3D(HWND hWnd, bool fullscreen);bool InitializeObjects();void RenderScene();void Shutdown();// Direct3D object and device.LPDIRECT3D9 g_D3D = NULL;LPDIREC
阅读全文
摘要:#include<d3d9.h>#pragma comment(lib, "d3d9.lib")#pragma comment(lib, "d3dx9.lib")#define WINDOW_CLASS "UGPDX"#define WINDOW_NAME "Drawing a Triangle"// Function Prototypes...bool InitializeD3D(HWND hWnd, bool fullscreen);bool InitializeObjects();void Ren
阅读全文
摘要:#include<d3d9.h>#pragma comment(lib, "d3d9.lib")#pragma comment(lib, "d3dx9.lib")#define WINDOW_CLASS "UGPDX"#define WINDOW_NAME "Drawing Lines"// Function Prototypes...bool InitializeD3D(HWND hWnd, bool fullscreen);bool InitializeObjects();void RenderSc
阅读全文
摘要:#include<d3d9.h>#include<d3dx9.h>#pragma comment(lib, "d3d9.lib")#pragma comment(lib, "d3dx9.lib")#define WINDOW_CLASS "UGPDX"#define WINDOW_NAME "Template"#define WINDOW_WIDTH 640#define WINDOW_HEIGHT 480// Function Prototypes...bool InitializeD3D
阅读全文
摘要:#include<d3d9.h>#pragma comment(lib, "d3d9.lib")#pragma comment(lib, "d3dx9.lib")#define WINDOW_CLASS "UGPDX"#define WINDOW_NAME "Blank D3D Window"// Function Prototypes...bool InitializeD3D(HWND hWnd, bool fullscreen);void RenderScene();void Shutdown();
阅读全文
摘要:IDirect3D* WINAPI Direct3DCreate9(UINT SDKVersion //版本号); //创建Direct3D9接口对象HRESULT IDirect3D::GetDeviceCaps(UINT Adapter, //显卡号(一般为D3DADAPTER_DEFAULT)D3DDEVTYPE DeviceType, //设备类型(一般为D3DDEVTYPE_HAL)D3DCAPS9* pCaps //返回设备功能信息); //本机显示卡功能检测HRESULT IDirect3D::GetAdapterDisplayMode(UINT Adapter, //显卡号D3
阅读全文
摘要:1. for (int i=0; i<100; ++i) a[i] = m * n; 应该改成 int k = m * n;for (int i=0; i<100; ++i) a[i] = k; 2. 缓存 将频繁计算和计算代价高的计算结果存到临时变量中,这样就不用一次一次的去调用函数来计算。 3.
阅读全文
摘要:1. 插入 数组(已分配足够大小),vector,list,multiset插入100W个int来测试。 速度:数组>vector>list>multiset 若插入数组、vector的对象的复制构造代价很大,则存对象的指针。 2.删除 vector在尾部进行插入和删除时,速度很快;在其他位置删除和
阅读全文
摘要:编译器拒绝内联虚方法,以为虚方法是运行时绑定。
阅读全文
摘要:#include "stdafx.h"#include <windows.h>#include <MMSystem.h>#include <iostream>using namespace std;#pragma comment(lib, "winmm.lib")class Foo{public:
阅读全文
摘要:#include "stdafx.h"#include <windows.h>#include <MMSystem.h>#include <iostream>using namespace std;#pragma comment(lib, "winmm.lib")class Foo{public:
阅读全文
摘要:#include "stdafx.h"#include <windows.h>#include <MMSystem.h>#include <iostream>using namespace std;#pragma comment(lib, "winmm.lib")template <typename
阅读全文
摘要:先贴代码: #include "stdafx.h"#include <windows.h>#include <MMSystem.h>#include <iostream>using namespace std;#pragma comment(lib, "winmm.lib")class Foo{pu
阅读全文
摘要:先贴代码:#include "stdafx.h"#include <windows.h>#include <iostream>using namespace std;string GetValue(const char* lpbMapAddress, const char* sName);int main() { HANDLE hFile = CreateFile( TEXT("E:\\test.txt"), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRI
阅读全文
摘要:使用C或者C++编程的时候,最担心的应该还是内存泄漏问题,测试人员通常专注于功能/性能测试,如果有不明显的内存泄漏,可能要在程序发布后几天,甚至更久才会发现故障。因此,检查C/C++程序的内存泄漏,开发人员需要自己把好这个关。检测内存泄漏的工具有很多,大致分为二种,一种是嵌入程序的,需要修改源码;一
阅读全文
摘要:转自:http://www.chenhangyu.com/?p=175创建线程的函数有很多种, 包括CreateThread、_beginthread、 _beginthreadex和AfxBeginThread. 用法在MSDN上都有详述, 这里做个笔记摘录.1, CreateThread是不安全的,很多参考书上,都说不要用CreateThread 创建线程、并用CloseHandle来关闭这个线程,因为一些技术性的问题,会导致内存泄漏. 直接在CreateThread API创建的线程中使用sprintf,malloc,strcat等涉及CRT存储堆操作的CRT库函数是不安全的.2, _b
阅读全文
摘要:两个win32 console的工程,每个代表一个进程,利用共享内存在两个进程之间通信,过程中遇到了OpenFileMapping失败 原因ERROR_FILE_NOT_FOUND的错误,google了很久没找到原因,下午终于找到原因了。两个工程的公共代码部分:#include "stdafx.h"#include <iostream>#include <windows.h>#include <cassert>using namespace std;#define SHARE_MEMORY_NAME TEXT("shareMem
阅读全文
摘要:用到的几个windows API函数:函数CreateFileMapping、MapViewOfFile声明如下:WINBASEAPI__outHANDLEWINAPICreateFileMappingA( __in HANDLE hFile, __in_opt LPSECURITY_ATTRIBUTES lpFileMappingAttributes, __in DWORD flProtect, __in DWORD dwMaximumSizeHigh, __in DWORD dwMaximumSizeLow, __in_opt LPCSTR lpName );WINBASEAPI__out
阅读全文
摘要:之前有过一篇介绍游戏服务器端的博文http://blog.csdn.net/liuxialong/archive/2011/06/12/6539762.aspx但是篇幅太长,而且过于关注细节,适合深读。这里给出一种宏观把握MMORPG服务器设计的文章,适合入门,读完后对服务器端的设计能有大概的掌握,方便对感兴趣的部分进行深入了解。1、首先是常见的服务器端结构,其中包括:登陆服务器、网关服务器、数据库服务器(账号数据库、角色数据库、地图数据库等)、聊天服务器、地图服务器、日志服务器等。下图为一个游戏大区的服务器群架构。所谓大区的意思,就是在打开客户端,进入游戏后,需要先选择大区,如:华南一区、华
阅读全文
摘要:转自http://blog.csdn.net/starlee/article/details/6630816让程序在崩溃时体面的退出之SEHSEH的全称是Structured Exception Handling,是Windows操作系统提供的一种异常处理方式。SEH是属于操作系统的特性,不为特定语言设计,从它的名字就能看出它是一种结构化的异常处理方式。SEH包括了2个部分:终止处理__try/__finally和异常处理__try/__except,下面分别进行介绍。终止处理__try/__finally __try/__finally可以保证无论try块内的代码执行结果如何,finally
阅读全文
摘要:3.3.1 透视投影透视投影最显著的特征就是透视缩短,物体距离照相机越远,它在最终图像中看上去就越小。这是因为透视投影的视景体可以看成是一个金字塔的平截头体(顶部被一个平行于底面的平面截除)。位于视景体之内的物体被投影到金字塔的顶点,也就是照相机或观察点的位置。靠近观察点的物体看上去更大一些,因为和远处的物体相比,它们占据了视景体中相对较大的区域。这种投影方法常用于动画、视觉模拟以及其他要求某种程度的现实感的应用领域,因为它和我们在日常生活中观察事物的方式相同。glFrustum()函数定义了一个平截头体,它计算一个用于实现透视投影的矩阵,并把它与当前的投影矩阵(一般为单位矩阵)相乘。记住,视
阅读全文
摘要:http://studiostyl.es/
阅读全文
摘要:使用多线程技术可以显著地提高程序性能,本文就讲讲在程序中如何使用工作线程,以及工作线程与主线程通讯的问题。一创建线程使用MFC提供的全局函数AfxBeginThread()即可创建一个工作线程。线程函数的标准形式为UINTMyFunProc(LPVOID );此函数既可以是全局函数,也可以是类的静态成员函数。之所以必须是静态成员函数,是由于类的非静态成员函数,编译器在编译时会自动加上一个this指针参数,如果将函数设置为静态的成员函数,则可以消除this指针参数。如果想在线程函数中任意调用类的成员变量(此处指的是数据成员,而不是控件关联的成员变量),则可以将类的指针作为参数传递给线程函数,然后
阅读全文
摘要:1) 不要在线程函数体内操作MFC控件,不要再线程里面调用UpdateData函数更新用户界面,而应该尽量采用发送消息的方式,在主线程的消息响应函数中操作控件;2)不建议采用SendMessage往主线程发送消息,因为它是同步的,阻塞的,可以考虑采用PostMessage代替;3)线程退出时,尽量不要使用TerminateThread函数,而尽可能的让线程自己退出;4) 当线程退出时,必须先等待工作者线程退出,主线程才退出,但是在主线程里面不要使用WaitForSingleObject或WaitForMultiObjects等待线程结束,因为它可能造成死锁,当主线程使用这两个函数时,主线程就挂
阅读全文
摘要:这里讨论的游戏服务器架构大概是目前国内乃至世界上的网游通用的一种架构了:有段时间没有研究技术了,这次正好看到了新版的mangos,较之以前我看的版本有了比较大的完善,于是再次浏览了下他的代码,也借此机会整理下我在游戏服务器开发方面的一些心得,与大家探讨。 另外由于为避免与公司引起一些不必要的纠纷,我所描述的全都是通过google能够找到的资料,所以也可以认为我下面的内容都是网上所找资料的整理合集。在平时的开发中我也搜索过相关的中文网页,很少有讲游戏服务器相关技术的,大家的讨论主要还是集中在3D相关技术,所以也希望我将开始的这几篇文章能够起到抛砖引玉的作用,潜水的兄弟们也都上来透透气。 要描述一
阅读全文
摘要:MMORPG不同于其它的局域网的网络游戏,它是一个面向整个Internet的连接人数过万的网络游戏,因此他的服务器端设计则极为重要服务器的基本设置 在大型网络游戏里,通常设计为C/S结构,客户端不再对数据进行逻辑处理,而只是一个收发装置,从玩家那里接受到操作信息,然后反馈给服务器,再由服务器进行处理后发回客户端,经客户端通过图形化处理,给玩家呈现出一个缤纷的游戏世界。登陆服务器 在这里也可以称之为连接服务器,网络游戏的客户端一般是连接到这里,然后再由该连接服务器根据不同的需要,把游戏消息转发给其它相应的服务器(逻辑和地图服务器)也因为它是客户端直接连接的对象,它同时也负担了验证客户身份的工作。
阅读全文
摘要:D3DXIntersectTri 求三角形与射线相交D3DXVECTOR3vec1(-10,0,-10);D3DXVECTOR3vec2(0,0,10);D3DXVECTOR3vec3(10,0,-10);D3DXVECTOR3vecOrg(0,10,0);D3DXVECTOR3vecDir(0,-2,0);//求射线长度D3DXVECTOR3_vecDir;D3DXVec3Subtract(&_vecDir,&vecDir,&vecOrg);floatdis_Ray=D3DXVec3Length(&_vecDir);D3DXVec3Normalize(&
阅读全文
摘要:转自 http://www.cnblogs.com/lancidie/archive/2010/09/24/1833968.html 话说一直想找一个别人写好的使用,可惜没什么人会拿这小东西发布,只好自写一个。1.多级链表分配池我不知道这种设计的具体学名是什么,这部分的内容也许你去看《STL源码分析
阅读全文
摘要:转自http://www.cnblogs.com/lancidie/archive/2011/05/20/2052094.html学习D3D,应该对这三个内存理解,网上收集了一下相关资料,收藏下来。三种内存AGP内存(非本地显存),显存(本地内存),系统内存,其中我们都知道系统内存就是咱那内存条,那这AGP内存是个啥玩意啊?其实是因为在以前显卡内存都很小,那时还是在显存是16M,32M为主流的时候,如果你运行一个需要很多纹理的3D程序,那么显存一会就不够用了,那该咋办呢?只好问系统内存借点用用了!这就是AGP内存的由来,在我们电脑BIOS中有个设置AGP Aperture的选项,这里就是设置显
阅读全文
摘要:用矩阵变换3-D向量,并且用w = 1投影结果。定义:D3DXVECTOR3*WINAPID3DXVec3TransformCoord(D3DXVECTOR3*pOut,CONST D3DXVECTOR3*pV,CONST D3DXMATRIX*pM);ParameterspOut[in, out]指向D3DXVECTOR3结构的操作结果。pV[in]指向D3DXVECTOR3结构的向量。pM[in]指向D3DXMATRIX结构的变换矩阵。Return Value指向D3DXVECTOR3结构的变换后的向量。说明:这个函数用矩阵pM变换3-D向量pV(x, y, z, 1),并且用w = 1投
阅读全文
摘要:从三点构造一个平面方程。定义:D3DXPLANE*WINAPID3DXPlaneFromPoints(D3DXPLANE*pOut,CONST D3DXVECTOR3*pV1,CONST D3DXVECTOR3*pV2,CONST D3DXVECTOR3*pV3);参数:pOut[in, out]指向D3DXPLANE的平面方程。pV1[in]指向D3DXVECTOR3结构的向量,用来构造平面的一个点。pV2[in]指向D3DXVECTOR3结构的向量,用来构造平面的一个点。pV3[in]指向D3DXVECTOR3结构的向量,用来构造平面的一个点。返回值:指向D3DXPLANE结构的平面方程,
阅读全文
摘要:D3DXVec3TransformCoord 函数用矩阵变换3-D向量,并且用w = 1投影结果。定义:D3DXVECTOR3*WINAPID3DXVec3TransformCoord(D3DXVECTOR3*pOut,CONST D3DXVECTOR3*pV,CONST D3DXMATRIX*pM);ParameterspOut [in, out]指向 D3DXVECTOR3 结构的操作结果。 pV [in]指向 D3DXVECTOR3 结构的向量。 pM [in]指向 D3DXMATRIX 结构的变换矩阵。 Return Value指向 D3DXVECTOR3 结构的变换后的向量。说明:这
阅读全文
摘要:http://zh.wikipedia.org/wiki/%E7%BA%B8%E5%A8%83%E5%A8%83%E7%B3%BB%E7%BB%9F纸娃娃系统又称Avatar系统是用在电脑游戏上的通过细分角色模型或图像,并重新组合,来增加角色外观数量的系统。根据引擎的不同,可分为“2D纸娃娃”和“3D纸娃娃”两种。2D纸娃娃据称最早出现在《网络创世纪(UO)》中。[来源请求]目录[隐藏]1 原理1.1 2D纸娃娃1.2 3D纸娃娃1.3 简化版纸娃娃系统2 使用纸娃娃系统的游戏3 参见4 外部链接[编辑] 原理[编辑] 2D纸娃娃在以前没有采用纸娃娃系统的游戏中,游戏角色的所有外观都是游戏美工
阅读全文