摘要: 这段时间做了一个游戏资源文件管理器。发现了一些值得留意的地方。 一般我们在使用FOR循环的时候比较随意,在知道数据的多少的前提下,我们习惯使用FOR循环进行数据的操作。但是如果操作数据量大的情况下就出现问题了。 如果对超过千张或者几百张MB级的大图片进行实时生成缩略图并且复制入流文件里面,那么就会出现索引越界的报错提示。 后来采用了递归调用,程序正确生成。显然在处理大数据和复杂数据的时候,最好采用函数的递归进行操作。 阅读全文
posted @ 2012-04-26 17:14 一笑如风 阅读(5509) 评论(2) 推荐(0) 编辑
摘要: 在【【HGE】绘图底层】这个帖子里面有些地方需要更正。 为了不误导别人,这里有必要补充一下: HGE每次绘图都需要锁定一次缓冲区,只适合绘制大量相同的图片,如果是各种不同的图片,问题就出来了。如果绘制一百张图片就需要锁定和解锁各一百次。了解D3DAPI编程的人明白这是个什么问题。所以现有的HGE绘图算法是完全不适合大型游戏的。 有些人看到HGE自带例子中绘制2000个sprite FPS达200-300以上就以为是正确的,不要忘记绘制的图片都是同一张图片。这个问题是网上一位朋友首先发现的。 这里给出解决方案: 首先删除HGE原有的渲染函数,一个都不要留。 然后制作出一个添加数据... 阅读全文
posted @ 2012-03-19 21:07 一笑如风 阅读(3879) 评论(14) 推荐(0) 编辑
摘要: HGE的核心绘图算法真是问题多多 大家有没有发现HGE绘图的时候是很有问题的。 每画一张图片,就需要从系统内存复制一次数据,最关键的不是数据复制的问题,而是每一次都需要LOCK锁定一次顶点缓冲区进行数据更新。锁定的时候不使用任何标记,那么就强制GPU和CPU同步,带来的是渲染延迟问题。 最要命的是每一帧都进行从系统内存——显卡内存的操作,如果是网络游戏,每一帧都画上千张以上的图片和阿尔法混合,结果会出现什么??本来顶点缓冲区里面既然已经存在数据,那么在几帧之内,如果数据是不需要更新,就完全可以直接从顶点缓冲区里面读取数据进行绘图。那么这些是GPU的事情,而CPU只是做了很短时间的操作... 阅读全文
posted @ 2012-03-13 22:02 一笑如风 阅读(3424) 评论(1) 推荐(0) 编辑
摘要: 重新编写了HGESprite部分,不再使用HGESprite单元。 另外编写了一个HGECanvas单元,当然不是那个火人论坛上面的那个HGE加强版的那个。 参考ID3DSprite接口的做法,使用一个接口对象,就可以批量绘制所有的图元。 不需要创建多个接口对象。同时添加了纹理列表来管理显卡内存里面的纹理指针。 完全按照网络游戏的做法,加载完成硬盘自定义格式资源文件包后,产生所需要的显卡内存纹理对象,就可以释放系统内存,使系统内存占用相当低。 开始绘图的时候就由显卡内存读取,由GPU来进行绘制。这样使CPU和系统内存资源极大地解放了。 D3D编程最爽的地方是不需要经常从系统硬盘... 阅读全文
posted @ 2012-03-07 00:01 一笑如风 阅读(3096) 评论(0) 推荐(0) 编辑
摘要: HGE的基于帧回调的机制,而且还是基于Windows消息的回调机制,了解Windows消息的人应该明白,这样肯定不行。因为Windows消息有阻塞的情况存在等等问题。 测试了一下,当HGE窗口显示的时候,图片绘制还是很明显看出来绘制的过程,闪了一下才绘制上去。当拖动窗口的时候,痕迹的清除也很缓慢。 简简单单绘制一张图片,CPU占用达45%以上,跟我采用基于Main入口函数直接绘制完全不是一回事。看来还得继续改造这部分结构。 另外当时改造HGE的时候,发生了窗口无法注册的问题,这个时候才明白delphi的uses部分的单元文件是从左到右检测编译的,因为当时的情况是这样的:uses ... 阅读全文
posted @ 2012-03-02 13:57 一笑如风 阅读(1354) 评论(0) 推荐(0) 编辑
摘要: 完全DirectX9.0C改造,并且修改了资源载入部分。完成的效果如下图: 图片格式是:png,当然完全可以加载任何DirectX9支持的图片格式。而且资源文件也不需要特地指定封包为那种格式的图片文件。 网上也有HGEDx9的单元文件,这个文件挺搞笑的。RHW常量格式和灵活的顶点格式是不能够共存的,而且HGE在初始化设备的时候就已经设置了投影矩阵,这个时候绘制的顶点数据投影在屏幕的时候就已经是二维的。DX8和DX9还是有很多不一致的地方。两种版本混用是非常非常容易出问题的。 当然距离达到:网络游戏——降龙之剑的效果还是有一段路要走的。我指的是他的基本画面效果,其实它的色彩方面还是有问题的... 阅读全文
posted @ 2012-03-01 19:44 一笑如风 阅读(3034) 评论(1) 推荐(0) 编辑
摘要: 在HGE1.81版本开始修改结构。为什么不在HGE加强版本上面修复,原因很简单,这个版本的作者D3D功底一般,封装方面的技术一般。不但没有使引擎更符合大型游戏的开发,而且使很多方面搞得相当复杂。不利于引擎的以后强化。所以最理想的还是从官方的原版开始修改引擎基础部分。使之更符合大型游戏的开发。资源管理方面,HGE提供了一个从Zip压缩文件加载的接口类。其实任何一个商业游戏都是不可能使用Zip压缩文件作为客户端图片资源文件的。因为大家都是使用了各自的自定义文件格式资源文件。Zip压缩文件适用于补丁的更新。但是目前主流的做法好像已经改变。使用了微端技术。其实说白了,就是玩家一边玩游戏一边下载客户端资 阅读全文
posted @ 2012-03-01 02:21 一笑如风 阅读(2266) 评论(0) 推荐(0) 编辑
摘要: 转自http://www.cnblogs.com/lancidie/archive/2011/05/20/2052094.html学习D3D,应该对这三个内存理解,网上收集了一下相关资料,收藏下来。三种内存AGP内存(非本地显存),显存(本地内存),系统内存,其中我们都知道系统内存就是咱那内存条,那这AGP内存是个啥玩意啊?其实是因为在以前显卡内存都很小,那时还是在显存是16M,32M为主流的时候,如果你运行一个需要很多纹理的3D程序,那么显存一会就不够用了,那该咋办呢?只好问系统内存借点用用了!这就是AGP内存的由来,在我们电脑BIOS中有个设置AGP Aperture的选项,这里就是设置显 阅读全文
posted @ 2012-02-26 17:45 一笑如风 阅读(542) 评论(0) 推荐(0) 编辑
摘要: 网上关于Generics.Collections单元的TList<T>没有说清楚。不理解的话,在这里看吧。T ——泛指各种类型。那么是不是可以在这里声明为——支持的各种类型?答案:是!TList<String> {字符串}TList<Integer> {带符号数整型}或者其它。字符类型可以到万一博客【2009-2010 新功能http://www.cnblogs.com/del/category/148952.html】去看,在【Delphi 2009 泛型容器单元(Generics.Collections)】部分。var List :TList<in 阅读全文
posted @ 2012-02-22 21:31 一笑如风 阅读(1489) 评论(0) 推荐(0) 编辑
摘要: 这个TList类型在编程里面经常使用到。先看万一的测试:http://www.cnblogs.com/del/archive/2007/12/29/1019566.html// Add、Count、Items[n]var List: TList; {声明 List} frmRed: TForm; {用于测试的对象, 这里选择了窗体}begin List := TList.Create; {建立列表} frmRed := TForm.Create(nil); {建立 ... 阅读全文
posted @ 2012-02-22 17:23 一笑如风 阅读(1130) 评论(0) 推荐(0) 编辑