`

乱稿:PNG的数据结构和传统的数据结构

阅读更多

随手涂鸦的:

 

// HellowTest2008.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "CLock.h"

	/*
		V1表示旧的数据,V2表示扩充的数据
		旧数据nVersion表示为0, 扩充数据nVersion表示为1
	*/
struct Role1
{
	int V1n1;
	int V2n1;
};

struct Role2
{
	int V2n1;
	int V1n1;
};

class CRole
{
public:

private:

public:
	int V1n1;
	Role1 V1Role1;
	Role2 V1Role2;

	int V2n1;
	int V2n2;
	int V2n3;

private:

};

struct ChunkHead
{
	int nLen;
};

struct Chunk
{
	int nLen;
	int ChunkType;
	char Buffer;
	int CRC;
};

/*
	CSave表示一个已经从介质里读取出来的数据
*/
class CSave
{
public:
	CSave();
	void V1Read(CRole *pRole);
	void V1Write(CRole *pRole);

	void V2Read(CRole *pRole);
	

private:

public:
	/*
		V1
	*/
	int nVersion;
	char Buffer[1024];

	/*
		V2
	*/
	char V2Buffer[1024];   //这段的组成规则是ChunkHead|Chunk|Chunk|Chunk


private:

};

CSave::CSave()
{
	nVersion = 0;
}

void CSave::V1Read(CRole *pRole)
{
	/*
		BufferXXX表示产出一个最终结果值,这里我们不关心
	*/
	if(0==nVersion)
	{
		pRole->V1n1 = BufferXXX;
		/*
			每个结构是否有自己的序列化函数,这都不重要.关心的是一个写值的动作
		*/
		pRole->V1Role1.V1n1 = BufferXXX;
		pRole->V1Role1.V1n1 = BufferXXX;
	}

	/*
		扩充后,根据版本号来读取。
		这里的扩充一般会有两种情况,
		1.先扩充存储介质(比如数据库)
		2.先扩充代码,根据写入时来自动扩充数据库
		3.两边一起扩充

		如果是第一种,或许不要版本号,只要代码扩充好,然后把介质中新加的字段一个初始值,
		最后再精心修改下0==nVersion中的代码,算好介质中各种新加入的偏移值。这明显是最差的,把同介质之间的接口作用放大。

		如果是第二种(大多数下是),首先在读的时候仍然按照旧版本读(这个时候介质还没扩充),写入时按照
		新版本的写,然后修改版本号。

		如果是第三种,其实跟第一种类似,把同介质之间的接口作用放大。还要需要修改数据库代码。而数据库,更倾向看成是一个
		read,write的东西。只要关心数据和长度这两个参数即可.如果你想要查看,我觉得单独做个读取工具更好。而且这段读取的
		代码和你真正工程里读取数据的代码区别不大。

		下面代码给出第二种方法
	*/
	if(1==nVersion)
	{
		//先调用0==nVersion的函数读一遍
		pRole->V1Role1.V2n1 = BufferXXX;
		pRole->V2n1 = BufferXXX;
		//......
	}
	if( 2==nVersion )
	{
		//掉调用1==nVersion的。。
		//......
	}

	/*
		    这种用版本号的方法可以解决兼容的问题。但是不好的地方是让第二个版本的数据知道了第一个版本的数据,在
		数据的意义上它们是等同的,但是处理方法却变成了一种兼容的方式。同时,BufferXXX获取的接口中,也要从一个
		大数据里面取出对应的第二个版本数据。这些都明显增加了二次开发和扩充的代价。我以前一次工作中,数据库的设计
		是针对每个角色都有特别大的空间,防止以后扩充不够。结果每次增加新东西时,总要奔赴在修改各种旧的代码之间,
		即使你不用动它,它们也总是在你调试的时候跳来跳去。更可恶的是数据库的字段名,一开始只是简单的叫d1,d2,d3...dn,
		在核对各个字段上又浪费了不少时间。结果在扩充一些大功能的时候,另外建立了单独的空间,终于让它们享受一样的
		待遇了。
		    于是就想,为什么不把扩充的数据也当成一个全新的数据,只是让他们最终流向的Role结构不一样而已。完全可以
		让它们在新旧版本上的数据流程都一样,就像新写了一遍。
	*/
}

void CSave::V2Read(CRole *pRole)
{
	/*
		每个新加的数据只要按Chunk块排好,读、写总的函数完全不用变,每个人关心自己的
		HandleChunkType()即可。
	*/
	int nHasLen = 0;
	while(ChunkHead.nLen>nHasLen)
	{
		switch(Chunk.ChunkType)
		{
			HandleChunkType();
		}

		nHasLen += Chunk.nLen;
	}
}

void CSave::V1Write(CRole *pRole)
{
	/*
		写这里相对简单, 因为得到的都是最后一组、最新的数据。不做更多的阐述
	*/
}

int _tmain(int argc, _TCHAR* argv[])
{


	return 0;
}
 

但是,结合PNG的这种格式,仍然可以在游戏中做点事情。比如可以在扩充字段时,旧的方案需要修改2-3个点,完全可以改为只要修改一个点就够了。

修改的2-3个点包括,对数据库字段,SQL语句,变量的读取。如果有一些中间件变化得可能更多。

用一些小技巧,可以把这些修改点都集中到一个函数上。所以PNG还是有很大启发的。

1
0
分享到:
评论
1 楼 lin_style 2010-09-07  
说明一下,游戏中的人物数据不太一样。因为他可以同时更新代码结构和数据库结构。而普通的版本文件,介质文件是在用户手上。

相关推荐

    PNG图像数据结构详细介绍

    PNG图像数据结构的设计旨在提供高质量的透明度支持、颜色深度选择以及反交错功能,同时保持文件大小合理。以下是对PNG图像数据结构的详细介绍: 1. **文件头信息**: PNG文件以一个8字节的PNG标识符(`137 80 78 ...

    数据结构C语言描述串.png

    小白学数据结构的笔记,之前看的没做笔记,今天看到第四章讲串,我做了一个笔记,发了一个博客,以后方便自己查阅,大家想看其他内容,我还会接着做好笔记,明天第5章数组和广义表

    PNG超级工具 好用

    7. **元数据管理**:工具允许用户查看和编辑PNG图片的元数据,如作者信息、版权声明、创建日期等,方便管理和追踪图片来源。 8. **导出与导入**:除了常见的PNG格式,PNG超级工具可能还支持导出为其他图像格式,如...

    PNG: The Definitive Guide

    《PNG:The Definitive Guide》这本书深入解析了PNG图像格式的各个方面,是理解、创建和优化PNG图像的重要资源。以下是关于PNG格式的一些关键知识点: 1. **PNG格式的起源**:PNG格式是在GIF图像格式受到专利限制后...

    网页按钮小图标 素材类型:PNG格式

    PNG格式的图标因其透明背景和高质量的图像表现力,在网页设计中被广泛采用。以下是关于网页按钮小图标以及PNG格式的详细知识: 1. **网页按钮小图标的作用**: - **导航**:通过清晰的图标,用户可以快速识别功能...

    数据结构和算法 java

    数据结构和算法是计算机..."LinuxIDC.com.png"可能是某个网站的logo,而"Linux公社www.linuxidc.com.url"则指向了一个可能提供相关技术文章和讨论的平台,你可以在这里找到更多关于Java编程和数据结构与算法的信息。

    数据结构.zip png格式

    数据结构是计算机科学中的核心概念,它涉及到如何在内存中有效地组织和管理数据,以便进行高效的操作。在C++编程语言中,理解并熟练运用数据结构对于开发高效算法至关重要。本资料包“数据结构.zip”包含了以png格式...

    16种文件的数据结构

    0011 png文件数据结构.txt 0012 swf文件数据结构以及转为exe或从exe中剥离出swf的代码.txt 0013 TIF文件数据结构.txt 0014 wav文件数据结构以及绘制静态波形图的代码.txt 0015 wma文件数据结构以及读取附加信息...

    PNG图像读写及显示

    PNG 图像读写及显示 本文主要介绍了使用 libpng 库函数设计了一个...本文介绍了 PNG 图像格式、PNG 文件结构、PNG 数据块、libpng 库函数和图像浏览器设计等知识点,旨在帮助读者更好地理解和应用 PNG 图像处理技术。

    数据结构第一章 绪论 思维导图.png

    数据结构第一章 绪论 思维导图

    PNG--The Definitive Guide

    - **数据块**:PNG 文件由多个数据块组成,每个数据块包含类型、长度、数据和校验码四部分。 - 类型:表示数据块的功能或含义。 - 长度:表示数据字段的字节数。 - 数据:实际的数据内容。 - 校验码:用于确保...

    数据结构与算法分析:C语言描述(原书第2版)

    这本书深入浅出地介绍了数据结构和算法分析的关键概念,对于学习和理解这些核心知识至关重要。数据结构是编程的基础,它涉及如何在计算机中组织和存储数据,以便高效地进行访问和操作。算法则是解决问题的步骤或程序...

    数据结构,停车场管理系统_数据结构_停车场管理系统_

    `图.png`可能是一些辅助理解的数据结构或算法的示意图,例如二叉搜索树、堆或者图的表示,用于帮助设计和优化系统。 `停车场数据.txt`可能存储了模拟的停车场数据,包括车位状态、车辆信息等,用于测试系统功能。 ...

    1数据结构.png

    1数据结构.png

    懵逼数据结构.zip

    “树状数组.png”可能是在讲述树状数组(也称为线性恒定时间查找树),这是一种高效的数据结构,用于维护一个数组上的区间更新和查询操作,其查询和更新的时间复杂度为O(log n)。 “二叉排序树.png”是指二叉搜索树...

    数据结构思维导图.zip

    数据结构是计算机科学中的核心概念,它涉及到如何在内存中有效地组织和管理数据,以便进行高效的操作。在编程和算法设计中,理解并熟练运用数据结构至关重要,因为它们直接影响到程序的性能和复杂性。本资源是个人...

    数据结构课程设计-大奖赛评分系统设计.7z

    在这个系统中,C语言被用来编写核心算法和数据结构,确保了程序的效率和可读性。 数据结构是存储和组织数据的方式,它们直接影响到算法的效率。在这个项目中,两个主要的数据结构——链表和数组,都扮演了重要角色...

    任意图片转换成任意大小的图标:png→ico

    1.把需要转化的.PNG文件拷贝到PNG文件夹内 2.运行“单张转换.exe”或“批量转换.exe”。 单张转换:将一张png图片转换成多种大小的ico图标 放在程序目录下; 批量转换:将多张png图片转换成同种大小的ico图标 放在...

    PNG图标包2100个

    6. **元数据**:PNG文件可以包含元数据,如作者信息、版权、描述等。 在软件开发中,PNG图标的作用: 1. **用户界面设计**:PNG图标可以清晰地表示功能按钮、菜单项,使用户界面更直观易懂。 2. **移动应用**:移动...

    pngimage

    4. **交错和快速预览**:PNG图像可以采用交错方式存储,允许在图像数据未完全加载时显示低分辨率的预览。PNGImage控件可以利用这一特性提供即时反馈。 5. **伽玛校正**:PNG图像允许包含伽玛信息,用于校正显示设备...

Global site tag (gtag.js) - Google Analytics