Cocos2d-x-Lua出乎意料的性能短板——那个getPosition的binding

LAMMPS ReaxFF模拟后处理:如何用Python精准追踪C-N键的断裂与形成? 本文详细介绍了如何利用Python对LAMMPS ReaxFF模拟结果进行后处理,精准追踪C-N键的断裂与形成过程。通过解析键级输出文件、构建原子类型映射字典,并实现C-N键的统计与可视化,为材料科学和催化反应研究提供了高效的数据分析解决方案。文章特别强调了ReaxFF力场在断键分析中的关键作用,并提供了完整的Python代码实现。 阅读详情


这次要来说一个吹水的话题,关于性能方面,最近在用Cocos2d-x + Lua写一个小游戏,因为实在太简单,就完全没想过会有什么掉帧的情况。

结果一到手机上运行,在关卡场景里的帧率立刻降低了,大概只有16到30帧,这个帧率对这个游戏来说,实在是有点可怕。

找了一下原因,凶手是某个update函数,因为每帧都要调用,遍历200到400个对象,主要是做碰撞检测,就在这里帧率下降了一半。
优化也很简单,把当前不在屏幕范围的对象都忽略碰撞就好了。
可奇怪的是,帧数还是不够高,于是,我发现了一个小问题…
    来自未来的PS:
      今天收到偶尔e网事发来的贺电,才知道这不是lua binding的性能缺陷,而是Cocos Code IDE的bug~!
           我想了这么个奇葩的解决方案、还花了这么多时间写这篇文章,原来都是假的!只是一个Bug而已。
      没关系,我已经醉了。
      这个Bug会引起debug模式下效率问题,下个版本的Cocos Code IDE会解决。
      以下的文章正文内容,大家就随意看看吧,关于lua binding的观点是错误的,就当娱乐吧~

    By 木头 2014.09.29 10:53

1.那些Lua-binding
我们都知道,Cocos2d-x的API大部分都绑定到lua里了,可以直接使用。
而我的问题就出在这里了,通过lua去调用c++,这之间的损耗我没有去研究过。
但有一点,这之间的损耗比直接调用lua里的table大多了。

我们来看看这样一个测试吧: 
        -- 随便创建500个Node
        local nodes = {};
        for i = 1, 500 do
            nodes[i] = cc.Node:create();
            layerMenu:addChild(nodes[i]);
        end
        -- 注册update函数
        self:scheduleUpdateWithPriorityLua(function(dt)
            local pos = nil;
            local size = nil;
           
            -- 遍历所有节点,仅仅是进行了获取坐标和大小的操作
            for index, node in pairs(nodes) do
                pos = node:getPosition();
                size = node:getContentSize();
            end
        end, 0);

这段代码是在一个Layer里的,模拟的就是我游戏里的情况(当然,这里简化了很多)。
创建了500个Node节点,然后在update函数里遍历这些节点,取出它们的坐标和大小,就这么简单的操作。
然而,如果在电脑上用调试模式(这样才更接近手机环境)运行游戏,帧数是这样的:

cocos2dxluabinding1
虽然电脑的数据不能说明什么,但是,我移植到手机上的情况也是不容乐观的,帧数也很低。
经过测试,造成帧数低的凶手就是getPosition和getContentSize函数,是的,我完全没有想过竟然是它们T_T,我是如此的信任…



2.简单的处理,让帧数飞回来
当然,我这代码每帧都要执行,所以才这么损耗帧数,但从另一个角度来说,我无法接受凶手竟然是两个不起眼的函数。
所以,我要解决它。
看如下代码:
 -- 随便创建500个Node
    local nodes = {};
    for i = 1, 500 do
        nodes[i] = cc.Node:create();
        nodes[i].pos = cc.p(100, 200 * i);
        nodes[i].size = nodes[i]:getContentSize();
        layerMenu:addChild(nodes[i]);

    end
    -- 注册update函数
    self:scheduleUpdateWithPriorityLua(function(dt)
       local pos = nil;
       local size = nil;
        -- 遍历所有节点,仅仅是进行了获取坐标和大小的操作
        for index, node in pairs(nodes) do
            pos = node.pos;
            size = node.size;
        end
    end, 0);

注意,我只是改动了一点点,在创建Node节点的时候,我使用pos和size字段将节点的坐标和大小预先保存起来了。
接着,在遍历节点坐标和大小时,就仅仅是从table中取值了。

结果,帧数的情况如下:


cocos2dxluabinding2
怎么样,这变化实在是太大了。
 
3.一些小麻烦
不管怎么说,我这次的优化算是建立在一个奇怪的基础上?
又或许是我这个游戏实在是太简单了(逻辑上),仅仅只有碰撞检测和一些简单的碰撞处理。
我也想过,不要每帧都这么遍历一次,可以间隔一小段时间进行遍历。
但又觉得,还是每一帧都遍历比较好,避免造成其他的bug。
由于我这游戏里参与碰撞检测的对象基本上是不会动的,也基本不会改变大小,所以把坐标和大小这么特殊处理,也不会造成管理上的麻烦。
并且,只是针对特定的对象才进行这些处理。
另外,经过这么处理之后,我这游戏即使在跑分8000的安卓机器上,也能基本维持58帧/s了。
当然,缺点呢?这么处理的话,就要自己另外处理对象的坐标和大小属性了,不能使用原来的getPosition、setPosition之类的。
关于这些的细节处理,我就不多说了,如果你也希望这么处理的话,可以给我留言~我再简单说说实现的思路,其实很简单的。
总而言之,我的目的只是,想表达一下我的惊讶——竟然是getPosition成为了我这游戏的性能障碍。

 
4.结束
今天的文章可能写得比较死板、难懂,这是因为我最近有点累,也好多天没写文章了。

嗯,就这样吧。

原文地址:http://www.benmutou.com/archives/1844

从混乱到清晰:用QJsonObject重构你的Qt网络API数据解析层(避坑指南) 本文详细介绍了如何使用QJsonObject重构Qt网络API数据解析层,避免常见的JSON解析陷阱。通过安全解析模式、数据绑定和性能优化技巧,帮助开发者构建高效、健壮的解析逻辑,提升代码可维护性和可读性。特别适用于处理复杂嵌套的JSON响应数据场景。 阅读详情

相关推荐

Jaspersoft Studio安装与配置全攻略:从下载到首个报表生成

本文提供Jaspersoft Studio从下载、安装到创建首个报表的完整实战指南。详细介绍了如何获取安装包、配置工作空间,并通过可视化设计器创建报表模板、添加参数与字段,最终实现数据预览与PDF导出。帮助Java开发者快速掌握这一强大的开源报表工具,提升报表开发效率。

weixin_28826521的博客 704

cocos-Lua 中的getPosition()

LUA中的getXX事件:     getPosition()             -- 返回两个值:x y     getAnchorPoint()      -- point_table     getContentSize()      -- size_table     getBoundingBox()   -- rect_table 其中,要注意的是getPosition(

游戏小逗比 5748

iOS In-App Purchase 自动续订订阅完整实现指南

本文摘要: 自动续订订阅是iOS应用变现的核心模式,适用于流媒体、云存储等持续服务场景。文章系统讲解了从配置到实现的完整流程:首先对比各类订阅模式特点,解析订阅生命周期和关键术语;然后详细说明App Store Connect中的订阅组创建、产品配置和服务器通知设置;最后展示客户端StoreKit实现方案,包括产品标识符定义、订阅管理器封装和支付队列观察机制。全文提供可落地的代码示例和技术细节,帮助开发者掌握自动续订订阅的全链路实现。

Sheffi 1759

关于cocos客户端跳帧的处理

在cocos引擎游戏开发过程中经常会使用引擎自带的对象生命周期函数来处理一些计时、位移等功能。 一般的处理方法是在update(float dt)方法里用dt叠加一个float常量,这里dt为引擎两帧渲染之间的时间间隔。 但是该方法在卡帧严重的情况下,对于精度要求较高的游戏会产生比较大的误差,尤其是在处理高速运动碰撞检测的时候。 因为卡帧严重的话,帧间隔dt就会被拉大,导致叠加的数值常量会超出预期的边界值。而且此时位移等渲染也会在画面上快速闪动,体验极差。 为了应对此问题,我们尽量在update(float

Gril_Wang的博客 1030

SQL Server2008详细安装步骤(超详细步骤)

https://pan.baidu.com/s/1yvolqfU-AbiuGrIzblA7pA 提取码:lzw81.下载好安装包后解压到除C盘以外的磁盘,避免系统卡顿2.使用管理员身份打开安装程序注意:使用管理员身份打开时,此时如果显示以下画面属于正常现象,下载安装即可。因为.net现在有很多软件都需要,包括SQLSERVER2008,它里面有visual studio都要有net,电脑系统没有的话安装一下好了。3.选择全新安装或向现有安装添加新功能4.点击确定5.出现以下画面之后,输入产品密钥即可(密钥在

m0_67402774的博客 4万+

保姆级教程:用vxe-grid给管理后台加个「智能筛选」功能(支持模糊搜索/多选/范围查询)

本文提供了一份详细的Vxe-Grid智能筛选功能实现教程。通过自定义筛选器渲染,文章逐步指导开发者为后台管理系统添加支持模糊搜索、多选下拉和数值范围查询的智能筛选功能,并分享了性能优化与移动端适配等实战经验。

weixin_29021291的博客 536

Cocos2dx中Lua游戏性能优化指南

渲染优化 合并图集(Atlas) 离散纹理资源会打断引擎的渲染合批优化,建议将常用资源合并成2048*2048、1024*2048或1024*1024等尺寸的图集(atlas)。 合并原则:小图,如尺寸在256*256以内的纹理。图标,如人物头像,资源(gold, mine,stone, etc.)图标,Button背景,九宫资源等。公共,将在各个模块常用的纹理资源放一张公共纹理中,在整个游戏生命期内常驻内存。玩法,将不同玩法模块的资源单独合并到相应的图集,不同玩法模块中的资源很少共用,以玩法...

L的博客 1893

3D Slicer + MONAI Bundle实战:如何用Wholebrainseg模型快速分割133个脑区(附避坑指南)

本文详细介绍了如何利用MONAI Model Zoo中的Wholebrainseg模型,在3D Slicer环境中高效分割133个脑区。文章重点提供了数据预处理、GPU推理加速及结果精修等实战技巧与避坑指南,旨在帮助医学影像研究者和开发者提升全脑分割的精度与效率。

311

Cocos2d-x+Lua游戏的优化总结

近期游戏准备出安卓版本,在安卓上的性能表现不佳。经过一周多的优化,在性能上取得了较大的提升。游戏采用 Cocos2d-x 3.2 + Lua 进行开发,以下将在渲染效率,CPU效率,包大小等方面进行总结。 渲染效率 纹理格式 – 运行效率 内存 包大小 所有的图片都通过一个python脚本(调用TexturePacker的命令行工具)自动转换为RGBA4444编码的格式。然后判断

cbbbc 2244

YOLOv8改进,MobileNetV3轻量化架构改进特征提取网络,助力涨点

MobileNetV3通过结合硬件感知网络架构搜索(NAS)和NetAdapt算法,通过新颖的架构改进进一步提升了性能。本文开始探讨了自动化搜索算法与网络设计如何协同工作,以利用互补方法来提升整体技术水平。通过这一过程,创建了两个新的MobileNet模型:MobileNetV3-Large和MobileNetV3-Small,分别针对高资源和低资源使用场景。这些模型随后被适配并应用于目标检测和语义分割任务。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 3835

Nvidia Driveos SDK/PDK介绍

NVIDIA DRIVEOS SDK/PDK介绍

u011803281的博客 2175

关于Cocos2d-x中掉帧导致游戏一卡一卡的网上一些的解决方法

方法1 掉帧主要是setpostion引起的  因为每一帧每一个精灵都要set一次虽然不知道为什么会这样但是if(poX<1000&&pox>-100){     xx->setpostion(poX);}加了个这样的条件减少set的次数就不卡了(就是每次都调整Size[]保存的坐标,但只set符合要求的)ps:测试过 总共有420+精灵限制后大概只有10%的精...

weixin_34343000的博客 1880

SpringBoot中使用FastJson解析Json数据

场景 1.SpringBoot默认配置的是Jackson。 2.项目搭建专栏: https://blog.youkuaiyun.com/BADAO_LIUMANG_QIZHI/column/info/35688 实现 引入fastJson的依赖 <!-- fastjson的依赖 --> <dependency> <groupId>com.alibab...

BADAO_LIUMANG_QIZHI的博客 4140

cocos2d 性能优化2

原文地址:http://codingnow.cn/cocos2d-x/1658.html 近段时间在使用cocos2d-x开发2D手游,技术方案使用的是cocos2d-x+lua,因为游戏使用的是cocos2d-x 2.1.5版本,有些优化方案在最新版的cocos2d-x版本已经实现了。这篇文章主要是总结在使用cocos2d-x2.x版本+lua技术方案时遇到的问题和一些性能

litter_star的博客 1490

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【iOS-cocos2d-X 游戏开发之八】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!...

本站文章均为李华明Himi原创,转载务必在明显处注明:转载自【黑米GameDev街区】原文链接:http://www.himigame.com/iphone-cocos2dx/681.html          ☞ 点击订阅 ☜本博客最新动态!及时将最新博文通知您! 对于游戏公司而言,采用游戏脚本lua、python等进行开发也很常见,但是很多童鞋对脚本并没有很熟悉的概念,本篇则向大家简单介绍脚...

mmdev 1842

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【Cocos2dx】【一】lua c++ 绑定

代码是在C++层面调用的,肯定可以直接用代码调用。那是否代表Lua 里,调用一个函数,C里也是这么执行的?原因也没看懂。lau.h 中定义了要注册到 lua 中的 c 函数的原型返回值(int)表示此函数有几个返回值,lua 执行完些函数之后根据这个返回值就知道需要从栈中取几个返回值.参数 lua_State* L,c 函数内可以使用 CAPI 来操作栈,与 lua 交互tolua 也叫 tolua++,是一个第三方库,简化了 lua 访问 c/c++ 的工作。

??? 1750

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Cocos2d-x之LUA脚本引擎深入分析

首先,我们要知道LUA是个什么东西,至于官方怎么说可以百度去查,但我想告诉你的是LUA就是一种可以在不必修改C++代码的情况下实现逻辑处理的手段。稍微讲的再明白一点,就是你用指定语法写一些逻辑处理函数然后保存成文本格式,这个文件称为脚本文件,可以被游戏执行。经过若干年的发展,现在在LUA中写逻辑,除了调用注册到LUA的静态C函数外,也已经可以方便的访问到C++工程中的类的成员函数。这是游戏开发史上

2030

Cocos2d-x Lua getPosition 获取坐标的一个小小错误

版本:cocos2d-x 3.12 语言:Lua   我发现每天看看新闻都耗费挺多精力的,准备平常日的时候游民上的新闻就不看了。   闲话不多说,今天带来一个挺坑的错误,用过的应该都是知道的,我就简短的说一下。   首先看图:   创建了一个精灵,然后获取位置坐标,做多了基本上都知道pos的类型其实是Vec2,我习惯写成auto或者是Point,Point实际就是Vec2嘛。不

暗光之痕的博客 6711

Cocos2d-x之getVisibleSize,getContentSize,boundingBox,getContentSizeInPixels,convertToGL,convertToUI

CCNode类的setPosition,getPosition函数如果是一个Node的Child则获取的坐标就是该Node的本地坐标 另一个关键问题就是在cocos2d-x里就是各种对象的大小问题。因为在cocos2d-x里CCNode对象有缩放的方法setScaleX和setScaleY。所以在获取对象大小的时候必须根据情况明确指定获取对象原始大小,还是缩放后的大小。当然cocos2d-x里提

以现在的努力程度之低,谈狗屁的未来,屎的梦想!!! 3万+

cocos2d-lua 触摸屏幕,动作变速

printDebug("===============start debug===================") local direction = cc.Director:getInstance() local defSch = direction:getScheduler() local sched1 = cc.Scheduler:new() sched1:retain() def...

twicetwice的博客 1万+

cocos2dx引擎的Lua函数效率分析器

基本思路: Lua的lua_hook 钩子函数能够在每个函数被调用时和返回时触发一个特定回调。通过计算调用和返回的时间差即可计算出一个函数的耗时。 Lua的lua_getinfo函数可获取当前Lua的完整调用栈信息。 在ios和android平台可以使用std::chrono::high_resolution_clock获得高精度时间,windows平台上该接口精度不足,需要更换为Query...

jintemp的博客 1027

cocos2d-x ios下帧数优化分析

在游戏开发中,帧数和应该内存是大家会比较关心的问题,特别是在移动设备上。目前在我们游戏的过程中发现帧数比较低, 也作了一些努力去优化。今天抽空写一篇把这块遇到的问题总结下。 我们游戏中现有的影响帧数比较大的两个模块分别是图片渲染和定时器。 1,图片渲染 创建CCSprite尽量使用cocos2d-x专门的一个管理精灵的类, CCSpriteBatchNode。 2,使用定时器 目前coc

ryanzheng的专栏 2701

Cocos2dx性能优化技巧锦集(面试常问)

一、 为什么要做性能优化? 因为性能优化能使游戏 加载更快、运行更流畅、不卡顿。 二、优化方法: 加载优化 压缩图片(降低清晰度、颜色深度)和声音(降低采样率) 动画:尽量使用骨骼动画替代帧动画 字体:尽量使用系统字体,如果有特殊字体需求,可使用BMFont 代码:引擎代码没有用到的库不要打包进去 渲染优化 尽量降低drawcall次数,尽量合并渲染批次,提升渲染性能。 将同时使用的碎图打包成一张合图,相邻的渲染命令如果具有相同的_materialID,则会自动进行合并批处理..

码之有道 1354

cocos2d-x性能优化的那些事

年前在对我做的项目做性能优化,虽然在开发中,性能问题是一直关注着的,但是这个东西依然需要在后期做一段时间的优化的,也遇到不少坑,在这里分享下,也记作笔记,另外也欢迎大家有这方面的问题经验在这里讨论。性能的优化主要是亮点,内存的优化和运行效率的优化1.内存的优化       说内存的优化,首先要知道有什么东西会占据程序的内存,可优化的主要是两部分:数据和资源,先说数据,做短连接的游戏客户端有两种处理

手机游戏开发学习笔记 1万+

记一次cocos2dx-lua内存优化

公司游戏已经进行到最后一个阶段了,经过最后一次引擎升级之后使用的是3.3的版本。以前产品定位的目标是只需要兼容1G或者以上内存就可以,我们也一直没关注低内存的运行情况。现在发行渠道要去兼容512内存,这就不得对游戏进行优化了。 一般来说,游戏里比较容易出内存问题的地方是纹理资源和内存泄露。对于内存泄露来说,由于我们使用的是lua脚本进行逻辑开发,而且在测试的时候并不会出现内存持续高涨的情况,所以

cbbbc 3490

在cocos2d-x中调试lua

原文:http://www.cnblogs.com/respawn/archive/2012/11/11/2764894.html cocos2d-x开发包中内置了lua,而且也内置了tolua++,提供了lua对C++的支持.在官网下载的开发包中的sample就包含了 lua的实例.如何去调试项目中的lua代码呢? 今天的主题就是在cocos2d-x中调试lua代码. 有两个工具可以选

道心惟纯 1786
上一篇: Cocos2d-x中luajit的使用
下一篇: 关于cocos2dx手游lua文件加密的解决方案
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值