用 C 语言游戏编程开发!果然最担心的事又发生了!
30了。我要怎么办,老了。人就像一头小毛驴,方向都是牵着的人定的。
这个项目从去年开始的,一个手机游戏,当时接这个项目的时候其实没有太多考虑,我一向都喜欢打肿脸充胖子的,好面子,人家找上门来,不能不给面子。
如果是我自己想的一个创意,估计做不下去的时候随手就放弃了,一点都不伤心,最多过几年后同样一个创意出现之后,懊悔曾经没有坚持到底过。或者最后成为一个面目全非的四不像。历史上的那些想法无出这些框架。但是这是答应别人的事情,没奈何开始了这段痛苦的过程。
这几年其实游戏玩的多,实际上就没有开发过几个,这些技术早就放下很早了。而且没在企业里呆过太长的时间,编码很不规范,这些恶果很快就显现了出来。刚开始的几个月写啊写啊,然后几万行代码出来了。等到过几天修改错误,编译成功了。还没开心的出来,痛苦的事情到了。
首先进去就是个死循环。一点反应没有。这是什么原因呢,时间长了,我也忘了。反正很快解决了。
接着刷的一下,程序崩溃了。这是毛原因呢。挂上ollydbg,我跟我跟,原来,参数传递不正确,本来三个参数,结果仅传过去两个。然后怅然若失,重新修订代码,对所有外部函数做声明。
麻烦事还没完。人家明明是初到江湖,没有菜刀的,为什么我这里扛着一把刀呢。我再跟,原来那里定义的是byte,我这个文件extern的时候没加,直接一个extern 变量,默认是int罢,本来读一个字节肯定是0,这里读4个字节,很难是0了。
然后再次修订源代码,确保extern后面都有定义。
然后提示变量为null,跟了一下啊,明明是正常有值的,咋么就忽然消失了呢,痛苦啊痛苦啊,一怒之下推开,过几天还要乖乖坐下来工作。跟了几下发现还是声明不对。定义的时候是数组的形式,我extern的是指针,谁告诉我数组和定义差不多了呢。这差的远了三百里了。
另外数值符号,一个正byte乘上一个正byte,变成了负数。然后再去读数组,不知道读哪里去了。
前面定义了一个一维数组,后来用了一个二维数组指针赋值,内存跑远了。然后检查所有数组。
再次修订源代码,这可是10万行的大项目啊,我就这么一个人,修啊补啊,痛苦不愿回首。
我终于下狠心要规范代码写作,因为这带来的后果的修订远长于开发时节约的时间了。
还有一个地方,就是编码,现在的开发一定要坚持使用unicode编码。我用vc6.0,使用unicode定义变量怕麻烦,所以使用了gb2312。然而资源采用了UTF8格式。本来是utf8-unicode就可以完成所有工作。而我变成这样子utf8-unicode-gb2312-unicode-gb2312-unicode,多出了许多转化过程不说,也是造成许多错误根源。
我本以为这些已经够了,然而以后多次围绕我的梦魇来了。
内存问题,一个挥之不去的恶梦。我终于知道为什么要开发托管代码了。怀念java和.net。没有亲身体验过,真是很难想象这些理由。所以一些让人崇拜的大牛其经历也想必是非一般的坎坷。
内存上的错误主要有三种。尽管都是老生常谈的东西了。不过痛苦之后再来看感觉又是另外一番滋味。
1)多次释放和不正确释放
以前释放完之后,不把指针设为null,变成了野指针。然后又用啊,又释放啊。错误发生了。
因为内存的随处分配,所有最后专门有个步骤释放内存,释放完了发现运行不正确,一个结构中的数据面目全非。又是痛苦的跟踪检查,发现有处指针指向栈区,这个指针又被七指八指,最后看不出来指向堆栈,然后这个指针释放,栈上的数据被破坏。
2)内存泄漏
一般来说谁分配谁释放的准则。但是写代码的时候没有注意,随处分配,最后挨个跟踪指针,经常跟错。增加了许多时间。
3)内存越界
内存越界是痛苦中的痛苦。表现在错误的出现随机,某处越界可能很久之后才表现出来,找都找不到错误从哪里出来的,别的跟踪一下子代码大致能看出端倪,一般错误的出现就在错误附近。
一直看黑客教程栈溢出和堆溢出这么重视,等到自己编程的时候才发现原来是普遍性错误。
内存越界其内存的分配并不按照先后顺序分配,后分配的有可能在前面。内存越界造成的错误也是多种多样。简单的把另外一块内存冲了,有一次字符串连接空间分配小了,淹没了另外一个字符串,结果本来主角说的话从NPC口中说出来。
更复杂的错误也有。
一般用malloc分配的内存前面有4个字节的内存信息,越界淹没了这个信息,好一点的出现内存分配错误,运气差一点淹没的部分被重新利用,来分配其他东西了。
痛苦中一次次懊悔,如果当时充分考虑就好了。如果上天有重来一次的机会,我一定会认真写代码,整整洁洁标标准准,像印度人写的一样。
如今这个过程告一段落。终于能正常运行了。看到自己苦心栽培的东西茁壮成长,心里格外的高兴,看着鲜艳的五星红旗,小朋友的脸蛋像红彤彤的苹果。越是付出的多也有价值。所以恋爱的时候一定要让对方多付出,付出的越多越不会放弃。许多放不下的人都是这样想的。不甘心。
写这篇文字前,我又运行了一下程序,在vc环境下模拟器中运行,欣喜的发现程序完全没有问题,忽然跳出个对话框,vc崩溃了。
如果你想快速掌握编程,小编推荐我的C语言/C++编程学习基地【点击进入】!
都是学编程小伙伴们,带你入个门还是简简单单啦,一起学习,一起加油~
还有许多学习资料和视频,相信你会喜欢的!
涉及:编程入门、游戏编程、课程设计、黑客等等......
用 C 语言游戏编程开发!果然最担心的事又发生了!的更多相关文章
- Mac iOS Mac Watch 应用和游戏编程开发工具推荐
今日分享「iOS / Mac / Watch 应用和游戏开发工具」推荐,这期专题主要为iOS开发者推荐一些优秀的设计和开发工具,这些工具包含移动原型的设计.程序的开发等,可以大大提高开发的效率!专题会 ...
- 【Visual C++】游戏编程学习笔记之三:游戏循环的使用
本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44208419 作者:Zee ...
- Android程序中,内嵌ELF可执行文件-- Android开发C语言混合编程总结
前言 都知道的,Android基于Linux系统,然后覆盖了一层由Java虚拟机为核心的壳系统.跟一般常见的Linux+Java系统不同的,是其中有对硬件驱动进行支持,以避开GPL开源协议限制的HAL ...
- java游戏开发杂谈 - 游戏编程浅析
每个游戏,你所看到的它的一切,都是计算机画出来的! 地图是画出来,人物是画出来的,树木建筑是画出来的,菜单按钮是画出来的,滚动的文字.闪烁的图标.云雾烟火,都是画出来的. 游戏编程,所要做的,就是控制 ...
- 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
2007年诞生的Go语言,凭借其近C的执行性能和近解析型语言的开发效率,以及近乎完美的编译速度,席卷全球.Go语言相关书籍也如雨后春笋般涌现,前不久,一本名为<Go语言并发之道>的书籍被翻 ...
- 【编程开发】C语言中随机数rand使用注意事项
[编程开发]C语言中随机数rand使用注意事项 标签: [编程开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:随机数在编程开发中非常重要,以C语 ...
- go语言游戏服务端开发(一)——架构
五邑隐侠,本名关健昌,12年游戏生涯. 本教程以Go语言为例. 网络游戏程序分为客户端和服务端.客户端负责图形渲染.交互和一些简单校验处理,服务端负责业务逻辑处理.数据存储. 我们开发一个游戏de ...
- 【python游戏编程之旅】第九篇---嗷大喵快跑小游戏开发实例
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 前几期博客我们一起学习了,pygame中的冲突检测技术以及一些常用的数据结构. 这次我们来一起做一个简单的酷 ...
- 【python游戏编程之旅】第八篇---pygame游戏开发常用数据结构
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中冲突检测技术:http://www.cnblogs.com/msxh/ ...
随机推荐
- IDEA里如何引入JQuery
HTML页面的JavaScript里一般可以直接使用类似:<script src="js/jquery.js"></script>语句可以直接引入,但是会遇 ...
- shell字体颜色应用
输出特效格式控制: \033[0m 关闭所有属性 \033[1m 设置高亮度 \03[4m 下划线 \033[5m 闪烁 \033[7m 反显 \033[8m ...
- css常用属性:居中展示、内边距、外边距
1.横向居中.纵向居中 2.纵向展示3个块级(div标签即可纵向展示) 3.横向展示3个块级 4.在横向块级上加上边框的两种方法 法一:在父级div上加上和样式一样高的height 法二:在父级div ...
- QEMU 虚拟机网卡探究
前述 我们知道无论是VMware,Virtual Box还是HyperV 都支持 NAT/Bridge/Host-Only 三种上网方式.其中 NAT 是我最常用,最熟悉的. 需要说明的是,无论是NA ...
- JavaScript中常用的数据输出方式解析
在js中,一般使用如下几种方式进行数据的输出: 1. 在浏览器的控制台输出 浏览器F12打开浏览器控制台(一般前端开发人员必备浏览器为谷歌浏览器,下面就以谷歌浏览器为例对控制台尽心解析): 1.1 E ...
- 【大数据】MapReduce开发小实战
Before:前提:hadoop集群应部署完毕. 一.实战科目:做一个Map Reduce分布式开发,开发内容为统计文件中的单词出现次数. 二.战前准备 1.本人在本地创建了一个用于执行MR的的文件, ...
- JVM学习(六)JVM常见知识问答
文章更新时间:2020/04/21 1.什么是Java虚拟机?为什么Java被称作是"平台无关的编程语言"? Java虚拟机是一个可以执行Java字节码的虚拟机进程. Java源文 ...
- Docker 容器化部署 Python 应用
Docker 是一个开源项目,为开发人员和系统管理员提供了一个开放平台,可以将应用程序构建.打包为一个轻量级容器,并在任何地方运行.Docker 会在软件容器中自动部署应用程序. 在本篇中,我将介绍如 ...
- 【Processing-日常3】等待动画1
之前在CSDN上发表过: https://blog.csdn.net/fddxsyf123/article/details/79755976
- mysql及联合查询
SQL语句分类 DDL 数据库定义语言 定义数据库对象 create alter truncate drop TPL 事务处理语言 rollback commit DCL 数据控制语言 由 GRANT ...