关于cocos2dx程序的BUG调试解决方案

      今天说一下手机游戏开发的调试问题吧。不得不说的是和PC平台游戏、软件开发相比,手机上开发游戏和软件要困难的多。原因是多方面的,比如说开发环境比较复杂,工具软件不够人性化等等。

      cocos2dx的出现解决了一个很大的问题,因为他是跨平台的,相对来说windows的软件开发环境比较友好,对中国程序员来说更熟悉。这样可以在windows进行日常开发和调试,然后在发布到其它平台的时候进行少量的处理就好了。

      cocos2dx程序的调试,在windows下和端游类似,可以在后台窗口进行打印,也可以直接在vs中挂断点进行跟踪。相对还是比较容易。唯一需要优化的是把后台打印日志导出,以方便根据日志进行分析。

      但是在windows环境OK之后,需要发布到Android平台的时候,就有些麻烦了,顺利运行还好,一旦在运行的过程中出现问题,那再来调试就相当的麻烦了,模拟器满如蜗牛,Esclipe本身支持也不够强大。有时候可能只是一句脚本报错,但是要发现问题缺要费九牛二虎之力。要是在真机上运行出错,那就更加不好跟踪问题了,还需要用到USB调试功能。今天的主要话题就是针对这种情况,提供几个好的方法来方便我们进行游戏开发。

      1、后台打印日志的优化。

      windows下已经有后台日志查看功能,但是大家可能会发现一个问题,后台显示有行数的限制,超过多少行之后就看不到了,但是cocos2dx的输出是相当多的。怎么办?解决方案就是输出log文件。把后台显示的内容输出后,我们可以直接分析log文件。下面提供lua的解决代码,用C++的同学可以自己改造。

      首先,封装一下lua的文件处理功能,比较简单,而且后面的方法可能也需要使用。

--file.lua
--定义lua文件操作的方法
--打开文件:参数(文件名,打开模式),返回文件句柄或nil
function openFile(filename, mode)
	local f = io.open(filename,mode)
	if f then
		return f
	else
		return nil
	end
end
--读取文件全部内容:参数(文件句柄),返回一个string
function readAllFile(f)
	return f:read("*all")
end

--读取文件一行内容:参数(文件句柄),返回一个string
function readLineFile(f)
	return f:read("*line")
end
--写文件内容:参数(文件句柄,字符串)
function writeFile(f, ...)
	local arg = {...}
	f:write(unpack(arg))
end
--关闭文件,参数(文件句柄()
function closeFile(f)
	f:close()
end

然后,我们要改写print函数和cclog函数,将这些内容输出到文件。

local print_raw = print
-- print
print = function(...)
    require "base.file"
    print_raw(string.format(...))
    local file = openFile("client.log", "a")
    if file then
	writeFile(file, string.format(...).."\n")
	closeFile(file)
    end
end
-- cclog
cclog = function(...)
    print(string.format(...))
end
-- for CCLuaEngine traceback
function __G__TRACKBACK__(msg)
    print("----------------------------------------")
    print("LUA ERROR: " .. tostring(msg) .. "\n")
    print(debug.traceback())
    print("----------------------------------------")
end

这样,所有在lua里面的打印信息都会输出到日志文件方便我们分析了。

      2、上面这个方法已经能够让我们分享日志,那还有没有更好的方法呢?如果我是在安卓手机上运行,我要查看日志是不是很不方便呢?

       那我们就更进一步,我们不是把日志输出到文件了吗?那我们直接在游戏里面查看日志不是更方便?所以我们的思路是,在游戏中写一个日志显示界面,然后把日志文件内容一行一行读出来,让他显示在一个RichText控件里面。这样是不是更方便呢?这个方法我暂时没时间写,不过肯定没问题的,有时间写好后补上代码。

      3、方法2已经能够及时的看到日志了,我们还可以使用更强大一点的方法,我们可以建一个日志服务器,客户端在输出日志的时候就发送到日志服务器,这样真机测试就很方便了,和在windows开发很相似了,不过这个方案有点重了,大家使用第二点应该就可以了。       好了,上面推荐的这三种方案应该能够解决大部分的调试问题了,再也不用为了看日志去启动麻烦的模拟器了。

      一直没时间,今天才抽出时间来完善这个功能并将之加入到开发过程中。实现核心代码如下:

    --日志控件
    self._richText = ui.RichTextUI:create()
    self._richText:setSize(cc.size(winSize.width - 60, winSize.height - 110))
    self._richText:setAnchorPoint(cc.p(0, 0))
    self._richText:setPosition(cc.p(30, 30))
    self._widget:addChild(self._richText)
    local fHandle = openFile("client.log", "rb")
    if fHandle then
        local idx = 0
        local lineStr = readLineFile(fHandle)
        while lineStr do
            if idx >= self._index then
                local elem = ui.RichItemText:create(0, Color3B.WHITE, 255, strg2u(lineStr), DEFAULT_FONT_TTF, 20) 
                self._richText:insertElement(elem)
                self._richText:insertNewLine()
            end
            idx = idx + 1
            lineStr = readLineFile(fHandle)
        end
        self._index = idx
    end

      下面看看实际的效果吧,对于真机测试来说,这个效果是不是已经很好了呢?

转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏武军超python专栏

2018年8月9号飞机大战项目答辩得到的经验和基本的win终端命令

今天遇到的新单词: adapter n适配器 virtual adj 虚拟的 interface n接口 corporation n公司,法人

12730
来自专栏非著名程序员

【小技巧】AS 手动实现无线真机调试

其实无线真机调试很简单,走一遍流程就能学会并且记住,无需插件,无需 Root,使用插件反而会将这个流程复杂化。先放上纯流程版,方便通篇阅读之后的快速查阅,接下来...

25370
来自专栏云计算教程系列

CentOS 如何配置NTP加入NTP池项目

准确的计时对于几乎所有服务或软件都至关重要。在分布式平台上运行的电子邮件,记录器,事件系统和调度程序,用户身份验证机制和服务都需要准确的时间戳来按时间顺序记录事...

18700
来自专栏pangguoming

(十一) 整合spring cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)

上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图...

18620
来自专栏杨建荣的学习笔记

MySQL审计插件使用和对比

数据库审计是数据库安全中很重要的一个环节,说到审计,有些上市公司内部还会根据塞班斯法案,进行404审计等等。 而最基本的审计还是需要的,有些同学可能...

86590
来自专栏CSDN技术头条

Kubernetes推1.2版本,可管理1000节点,运行3万Pods

赶在Google云端产品用户大会之前,Kubernetes也释出了1.2新版。超过680位开源开发者参与。新版最大特色是扩充能力大幅提高了400%,单个集群可管...

22080
来自专栏前端大白专栏

React Native: Possible unhandled promise rejection request fail

65360
来自专栏Albert陈凯

2018-10-09 lombok 生产环境报错SEVERE: Unable to process Jar entry [module-info.class] from Jar [jar:fil...

老师您好,课程里面用的lombok,感觉很方便,我就在我写的一个测试项目里面也用的这个。在idea里面用tomcat是可以正常运行的。但是打好包以后,放到服务器...

5.7K20
来自专栏linux驱动个人学习

Android分区

实现手机必需的通信功能,大家通常所的刷RADIO就是刷写modem分区,在所有适配的ROM中这部分是不动,否则会造成通话不稳定

17020
来自专栏北京马哥教育

高流量站点NGINX与PHP-fpm配置优化

使用Nginx搭配PHP已有7年的这份经历让我们学会如何为高流量站点优化NGINX和PHP-fpm配置。 以下正是这方面的一些提示和建议: 1. 将TCP切换为...

57250

扫码关注云+社区

领取腾讯云代金券