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 语言游戏编程开发!果然最担心的事又发生了!的更多相关文章

  1. Mac iOS Mac Watch 应用和游戏编程开发工具推荐

    今日分享「iOS / Mac / Watch 应用和游戏开发工具」推荐,这期专题主要为iOS开发者推荐一些优秀的设计和开发工具,这些工具包含移动原型的设计.程序的开发等,可以大大提高开发的效率!专题会 ...

  2. 【Visual C++】游戏编程学习笔记之三:游戏循环的使用

     本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44208419 作者:Zee ...

  3. Android程序中,内嵌ELF可执行文件-- Android开发C语言混合编程总结

    前言 都知道的,Android基于Linux系统,然后覆盖了一层由Java虚拟机为核心的壳系统.跟一般常见的Linux+Java系统不同的,是其中有对硬件驱动进行支持,以避开GPL开源协议限制的HAL ...

  4. java游戏开发杂谈 - 游戏编程浅析

    每个游戏,你所看到的它的一切,都是计算机画出来的! 地图是画出来,人物是画出来的,树木建筑是画出来的,菜单按钮是画出来的,滚动的文字.闪烁的图标.云雾烟火,都是画出来的. 游戏编程,所要做的,就是控制 ...

  5. 融云开发漫谈:你是否了解Go语言并发编程的第一要义?

    2007年诞生的Go语言,凭借其近C的执行性能和近解析型语言的开发效率,以及近乎完美的编译速度,席卷全球.Go语言相关书籍也如雨后春笋般涌现,前不久,一本名为<Go语言并发之道>的书籍被翻 ...

  6. 【编程开发】C语言中随机数rand使用注意事项

    [编程开发]C语言中随机数rand使用注意事项 标签: [编程开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:随机数在编程开发中非常重要,以C语 ...

  7. go语言游戏服务端开发(一)——架构

    五邑隐侠,本名关健昌,12年游戏生涯. 本教程以Go语言为例.   网络游戏程序分为客户端和服务端.客户端负责图形渲染.交互和一些简单校验处理,服务端负责业务逻辑处理.数据存储. 我们开发一个游戏de ...

  8. 【python游戏编程之旅】第九篇---嗷大喵快跑小游戏开发实例

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 前几期博客我们一起学习了,pygame中的冲突检测技术以及一些常用的数据结构. 这次我们来一起做一个简单的酷 ...

  9. 【python游戏编程之旅】第八篇---pygame游戏开发常用数据结构

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中冲突检测技术:http://www.cnblogs.com/msxh/ ...

随机推荐

  1. [翻译] 发布双屏预览SKD,公布MICROSOFT 365开发者日日期

    [前置提示]:本文翻译工作尚未完工,您可以先看原文QUQ 原文标题:Announcing dual-screen preview SDKs and Microsoft 365 Developer Da ...

  2. 内存管理初始化源码4:add_active_range

    我们在阅读源码时,函数功能可以分为两类:1. bootmem.c 2. page_alloc.c. 1. bootmem.c是关于bootmem allocator的,上篇文章已经简述过. 2. pa ...

  3. react项目结合echarts,百度地图实现热力图

    一.最近在一个react项目(antd pro)中需要展示一个热力地图.需求是: 1.热力地图可缩放: 2.鼠标点击可以展示该点地理坐标,及热力值. 3.初始化时候自适应展示所有的热力点. 4.展示热 ...

  4. spring boot 源码之SpringApplicationRunListeners

    SpringApplicationRunListeners SpringApplicationRunListener的集合,内部存储了SpringApplicationRunListener的集合,提 ...

  5. odoo13之在odoo中添加自定义页面

    注: 本博文是阅读Ruter博客 在odoo中添加自定义页面 后所做的个人总结,以及博文搬迁,主要是便于自己的后期理解:大部分内容为搬运,当然也包括自己的一些总结和流程优化. 前言 首先展示效果:进入 ...

  6. 记一次"截图"功能的项目调研过程!

    目录 项目需求 功能调研 AWT Swing Html2Image PhantomJS Headless Chrome 实现方案 结论 项目需求 最近,项目接到了一个新需求,要求对指定URL进行后端模 ...

  7. 关于Apache报错 couldn't perform authentication. AuthType not set!

    今天在使用apache搭建yum的web服务时,配置完成后.访问http://ip 时,浏览器报错:500 Internal Server Error 然后查询error.log发现,有如下错误提示: ...

  8. gcc g++ 安装与配置 入门详解 - 精简归纳

    gcc g++ 安装与配置 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 24 转载请注明出处!️ 目录 gcc g++ 安装与配置 入门详解 - 精简归纳 一.下载MinGW ...

  9. 种子爆破&[GWCTF 2019]枯燥的抽奖

    伪随机数的爆破,种子爆破 做到了一道题,就是有个伪随机数爆破的漏洞,当时尽管是看到了这两个敏感的函数,但是先去看其他的了,没有看到什么漏洞,所以我当时是准备直接强行爆破,之后看到使用伪随机数爆破的方式 ...

  10. E-Form++ for Windows CE源码库2020,嵌入式开放源码!

    E-Form++ for Windows CE源码库2020! 现在就把这个下载到您的Windows CE中,体验极致HMI触摸.  Windows CE评估版下载! 1. E-Form++ for ...