??xml version="1.0" encoding="utf-8" standalone="yes"?> 一?span> 跨^?/span>框架的基设施 (lg?/span>) 1. MySQL数据库操作组?/span> 2. U程?/span> ?/span> d?/span> 3. 基础数据cdQ容器,内存池,环Ş~冲?/span> 4. IOCP?/span>Epoll跨^台的面向对象通信框架 5. 集成LuaTinker脚本交互模块{?/span> 二?span> 开发方式与调试环境 本框架的初步设想是前期在Windows下?/span>VS.net 2008q行开发调试,争取?/span>Windows下解?/span>80%左右的逻辑错误。之后由ȝ序员把代码移植到LinuxQƈ使用Eclipse CDT可视化开发环境进行后期的调试工作。这样也大大降低招聘人员的知识要?/span>(不用?/span>Linux)Q在某一E度降低了h员成本和加快了开发效率?br> 1. LoginApp 即登录服务器, 它主要完成玩家帐L验证, 同时它通过BaseAppMgrq向玩家发送一?/span>SessionKey作ؓ基础服务?/span>(BaseApp)的登录密钥;同时LoginServerq向玩家发送服务器列表信息?/span> 2. BaseApp 卛_服务器, 也称q接服务器,它还l持着一个客Lq接列表(用户列表), q样它可以实现区域消息广播及通过BaseAppMgr实现世界聊天, 玩家信息查看{功能;它还负责消息的分发到CellAppq行处理Qƈ把结果返回到客户端?/span> 3. CellApp x戏服务器Q它负责世界数据的加载,游戏逻辑的处理及世界对象的管理。在本架构中当ؓ支线服务器?/span> 4. DBMgr 用户服务器,它负责用Lx据的存取。一般是用户d选择角色后就获得角色所有相x据给?/span>MapServer, q由MapServer定时保存角色的相x据?/span> 5. BaseAppMgr 基础服务器管理器Q主要负责分配基服务器给到客Lq接Q同时它采用某种{略可以实现用户的均衡负载等?/span> 6. CellAppMgr 支线服务器管理器, 它主要根据支U?/span>ID为基代理对象分配支线服务器实?/span>, q样可以实C客户端的通信了?/span> 7. DB 数据库服务器主要分ؓ三个库来存取Q?/span>AccountDB为玩家̎户信息,CharacterDB为玩家角色相关信息,WorldDB为所胡的世界数据?/span> Esc键关闭当前的非模式窗?(比方?查找H口, 切误?Alt + F4, q样会连VS.net2005都关? F5: 启动调试 Shift+F5: 停止调试 F7: 生成解决Ҏ F11: 独句调试 F9: 打断??取消断点 F12: 定位到函数的实现?br>???: 定位到函数的声明, 只能用右?-->选择A Shift+Alt+Enter: 切换全屏~辑 Ctrl+F: 查找 F3: 查找下一?br>Shift+F3: 查找上一?/p>
Ctrl+H: 替换 Ctrl+左右头? 一ơ可以移动一个单?br>Ctrl+上下头? 滚动代码屏幕Q但不移动光标位|?/p>
Ctrl+L: 删除当前?/p>
Ctrl+G: 转到指定?br>Shift+Alt+头? 选择矩Ş文本 //有点隑ֺ? Ctrl+Shift+A: d新项 Windows?E 打开资源理器?br>Windows?D 昄桌面?br>Windows?M 最化所有被打开的窗口?br>Alt+Tab 切换d栏中的激zȝ?/p>
在Linux上,古老的Linux CE序员一般会采用一个文本编辑工P比如QVI{,׃我以前是在windows下生zȝQ对VS.netq一cȝ工具颇ؓ喜爱Q它的开发方便快P又有开发辅助插件的支持Q你可以尽情用智能提C,快捷键,代码模板{高效生产代码。可以说~码更多的是依靠可视化工h错,快速蟩转代码等。反正我的意思就是开发相当愉悦。但Linux下的CE序员则不然Q我也曾l问q他们ؓ什么要采用VI{编辑工h~代码,首先Q他们给到我的第一{案?专业", 其实我也不太懂他们说的专业是什么,是传l意义上的,q是习惯性必ȝQ然后他们说Q?#8220;使用makefile文g来编译代码很爽,速度很快”Q这一Ҏ是赞同的Q但有个问题是程序员的入门门槛比较高Q要求大安要会q东西,q是ȝQ从HR招聘处可以看刎ͼ本来投C++E序员的人就比较了Q因为C++应用的领域基是应用YӞ游戏啊,电信啊,q是一些MFC界面性的东西Q而且要求功底比较好,实有时候招是挺隄Q更不用说还要有Linux开发经验的Z。最后,我问了linux开发不员说那你们的调试用什么工P他们_“gdb”, 又是一?手打牛肉?Q自我感觉很痛苦Q心里想“Z么有那么先进的工P比方_Eclipse CDTQ?你们不用?”Q其实他们心中也是有{案的,“~码要养成一U好习惯Q而不是依靠于某种工具”Q显然LinuxE序员在~码上大体要比windows上的E序员来得严|也感觉到他们的代码比较有质量。但很显然的Q由于开发环境的布v比较ȝQ对于大规模生是否能够每个人都有那么高素质的编E能力,那就是个"?Q?----- “猜不?”
针对上面的情况,我也自己分析了一下,软g开发的三大要素是什么,成本Q质量,q度Q?只有q三东西控制得好,那才能控制好目?br>那Y件编E的基础是什么? 当然是调用操作系l的API了,很显然的Q?不同操作pȝ有不同的APIQ除非你有一个跨q_的开发框Ӟ或者叫cd也行?br>接下来Y件架构在不同领域是否通用Q比方说Q通信框架Q很昄的,q是有区别的Q比方说电信pȝ与游戏系l,那显然还是不一L?br>最后,软g~码与接?API)是不是应该更多h常用的,而且Ҏ上手?友好W一Q?Q这h可以减少开发成本及协调工作?br>
ȝ一下,我心中已有答案了Q必采用一U大多数E序员可以接受的Q而且是他们熟悉的Q不要DIY的)Q而且开发速度快速的开发方式那才是真道理?br>以下是我的基本方案:
]]>
]]>
Ctrl+Tab 切换~辑ȝ口中的代码选项?/p>
Ctrl+F5: 开始执?不调?
Ctrl+Shift+F5: 重启调试
Ctrl+U: 生成当前目
F10: q程调试
Alt+F9: 昄断点H口
Ctrl+Shift+F: 在文件中查找
Ctrl+Shift+H: 在文件中替换
Ctrl+M,M: 隐藏或展开当前嵌套的折叠状?br>Ctrl+M,L: 所有过E设|ؓ相同的隐藏或展开状?或?右键 + L + O
Ctrl+M,P: 停止大纲昄 或者再按一ơCtrl+M,L 或?右键 + L + O
Alt+鼠标左按? 选择矩Ş文本
Ctrl+Shift+U: 全部变ؓ大写
Ctrl+U: 全部变ؓ写
Ctrl+K, Ctrl+C: 注释
Ctrl+K, Ctrl+U: 解除注释
//----------------------------------------
VAssistX: 操作
1. 定义标准的代码段, q设|快捷键
2. Alt+M, 再打上函数名的前几个字母, ׃qo掉很多函? 最后按Enter定位到当前文件所查找的函C
3. Shift+Alt+O, 查找文g, 输入文g名的前几个字? ׃qo掉很多文? 最后按Enter定位到当前文件所查找的文?br>4. Alt+O: 切换?h?cpp文g
5. 右键+查看所有引??VassistX菜单中的Find References, Find References in Files : 查看函数引用的所有地?br>6. Shift+Alt+S: 查找全局变量
//----------------------------------------
F7: 查看代码
Shift+F7: 查看H体设计?/p>
]]>
// 用到5张图?
{
blendTexture = 0
layer0Texture = 1
layer1Texture = 2
layer2Texture = 3
layer3Texture = 4
}
!!ARBfp1.0
// 定义帔R:
PARAM c[1] = { { 1, 0.30000001, 0.69999999 } };
// 声明3个寄存器:
TEMP R0;
TEMP R1;
TEMP R2;
// 开始?
// 一.W?层和W?层用第4张图的x通道作ؓalphaq行混合:
TEX R1, fragment.texcoord[0], texture[0], 2D;
TEX R0, fragment.texcoord[1], texture[1], 2D;
ADD R2, R0, -R1;
// r2=Tex1-Tex0
TEX R0, fragment.texcoord[4], texture[4], 2D;
MAD R2, R0.x, R2, R1;
// r2 = Tex4.x*r2+Tex0
// 说明:
// 其中的Tex4.x是对应第1层alpha? 下面把Tex4.x当a1?br>// ?r2 = a1 * (Tex1-Tex0) + Tex0
// 转换一下即? Tex0*(1-a1)+a1*Tex1, 呵呵,看到了吧,q就是合公?
// ?W?层和前面l果使用W?张图的y通道作ؓalphaq行混合:
TEX R1, fragment.texcoord[2], texture[2], 2D;
ADD R1, R1, -R2;
// r1=Tex2-r2
MAD R2, R0.y, R1, R2;
// r2 = Tex4.y*r1+r2, ?a2*r1+r2 = a2*(Tex2-r2)+r2, 即r2*(1-a2)+Tex2*a2, 其中r2x上次0?层合后的结?br>// ?W?层和前面l果使用W?张图的z通道作ؓalphaq行混合:
TEX R1, fragment.texcoord[3], texture[3], 2D;
ADD R1, R1, -R2;
// r1=Tex3-r2
MAD R1, R0.z, R1, R2;
// r1=a3*r1+r2 , ?a3*r1+r2 = a3*(Tex3-r2)+r2, 即r2*(1-a3)+Tex3*a3
// q样r1׃存了最l的混合l果
// ?让阴影地表光泽系Cؓ0(Tex4.w即a通道代表地Ş的阴?0为阴?1为正?而每层脓图中的a通道是光泽通道,所以R1.w保存的是最l的光泽通道?:
MUL R0.x, R1.w, R0.w;
// r0.x = r1.w(光泽)*Tex4.w(阴媄? 是阴影则=0,否则=1)
// 计算削减pL?
MAD R0.w, R0, c[0].y, c[0].z; // r0乘上0.3(削减?0Q?再加上一个常?.69999999
// 反射高光 = secondary_color(反射?*光泽:
MUL R0.xyz, R0.x, fragment.color.secondary;
// 贴图最lcolor = 最l脓图出的color*削减pL:
MUL R1.xyz, R1, R0.w;
// 贴图最lcolor * primary_color(光照色或是顶点色) + 反射高光:
MAD result.color.xyz, R1, fragment.color.primary, R0;
// alpha:
MOV result.color.w, c[0].x;
END
本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/flipcode/archive/2008/03/03/2143452.aspx
2. l制
pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
DrawPrimitive()
DrawIndexedPrimitive()
DrawPrimitiveUP()
DrawIndexedPrimitiveUP()
3. 颜色
4. 片段试
(1) 深度试
g_pDevice->SetRenderState(D3DRS_ZENABLE, TRUE); //glEnable(GL_DEPTH_TEST);
g_pDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL); //glDepthFunc(GL_LEQUAL);
//--------------------------------------------------------------------------------------------------------
g_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); //glEnable(GL_CULL_FACE);
(2) Alpha试
//--------------------------------------------------------------------------------------------------------
g_pDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); //glEnable(GL_ALPHA_TEST);
g_pDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER); //glAlphaFunc(GL_GREATER, 0.1f);
g_pDevice->SetRenderState(D3DRS_ALPHAREF, 0.1 * 255); //取D?0 ~ 255
(3) 剪裁试 (q面剪切)
//--------------------------------------------------------------------------------------------------------
// Enable clip plane for reflection map
CMatrix44f pWorldViewProjIT=m_pWorldViewProj;
//pWorldViewProjIT.Transpose();
pWorldViewProjIT.Invert();
// Transform plane to clip-space
float pClipSpacePlane[4];
float pClipPlane[]= { 0, 0, 1, 0};
// Check if camera is below water surface, if so invert clip plane
CVector3f pEye=(CVector3f)m_pCamera.GetPosition();
if(-pEye.m_fZ<0.0)
{
pClipPlane[2]=-pClipPlane[2];
}
MatrixTransformPlane(pClipSpacePlane, pClipPlane, pWorldViewProjIT);
// enable clip plane now
g_pDevice->SetClipPlane(0, pClipSpacePlane);
g_pDevice->SetRenderState(D3DRS_CLIPPLANEENABLE, 1);
(4) 模板试
//--------------------------------------------------------------------------------------------------------
g_pDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE);
g_pDevice->SetRenderState(D3DRS_STENCILFUNC, 3DCMP_ALWAYS);
g_pDevice->SetRenderState(D3DRS_STENCILREF, 0x1); //取D?0 ~ 255
Device->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP);
5. U理操作
g_pDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
g_pDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
g_pDevice->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
g_pDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
g_pDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
6. ~冲区操?br>
(1) 颜色~冲
//--------------------------------------------------------------------------------------------------------
g_pDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA);
g_pDevice->SetRenderState(D3DRS_COLORWRITEENABLE, 0x000000F);
(2) 深度~冲
//--------------------------------------------------------------------------------------------------------
g_pDevice->SetRenderState(D3DRS_ZENABLE, TRUE); //glEnable(GL_DEPTH_TEST);
g_pDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE); //glDepthMask(GL_TRUE);
(3) 模板~冲
//--------------------------------------------------------------------------------------------------------
(4) 渲染到纹?br> //--------------------------------------------------------------------------------------------------------
// Render targets
IDirect3DSurface9 *m_plD3DBackbufferSurf,
*m_plD3DDepthStencilSurfAA,
*m_plD3DDepthStencilSurf;
CRenderTarget *m_pRTRefraction, *m_pRTReflection; //(自定义纹理类)
//-----------------------------------------------------------------------------------
// Get backbuffer
g_pDevice->GetRenderTarget(0, &m_plD3DBackbufferSurf);
// Get depthstencil
g_pDevice->GetDepthStencilSurface(&m_plD3DDepthStencilSurfAA);
// Restore previous states
g_pDevice->SetRenderTarget(0, m_plD3DBackbufferSurf);
g_pDevice->SetDepthStencilSurface(m_plD3DDepthStencilSurfAA);
// (1)折射?-------------------------------------------------------------------------
//下面的语句调用了 g_pDevice->CreateRenderTarget(iWidth, iHeight, (D3DFORMAT) iFormat, (D3DMULTISAMPLE_TYPE)iAASamples, 0, 0, &m_plD3Surf, 0));
if(FAILED(m_pRTRefraction->Create(m_fWidth>>1, m_fHeight>>1, D3DFMT_A8R8G8B8)))
{
return APP_ERR_INITFAIL;
}
// Create depthstencil withouth multisampling
g_pDevice->CreateDepthStencilSurface(m_fWidth, m_fHeight, D3DFMT_D24X8, (D3DMULTISAMPLE_TYPE)0, 0, 0, &m_plD3DDepthStencilSurf, 0);
g_pDevice->SetRenderTarget(0, m_pRTReflection->GetSurface());
g_pDevice->StretchRect(m_plD3DBackbufferSurf, 0, m_pRTRefraction->GetSurface(), 0, D3DTEXF_NONE);
// (2)反射?----------------------------------------------------------------------------------
m_pRTReflection=new CRenderTarget;
if(FAILED(m_pRTReflection->Create(m_fWidth>>2, m_fHeight>>2, D3DFMT_A8R8G8B8)))
{
return APP_ERR_INITFAIL;
}
g_pDevice->SetRenderTarget(0, m_pRTReflection->GetSurface());
//-----------------------------------------------------------------------------------
g_pDevice->SetRenderTarget(0, m_pRTReflection->GetSurface());
g_pDevice->SetDepthStencilSurface(m_plD3DDepthStencilSurf);
g_pDevice->Clear(0, 0, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(255, 0, 0, 128), 1.0f, 0);
SetViewport(m_pRTReflection->GetWidth(), m_pRTReflection->GetHeight());
//-----------------------------------------------------------------------------------
D3DXSaveTextureToFile("imageTex.jpg",D3DXIFF_JPG,(IDirect3DTexture9*)m_pWavesBump->GetTexture(),NULL);
7. 混合操作
g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); //glDisable(GL_BLEND);
g_pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
g_pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
8. 灯光与材?br> g_pDevice->SetRenderState(D3DRS_LIGHTING, FALSE); //glDisable(GL_LIGHTING);
D3DMATERIAL9 mtrl;
mtrl.Ambient = a;
mtrl.Diffuse = d;
mtrl.Specular = s;
mtrl.Emissive = e;
mtrl.Power = p;
Device->SetMaterial(&mtrl); //在设|纹理前讑֮
//讄当前使用的纹?br>