用 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/ ...
随机推荐
- java中数据类型占多少字节
基本类型(primitive type) 数值类型:byte占1个字节:short占2个字节:int占4个字节:long占8个字节:float占4个字节:double占8个字节.char占2个字节. ...
- python中gui编程的模块之一:tkinter(python3.x中是tkinter,小写的t)
一.tkinter是python的标准gui库,tkinter是内置在python的安装包之中的,所以安装好python之后就可以import导入tkinter模块了 二.创建一个GUI程序 1.导入 ...
- IDEA使用 live template添加groovy脚本给方法,类,js方法添加注释(转载)
IDEA添加Live Template: File->Setting->Editor->Live Templates Abbreviation: * Template text: * ...
- C++万能头文件的秘密
#include<bits/stdc++.h> 万能头文件,拼写怎么这么奇怪? 其实,bits表示一个文件夹,stdc++.h是里面的头文件,这表示路径. 搜索这个文件夹,找到后打开. 打 ...
- 查看 JVM 参数的默认值
查看初始默认值:-XX:+PrintFlagsInitial HuandeMacBook-Air:~ huanliu$ java -XX:+PrintFlagsInitial [Global flag ...
- linux学习(十)linux安装MySQL
一.前言 由于我使用的是阿里云的服务器,后面会加入配置阿里云的部分,非阿里云的linux系统可以省略后面的步骤,根据自己系统的情况进行配置~ PS:我安装的是mysql5.7.24的版本,其他版本的M ...
- Typora操作总结
Typora 1. Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档 1.1 目录 [toc] 2. 结构类操作 2.1 多级标题 # 一级标题 ...
- PJzhang:CVE-2020-1472微软NetLogon权限提升漏洞~复现
猫宁~~~ 虚拟机上进行 安装windows 2008 R2 查看服务器ip 本地连接属性,取消ipv6,ip设置为192.168.43.158,子网掩码255.255.255.0,网关192.168 ...
- RocketMQ 笔记
Queue Topic和Queue是1对多的关系,一个Topic下可以包含多个Queue,主要用于负载均衡.发送消息时,用户只指定Topic,Producer会根据Topic的路由信息选择具体发到哪个 ...
- JMETER并发压测-自定义不同请求参数
背景 虽然可以请求相同的接口做测试,但是请求参数每次都是相同的.为了模拟不同的用户,请求不同的参数,所以要自定义参数来做多线程并发压力测试. 点赞再看,关注公众号:[地藏思维]给大家分享互联网场景设计 ...