怎么用Delphi一步一步地学习游戏开发

编程入门网-用Delphi + DirectX开发简单RPG游戏
您的位置:&&
用Delphi + DirectX开发简单RPG游戏
文章来源:电脑爱好者 作者:郭磊
 提到 RPG (角色扮演游戏,Role Play Game),在座各位恐怕没有不熟悉的。从古老经典的 DOS 版《仙剑奇侠传》到新潮花哨的《轩辕剑》系列,无不以曲折优美的故事情节,美丽可人的主角,悦耳动情的背景音乐,震撼了每一个玩家的心灵。而说到 RPG,就不能不提 DirectX,因为 PC 上大部分的 RPG 都是用这个冬冬开发的。早在《轩辕剑叁外传――天之痕》推出的时候,我就曾想过用 DirectX 写一个自己的 RPG,自己来安排故事情节的发展,却总是因为这样或那样的事情,一直没有能够实现这个心愿。在耗费了宝贵的几年青春,搞定了诸如考试、恋爱、出国等琐碎杂事之后,我终于可以在这个 SARS 肆虐的时代,坐在陪伴了我整个大学生涯的电脑前,听着颓废而又声嘶力竭的不知名歌曲,写一些一直想写却没有写的东西。
& DirectX 简介
   DirectX 对于大多数游戏爱好者来说都不陌生(当然,那些只在DOS下艰苦作战的朋友例外),在安装一个游戏前,系统总是会提示你是否需要同时升级 DirectX。简单地说,DirectX 就是一系列的 DLL (动态连接库),通过这些 DLL,开发者可以在无视于设备差异的情况下访问底层的硬件。DirectX 封装了一些 COM(Component Object Model)对象,这些 COM 对象为访问系统硬件提供了一个主要的接口。首先,我们先来看一下 DirectX 的结构:
图1:DirectX 基本结构
   DirectX 目前主要由以下七个主要部分组成:
& DirectDraw C 为程序直接访问显存提供接口,同时和其它的Windows应用程序保持兼容。
& Direct3D C 为访问3D加速设备提供接口。
& DirectInput C 为各种输入设备提供接口,比如鼠标,键盘,力反馈游戏手柄和操纵杆等。
& DirectPlay C 为游戏提供网络功能接口,比如支持通过 TCP/I、IPX 等协议进行游戏中的数据传输。&
& DirectSound C 为访问声卡提供接口,支持WAV、MIDI 等文件的直接播放。&
& DirectSound3D C通过此接口,可以模拟出某一个声音在三维空间中任何一个位置的播放所产生的效果,从而达到逼真的环绕立体声。&
& DirectMusic C 此接口主要是生成一系列的原始声音采样反馈给相应的用户事件。&
& 开发工具(Delphi & DelphiX)
   下一步,我们来介绍开发工具。我们通常所安装的其实只有 DirectX 的运行库(一系列封装好的DLL文件),其内部函数结构非常复杂,所以我们还需要 DirectX 的开发工具。所谓工欲善其事,必先利其器,虽然微软公布了 DirectX SDK,但是由于所有的头文件都是用 C/C++ 写成的,作为 Delphi 的热情拥护者,我们还是无从下手。把 C/C++ 写成的代码转换成 Pascal 可不是一件容易的事,但是不必担心,这项工作已经有人做好了。日本人 Hiroyuki Hori 为 Delphi 写了一个免费的组件包,称作 DelphiX。这些组件可以使得开发者可以轻松地访问 DirectX 的 DirectDraw、Direct3D、DirectSound、DirectInput(支持力反馈手柄)和 DirectPlay 对象。目前的 DelphiX 包支持 Borland Delphi 3/4/5/6/7 和 DirectX 7.0 以上版本(见图2)。安装了 DelphiX 之后,我们将不需要再安装微软的 DirectX SDK。在这篇文章里我们将使用的就是 DelphiX。
& TDXDraw DirectDraw 和 Direct3D 组件&
& TDXDIB 容纳DIB(设备无关位图,Device Independent Bitmap)的组件&
& TDXImageList 图片列表组件&
& TDX3D Direct3D 组件 (和TDXDraw一起使用)&
& TDXSound DirectSound 组件&
& TDXWave 容纳 Wave(波形音频文件)的组件&
& TDXWaveList Wave文件列表组件&
& TDXInput 输入组件,包括键盘和手柄输入&
& TDXPlay 通讯组件,用于网络游戏开发&
& TDXSpriteEngine 精灵引擎,用于管理游戏中产生的精灵(Sprite)详见游戏开发过程&
& TDXTimer 高速定时器,比 TTimer 要更快,更准确&
& TDXPaintBox TpaintBox 的 DIB 版本&
& TDXForm 优化过的 TForm,专门用于游戏开发&
& 动画原理
  在介绍动画的原理之前,我们先来介绍几个DirectX的术语。
& 表面(Surfaces)
& 这里我们暂且称作表面吧。在 DirectX 中,显存中被用来存储各种位图和视频缓冲的部分均被称作表面。而当前被显示在屏幕上的表面被称作主表面(primary surface)。在实验动画的过程中,我们通常要预先生成至少一个不显示的表面,称作后台表面(offscreen surface)。在需要产生动画的时候,我们可以直接将后台表面中的内容显示到屏幕上,而将原来主表面翻转到后台而不再显示。这么说可能大家更容易明白,我们大家在小的时候都玩过在书上画小人的游戏吧。在每页书的下方空白处画上一个个小人,每页上的内容逐渐发生变化,然后快速翻动整本书,就可以看到有小人在跳动。我们现在的主表面就是你现在正看到那页书,后面的那些还没有翻到的页面就是后台表面,通过翻动实现了动画效果。在运行一些大型游戏的时候,在显存已经用完的情况下,游戏将自动调用系统内存。目前而言,想要流畅地运行一个 DirectX 游戏,非 3D 类的最好有 4M 以上的显存,3D 类的则显存越大越好。
& 每秒帧数(Frames per Second)
& 通常简称 FPS,用我们刚才举的例子来描述,也就是指我们每秒所翻过的书的页数。当帧数达到24帧每秒时,人眼已经无法分辨,从而认为画面是连续的。电影采用的24帧每秒,而电视采用的是25帧每秒。实际上,在日本的动画制作中有一拍二(12帧每秒)甚至一拍三(8帧每秒)的做法,同样可做出欺骗肉眼的效果,这个我们暂且不作讨论。在游戏中,我们将采用24帧或25帧每秒的速度以达到欺骗肉眼的效果。
& 位图和精灵(Bitmaps and Sprites)
& 精灵是指在游戏中用来实现动画效果的一组图片,这些图片通常采用位图格式,并且有用特定颜色填充的透明区域。如下图,就是一个精灵。
& 图中的用黑色填充部分就是预先所定义的透明区域,在游戏中,我们按照白色线条可以将整个图片分别切开成9块,每块的大小均为80×50。我们先从左向右,然后在从上往下对起进行编号为1~9。如果我们将这九张图片依次循环显示出来,并且设置播放的速度为每秒24张,我们就可以得到一个飞船在旋转的动画,也就是一个飞船精灵。
& 开发过程
   说了许多废话以后,下面我们脱离纸上谈兵,开始正式的开发。在本例中,我们主要实现用鼠标来控制精灵往八个方向行走。所有图片均来自大宇公司《轩辕剑叁――天之痕》,其中精灵采用故事中陈靖仇的形象特此致谢。同时,请各位读者勿把这些图片用于商业用途,否则后果自负。
   打开 Delphi 并新建一个应用程序,依次选中 DelphiX 组件栏的 TDXDraw、TDXImageList、TDXInput、TDXTimer、TDXSpriteEngine 组件,添加到用户区,分别命名为 DXDraw、DXImageList、DXInput、DXTimer、DXSpriteEngine,按照下表设置其各项属性。对于 DXImageList,点击 Object Inspector 中的 Items,在其中加入两张位图(background.bmp和player.bmp),分别命名为 background 和 player,设置 player 的 PatternHeight 和 PatternWidth 均为120象素,设置其 transparentcolor 为粉红色(clFuchsia)。
& 控件 属性 值&
& DXDraw Align alClient&
& Display.Width 800&
& Display.Height 600&
& Display.BitCount 24&
& Options [doAllowReboot, doWaitVBlank, doCenter, doFlip]&
& AutoInitialize True&
& DXTimer Enabled True&
& Interval 0&
& DXInput Mouse.BindInputState True&
& Mouse.Enabled True&
& DXSpriteEngine DXDraw DXDraw
   下面就是全部的源程序,请先在 Delphi 中产生相应事件然后填入代码,最后按下F9运行就可以运行程序了。用鼠标点击你的目的地,陈靖仇就会自动跑到指定地点。尝试一下开发一些简单的游戏吧,用 DelphiX 这把牛刀!所有程序在 Delphi 4.0 + DirectX 8.0 环境下测试通过。本文所需控件可以在 这里 下载。
& Interface
& Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
& StdCtrls, ExtCtrls, Menus, DXClass, DXSprite, DXInput, DXD
& TDirection = (DrUp, DrDown, DrLeft, DrRight, DrUpLeft, DrUpRight, DrDownLeft, DrDownRight);
& {自定义游戏中所用到的方向}
& TPlayerSprite = class (TImageSprite)
& CanMove: B
& protected
& procedure DoMove(MoveCount: Integer);
& procedure MoveTo(MoveCount:I Direction: TDirection);
& procedure DoCollision(Sprite: TS var Done: Boolean);
& TMainForm = class(TDXForm) {此处使用优化过的TDXForm来代替TForm}
& DXTimer: TDXT
& DXDraw: TDXD
& DXSpriteEngine: TDXSpriteE
DXInput: TDXI
& ImageList: TDXImageL
& procedure FormKeyDown(Sender: TO var Key: W Shift: TShiftState);
& procedure DXDrawFinalize(Sender: TObject);
& procedure DXDrawInitialize(Sender: TObject);
& procedure FormCreate(Sender: TObject);
& procedure DXTimerTimer(Sender: TO LagCount: Integer);
& procedure DXDrawMouseDown(Sender: TO Button: TMouseB Shift: TShiftS X, Y: Integer);
& procedure DXDrawMouseMove(Sender: TO Shift: TShiftS X, Y: Integer);
& procedure DXDrawMouseUp(Sender: TO Button: TMouseB Shift: TShiftS X, Y: Integer);
& procedure FormClose(Sender: TO var Action: TCloseAction);
& AnchorX: I
& AnchorY: I {鼠标点击发生的位置}
& MouseX: I
& MouseY: I {鼠标当前位置}
& PlayerSprite: TPlayerS {游戏中我们所用鼠标控制的人物}
& BackSprite: TBackGroundS {游戏的背景图}
& speed=5; {游戏人物向各个方向运动时的动画播放速度}
& MainForm: TMainF
& Steps: I {用于控制切换精灵动画图片的参数}
& implementation
& {$R *.DFM}
& procedure TPlayerSprite.DoCollision(Sprite: TS var Done: Boolean);
& Done:=F {已经侦测到碰撞,不再重复检测碰撞}
& {检测游戏人物是否与其它精灵发生了碰撞,此处可以扩展为对话等情节}
& procedure TPlayerSprite.DoMove(MoveCount: Integer);
& l,r,d,u: B
& absX,absY: I {游戏人物的当前位置与目的地的绝对距离}
& inherited DoMove(MoveCount);
& MoveCount:=Trunc(MoveCount*1.5);
& l:= r:= u:= d:=
& if (Trunc(X)-MainForm.AnchorX&0) then l:=true else r:=
& if (Trunc(Y)-MainForm.AnchorY&0) then u:=true else d:=
absX:=abs(Trunc(X)-MainForm.AnchorX);
& absY:=abs(Trunc(Y)-MainForm.AnchorY);
& if absX&4 then begin l:= r:=
& if absY&4 then begin u:= d:=
& {如果绝对距离已经小于四个象素,则认为已经到达目的地}
& if u and l and not d and not r then MoveTo(MoveCount,DrUpLeft);
& if u and r and not l and not d then MoveTo(MoveCount,DrUpRight);
& if d and l and not r and not u then MoveTo(MoveCount,DrDownLeft);
& if d and r and not u and not l then MoveTo(MoveCount,DrDownRight);
& if d and not l and not r and not u then MoveTo(MoveCount,DrDown);
& if u and not l and not r and not d then MoveTo(MoveCount,DrUp);
& if l and not u and not r and not d then MoveTo(MoveCount,DrLeft);
& if r and not l and not u and not d then MoveTo(MoveCount,DrRight);
& {根据目的地来判断运动的方向,从而播放相应方向运动的动画}
& C {检测碰撞}
& Engine.X := -X+Engine.Width div 2 - Width div 2;
& Engine.Y := -Y+Engine.Height div 2 - Height div 2;
& {移动引擎,从而是游戏人物处于舞台的正中央}
& procedure TMainForm.DXTimerTimer(Sender: TO LagCount: Integer);
& if not DXDraw.CanD
& {检测DXDraw是否可以画,否则退出}
& DXInput.U
& {捕捉各类设备输入,这里我们用来检测鼠标的输入}
& LagCount := 1000 div 60;
& {用来控制整个游戏运行速度的参数}
& DXSpriteEngine.Move(LagCount);
& DXSpriteEngine.D
& DXDraw.Surface.Fill(0);
& {将整个屏幕填充为黑色}
& DXSpriteEngine.D
& with DXDraw.Surface.Canvas do
& brush.style:=
& pen.style:=
& pen.color:=
& Font.Color:=clW
& Font.Size:=10;
& textout(10,10,'Press ESC to Quit');
& textout(100,100,'X: '+IntToStr(AnchorX)+'Y: '+IntToStr(AnchorY));
{鼠标点击的位置经转换后在游戏世界中的坐标}& textout(100,200,'Sprit x:'+IntToStr(Trunc(PlayerSprite.x))+'Y: ' +IntToStr(Trunc(PlayerSprite.y)));& {精灵在游戏世界中的坐标}& textout(100,300,'Relative x:'+IntToStr(AnchorX-Trunc(PlayerSprite.x))+'Y: ' +IntToStr(AnchorY-Trunc&&& (PlayerSprite.y)));& {精灵当前位置与目的地之间的绝对距离}& textout(200,100,'Mouse x:'+IntToStr(MainForm.MouseX)+'Y: ' +IntToStr(MainForm.MouseY));& {鼠标当前位置,相对于窗口左上角,未转换为游戏世界坐标}& R&& {在字母上输出相应参数,用于程序调试}& DXDraw.F& {将内存中的后台表面翻转到当前并且显示}&
& procedure TMainForm.DXDrawFinalize(Sender: TObject);& begin& DXTimer.Enabled := F& {关闭定时器}&
& procedure TMainForm.DXDrawInitialize(Sender: TObject);& begin& DXTimer.Enabled := T& {启动定时器}&
& procedure TMainForm.FormCreate(Sender: TObject);& begin& Steps:=0;& AnchorX:=0;& AnchorY:=0;
& MouseX:=320;& MouseY:=240;& {默认使鼠标处于屏幕的中央}
& ImageList.Items.MakeColorT
& DXDraw.ColorTable := ImageList.Items.ColorT& DXDraw.DefColorTable := ImageList.Items.ColorT& DXDraw.UpdateP& {更新系统调色板}
& BackSprite:=TBackgroundSprite.Create(DXSpriteEngine.Engine);
& with TBackgroundSprite(BackSprite) do
& SetMapSize(1, 1);{设定背景显示样式为1×1}
& Image := ImageList.Items.Find('background'); {载入背景图片}
& Z := -2; {设定背景层次}
& Tile := T {设定背景填充样式为平铺}
& PlayerSprite := TPlayerSprite.Create(DXSpriteEngine.Engine);
& with TPlayerSprite(PlayerSprite) do
& Image := ImageList.Items.Find('player');
& Width := Image.W
& Height := Image.H
& {载入游戏人物}
& procedure TMainForm.FormKeyDown(Sender: TO var Key: W
& Shift: TShiftState);
& {如果按了Esc,则退出}
& if Key=VK_ESCAPE then
& {全屏模式和窗口模式的切换}
& if (ssAlt in Shift) and (Key=VK_RETURN) then
& DXDraw.F
& if doFullScreen in DXDraw.Options then
& RestoreW
& DXDraw.Cursor := crN
& BorderStyle := bsS
& DXDraw.Options := DXDraw.Options - [doFullScreen];
& end else
& DXDraw.Cursor := crN
& BorderStyle := bsN
& DXDraw.Options := DXDraw.Options + [doFullScreen];
& DXDraw.I
& procedure TMainForm.DXDrawMouseDown(Sender: TO Button: TMouseB
& Shift: TShiftS X, Y: Integer);
& AnchorX := x + Trunc(PlayerSprite.x)-320;
& AnchorY := y + Trunc(PlayerSprite.y)-240;
& {将鼠标在屏幕上点击的位置转换到游戏世界中}
& PlayerSprite.CanMove:=T
& {此参数允许鼠标拖动}
& procedure TMainForm.DXDrawMouseMove(Sender: TO Shift: TShiftS X,
& Y: Integer);
& if PlayerSprite.CanMove then
& AnchorX := x + Trunc(PlayerSprite.x)-320;
& AnchorY := y + Trunc(PlayerSprite.y)-240;
& {在鼠标拖动过程中将鼠标在屏幕上点击的位置转换到游戏世界中}
& MouseX:=X;
& MouseY:=Y;
& {鼠标当前位置}
& procedure TMainForm.DXDrawMouseUp(Sender: TO Button: TMouseB
& Shift: TShiftS X, Y: Integer);
& PlayerSprite.CanMove:=F
& procedure TMainForm.FormClose(Sender: TO var Action: TCloseAction);
& DXSpriteEngine.F
& procedure TPlayerSprite.MoveTo(MoveCount: I Direction: TDirection);
& {控制精灵往各个方向移动}
& case Direction of
& Y := Y-(150/1000)*MoveC
& Inc(steps);
& AnimPos:=steps div speed+20+1;
& {当前动画中播放的图片序号}
& if steps&4*speed-2 then steps:=0;
& Y := Y+(150/1000)*MoveC
& Inc(steps);
& AnimPos:=steps div speed+1;
& if steps& 4*speed-2 then steps:=0;
& X := X-(150/1000)*MoveC
& Inc(steps);
& AnimPos:=steps div speed+10+1;
& if steps&4*speed-2 then steps:=0;
& DrRight:
& X := X+(150/1000)*MoveC
& Inc(steps);
& AnimPos:=steps div speed+30+1;
& if steps&4*speed-2 then steps:=0;
& DrUpLeft:
& X := X-(150/1000)*MoveC
& Y := Y-(150/1000)*MoveC
& Inc(steps);
& AnimPos:=steps div speed+15+1;
& if steps&4*speed-2 then steps:=0;
& DrUpRight:
& X := X+(150/1000)*MoveC
& Y := Y-(150/1000)*MoveC
& Inc(steps);
& AnimPos:=steps div speed+25+1;
& if steps&4*speed-2 then steps:=0;
& DrDownLeft:
& X := X-(150/1000)*MoveC
& Y := Y+(150/1000)*MoveC
& Inc(steps);
& AnimPos:=steps div speed+5+1;
& if steps&4*speed-2 then steps:=0;
& DrDownRight:
& X := X + (150/1000)*MoveC
& Y := Y + (150/1000)*MoveC
& Inc(steps);
& AnimPos:=steps div speed+35+1;
& if steps&4*speed-2 then steps:=0;
   通过以上的讲解和例子,相信大家已经对 Delphi 下的 DirectX 游戏开发有了初步的概念。国内讲解开发 DirectX 游戏的权威资料很少,如果这篇讲解可以起到抛砖引玉的效果的话,我将再高兴不过了。本文部分内容借鉴了国外一些游戏开发网站的技术文档,在此一并致谢。如果各位有什么问题需要和我交流,请发信至eagle_。
Copyright&
Powered by 编程入门网 All Rights Reserved. | 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
新手如何自学游戏编程
下载积分:30
内容提示:新手如何自学游戏编程
文档格式:PDF|
浏览次数:1078|
上传日期: 14:36:39|
文档星级:
全文阅读已结束,如果下载本文需要使用
 30 积分
下载此文档
该用户还上传了这些文档
新手如何自学游戏编程
官方公共微信如何使用Delphi设计强大的服务器程序_Delphi_编程开发B1_最全面的网站教程
当前位置:&&&&&&如何使用Delphi设计强大的服务器程序
如何使用Delphi设计强大的服务器程序
现在网络的流行,使得服务器程序得到了广泛的应用,那么我们使用Delphi如何设计出强壮的服务器呢?有人说,如果要设计服务器的话,一定要使用VC来设计,其实这个人说的有一定道理,因为如果你要使用Delphi来设计服务器的话,要想设计高效的服务器就不要使用Delphi带来的大部分的控件(最好不要使用Delphi控件),为什么呢?下面我会告诉大家。这样的话你全部使用API来设计服务器,就同VC没有太大的区别了。使用Delphi来设计服务器程序,具体选择是使用窗体消息模式还是使用完成端口的模式,这主要看你的用户连接数量来决定。如果你的用户连接数量小于1000人的话,并且处理的数据量不大的话,可以使用窗体的消息模式来进行服务器的开发,而如果大于1000,这样最好使用完成端口来开发服务器。我这里建议大家最好使用完成端口模式,因为你不可能保证你的用户数量不变化,同时由于你的服务器如果运行一段时间没有问题的话,最好做成WIN 的服务程序,这样可以保证后期的维护比较少。现在介绍你在开发Delphi服务器的时候需要注意地方:1 不要在程序中使用String变量这个也是在实际的开发过程中发现的,我最开始开发的时候,为了简单一些,就大量使用String变量来开发程序,但程序总是在运行一段时间后出现问题,后来查原因也不太清楚,到网上查资料,发现有人介绍不要使用String来做变量,将自己的程序全部修改成数组问题就基本解决了。2 使用快速的加密算法如XOR 加密或DES加密等算法服务器在与客户端传递的时候一定要进行加密,但使用什么类型的加密算法呢?不要使用那种需要大量运算的算法如RSA等算法,最好使用XOR加密或DES换位加密算法,这样主要是满足普通的加密密文的要求,又保证服务器的运算速度。你也可以使用RSA加密密文,但这会造成服务器处理变慢,而如果遇到大量的处理时候,很容易服务器就拒绝服务器。3 使用原ADO函数来连接数据库服务器程序通常都与数据库想结合,那么使用Delphi开发的时候,通常使用ADO的控件来制作,但如果你学习ADO手册会发现,对于服务器其实不需要控件来完成数据的操作。可以直接使用ADO相应的函数来完成。主要因为服务器程序与数据库通常都是比较简单的操作,没有很复杂的。所以使用原ADO模式就可以了。这样也减少由于ADO控件带来的问题。4 应多使用&池&服务器在设计的过程,一定要大量的变量支持,如果不使用池这个概念,你的程序将在创建和释放变量过程中浪费大量的时间。而且容易出现问题。设计过程中尽量不要创建和释放变量,如果能考虑到的变量,都在开始的运行的时候创建完毕。这样可以加快程序的运行速度,减少冲突。具体如何使用池这个技术,以后有时间再考虑写一篇介绍一下。5 熟练使用指针操作如果你不熟悉指针操作,那么你几乎无法设计出高效的服务器,如果你要真正的理解指针的概念,对于设计服务器来说就是如虎添翼。下面举个例子,如使用Recv接收数据到Buffer中后,你需要进行解密操作,你可以使用下面的方法进行:var& a,b:array [1..8]& i :& ResultBuffer :array [1..Max]begin& for i := 1 to Sizeof(Buffer) div 8 do& begin&&& move(Buffer[(i-1)*8+1],a,8);&&& Des(a,b,true);& //这里使用DES加解密处理&&& move(b,ResultBuffer[(i-1)*8+1],8);&end大家看一看,上面的代码,思路很清楚,就是将接收到的Buffer分别按8个提到变量a中,再使用DES解密算法解密成b,再放回ResultBuffer中。如果你熟练使用指针的话,效率会极大的提高var& a,b:P& i :& ResultBuffer :array [1..Max]begin& for i := 1 to Sizeof(Buffer) div 8 do& begin&&& a := @Buffer[(i-1)*8+1];&&& b := @ResultBuffer[(i-1)*8+1]&&& Des(a^,b^,true);& //这里使用DES加解密处理&end再看一看上面的代码,是不是少了两个Copy数据的过程,这就是指针给你带来的高效。6 多使用WSASend,WSARecv等WinSocket 2函数,不要使用Send,Recv函数这个主要看你的服务器运行在什么系统中了,如果运行在WIN系统里,最好使用WSA系统的函数,因为Microsoft毕竟将它们都优化了。7 合理使用线程池操作高效的服务器一定要使用线程池技术,使用多少线程合理,需要线程处理什么样的数据。我个人认为如果要使用线程池的技术,一定要处理那些最费时的操作,如数据库的查询操作。8 如果服务器使用了&池&的概念,这就又出现了一个问题,如何高效的分配池呢?我在程序中大量的使用池,如线程池,数据池等。当数据到达的时候,如何分配池呢?这里就不告诉大家了,以后再专门写一篇关于池的文章。详细的介绍如何使用池。大家也可以自己考虑一下。9 使用高效的字符串操作函数因为服务器一定要进行大量的字符串运行,如果使用Delphi自带的函数来操作,就比较费时,所以这里推荐大家使用QStrings.pas字符串操作函数集,相信会对大家有帮助的。10 优化你的SQL查询语句你可以一方面优化SQL查询语句来提高运行效率,另一方面你还可以使用存储过程来更大的提高运行效率。(这些知识你需要看数据库的内容,这里具体如何优化就不说了。)& 上面介绍是我的实践经验,不一定全对,希望大家能有帮助。如果有更好的方法,也可以讨论。&&& &
上一篇:下一篇:当前位置:
> > 查看文章
浅谈Delphi过程与函数01 – 零基础入门学习Delphi20
浅谈Delphi过程与函数01
让编程改变世界
Change the world by program
浅谈Delphi过程与函数
书到用时方恨少,在我们的冒泡排序V2.0中,我们把冒泡算法和Edit筛选放在了一起,看起来难免有些缭乱~
过程与函数我们在不知不觉中已经接触甚多,如 IntToStr()将整型作为参数,返回看上去一样的字符串类型,它是一个函数,因为他有返回值;
Copy()是实现字符串拷贝功能的一个过程,因为他只需要按照计划去拷贝,不需要返回任何内容。
Delphi过程分类
Delphi 的过程分为两种:系统标准过程与用户自定义过程。
系统标准过程是由系统内部定义好的过程,我们不需要写任何的代码,直接调用即可,如Insert()、Copy()等。
自定义过程由用户自己编写代码定义,它又分为事件过程与通用过程两种。
事件过程我们再熟悉不过,当我们添加一个Button按键并双击它,编译器就自动为我们创建了Button1Click()这样一个事件过程。
Delphi过程的创建
通用过程用于完成某个特定的功能,由我们自行创建并调用。我们先来参观一下格式标准:
&&&Procedure 过程名([形参列表])// 参数可选
//声明常量、变量或另一个过程或函数等
过程名是任何合法的标识符
形式参数又简称形参,是定义过程或函数时使用的参数,可以包括若干个形式参数,也可以没有形参
形参VS实参:请小甲鱼童鞋解释下
在过程中声明、定义的变量的声明周期只限于本过程。
形式参数列表中如果有多个参数,则用分号分隔,而函数或过程调用中,实参用逗号分隔。
形参与实参要求数量相同,顺序也要相同,否则会出现编译错误或结果错误。
Delphi过程示例:
小甲鱼在干啥
如果您觉得小甲鱼的视频能够给您带来知识和快乐,您可以选择赞助我们,让我们可以持续为您推出更多精彩的原创编程教学^_^
手机用户打开支付宝钱包,扫描下方支付宝二维码即可:
电脑用户点击下方按钮即可跳转至支付宝转账页面:
感谢您对我们发展的支持和认可!
更多新鲜事儿
加载中……

我要回帖

 

随机推荐