0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

谈谈cocos2d-x多线程渲染

Dbwd_Imgtec 来源:未知 作者:胡薇 2018-05-23 10:40 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

可行性:

游戏循环主要包括这几个部分:

硬件事件,主要就是指触屏事件,按键事件和鼠标事件;

游戏事件,主要指定时器事件和预定义事件,比如schedule;

游戏逻辑,对于胖脚本端来说,这个就指的脚本逻辑;

渲染数据的生成,在引擎里面就是指node的visit,这里计算生成所有即将发往OpenGL的数据,包括顶点纹理坐标等attribute数据,变换矩阵纹理等uniform数据,混合模式等渲染状态;

通过OpenGL接口把所有数据发往OpenGL。

这几个步骤里面,只有第五个步骤需要涉及到OpenGL操作,而前面四个步骤都是为第五个步骤做准备,而第五个步骤不用或者很少需要反馈数据给前面四个步骤。这是一个典型的生产者消费者模式,在很低线程同步开销的情况下课采用多线程处理。

必要性:

处理游戏逻辑(包括前四个步骤)承担了太多cpu运算,而发数据到OpenGL也相当耗时,尤其涉及到多次的渲染状态切换。在多核cpu上面把二者分开可以提高并行性,进而提高游戏帧率。

一些方案:

cocos2d-x3.0之后有一个很大的转变就是不是在visit里面渲染,而是在visit里面生成渲染命令,并把命令发往render类缓存,等待某个时机处理这些命令,即渲染。

这是一个典型的命令模式,只要保证这些command的执行处理的数据和主线程(游戏逻辑的执行线程)不一样或者通过加锁做好和主线程的数据互斥,就可以保证线程安全。大多数数据我们都可以在visit(其实是draw)里面生成一份拷贝,而对于较少个数但是每个都包含大量顶点数据的对象,我们可以通过加锁做好互斥,比如粒子系统。较少的线程互斥操作也不会造成太大线程通信开销。

游戏主循环也是先执行游戏逻辑相关的四个步骤,然后通过条件变量告知渲染线程数据已经准备好。我们也可以使用双缓存系统,即创建两个渲染命令缓存,在渲染线程使用一个命令缓存进行渲染的时候,主线程逻辑可以把渲染命令发往另一个缓存。

如果主线程逻辑确实需要OpenGL处理才能得到的一些数据,我们也可以采用一些较为低效的折中方案。主线程通过类似于schedule的方式把命令发往渲染线程,然后等待,渲染线程维持一个这样的命令队列,每个周期优先处理这个队列,处理完成后通知主线程。这种做法不易多用。

说个例子,同步创建纹理并生成sprite的操作,这个生成纹理的部分需要放到渲染线程,这个就可以采用这种方案。而事实上游戏逻辑根本不需要关心这个纹理到底长什么样,主线程可以不用等到渲染线程处理完成这个纹理再继续运行,渲染线程再处理完成这个纹理后,通过schedule告知主线程,主线程更新这个texture2d对象的纹理ID即可,大大提高效率。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 多线程
    +关注

    关注

    0

    文章

    279

    浏览量

    20911
  • 渲染
    +关注

    关注

    0

    文章

    79

    浏览量

    11347

原文标题:cocos2d-x多线程渲染的一些探讨

文章出处:【微信号:Imgtec,微信公众号:Imagination Tech】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux多线程对比单线程的优势

    :「资源利用率」:通过多线程,可以更有效地利用CPU资源,特别是多核CPU。「并行处理」:线程允许同时执行多个任务,提高程序的执行效率。「简化设计」:使用线程可以简化程序设计,因为线程
    发表于 12-01 06:11

    rt-thread studio 如何进行多线程编译?

    ,使用的是5800h+32g内存+sn550 ssd,开启16线程编译时cpu的占用率也只能到30%,编译完整个工程需要3分钟 感觉多线程编译设置没有生效,有办法提高编译速度吗 rtthread studio版本是 2.2.9
    发表于 10-11 09:16

    tcpip线程被mu0锁住导致网络线程无法使用怎么解决?

    = %d\",ch); if(ch == 0x01) { mem_monitor2(NULL); list_thread(); list_sem(); list_msgqueue
    发表于 09-29 06:41

    【HZ-T536开发板免费体验】—— linux创建线程

    自己的私有资源。 在linux系统中,线程状态通常反映了当前线程的当前活动和执行阶段。 主要分为: 1。运行转态 2。阻塞转态 3。终止状态 如何区分单线程
    发表于 09-01 21:31

    【RA4E2开发板评测】LED1及LED2轮流点亮并同时亮8秒,体验FreeRTOS多线程

    我们要多线程操作时,就需要用到RTOS(Real-Time Operating System)。FreeRTOS实时操作系统开发里面使用到vTaskDelay函数,它是对CPU的时分复用,系统将这个
    发表于 08-24 17:24

    通道渲染:释放渲染的全部潜能!通道渲染的作用、类型、技巧

    在3D图形创作中,渲染通道(RenderPasses)是一项至关重要的技术,它通过将复杂的渲染图像拆分为多个图层,如阴影、光照、法线等,使艺术家能够在后期制作中更精准地控制和调整画面。我们常常惊叹于
    的头像 发表于 07-15 14:22 441次阅读
    通道<b class='flag-5'>渲染</b>:释放<b class='flag-5'>渲染</b>的全部潜能!通道<b class='flag-5'>渲染</b>的作用、类型、技巧

    多线程的安全注意事项

    多线程安全是指多个线程同时访问或修改共享资源时,能够保证程序的正确性和可靠性。 开发者选择TaskPool或Worker进行多线程开发时,在TaskPool和Worker的工作线程中导
    发表于 06-20 07:49

    工控一体机多线程任务调度优化:聚徽分享破解工业复杂流程高效协同密码

    在当今工业 4.0 的浪潮下,工业生产正朝着高度自动化、智能化的方向大步迈进。生产流程日益复杂,众多任务需要同时、高效地协同执行,这对工业控制系统的核心 —— 工控一体机提出了前所未有的挑战。多线程
    的头像 发表于 05-28 14:06 467次阅读

    摩尔线程MTT X300显卡全新性能升级

    摩尔线程近日发布的Linux驱动程序v3.0.0,为MTT X300专业显卡带来全面的性能提升。此次升级通过软硬件深度协同优化,显著提升了GPU渲染性能,使MTT X300在数字孪生、
    的头像 发表于 05-27 18:03 1431次阅读

    CPU渲染、GPU渲染、XPU渲染详细对比:哪个渲染最快,哪个效果最好?

    动画渲染动画3D渲染技术需要应对复杂的计算任务和精细的图像处理,作为渲染技术人员,选择合适的渲染模式,会直接影响制作效率和成品质量。在主流的
    的头像 发表于 04-15 09:28 1195次阅读
    CPU<b class='flag-5'>渲染</b>、GPU<b class='flag-5'>渲染</b>、XPU<b class='flag-5'>渲染</b>详细对比:哪个<b class='flag-5'>渲染</b>最快,哪个效果最好?

    2D图形渲染缓慢怎么加快?

    我有一个图形应用程序,它似乎渲染屏幕的速度很慢。按下屏幕后,通常需要相当长的时间来更新,大约 50 或 100 毫秒。 在应用程序启动时,我看到一条错误消息“GDK 无法创建 GL 上下文,回退
    发表于 04-02 06:46

    基于 HT 2D&amp;3D 渲染引擎的新能源充电桩可视化运营系统技术剖析

    在新能源汽车产业快速发展的浪潮中,充电桩作为关键配套设施,其运营管理的高效性和智能化愈发重要。图扑软件凭借基于 WebGL 和 Canvas 的 HT 2D3D 渲染引擎依托 WebGL
    的头像 发表于 03-20 11:47 712次阅读
    基于 HT <b class='flag-5'>2D</b>&amp;3<b class='flag-5'>D</b> <b class='flag-5'>渲染</b>引擎的新能源充电桩可视化运营系统技术剖析

    请问如何在Python中实现多线程与多进程的协作?

    大家好!我最近在开发一个Python项目时,需要同时处理多个任务,且每个任务需要不同的计算资源。我想通过多线程和多进程的组合来实现并发,但遇到了一些问题。 具体来说,我有两个任务,一个是I/O密集型
    发表于 03-11 06:57

    请问rt-thread studio如何进行多线程编译?

    ,使用的是5800h+32g内存+sn550 ssd,开启16线程编译时cpu的占用率也只能到30%,编译完整个工程需要3分钟 感觉多线程编译设置没有生效,有办法提高编译速度吗
    发表于 02-19 08:30

    华为云 X 实例 CPU 性能测试详解与优化策略

      2.2 Sysbench单线程CPU性能测试   2.3 Sysbench多线程CPU性能测试(4线程)   2.4 高强度多线程CPU性能测试(8
    的头像 发表于 12-30 14:52 1170次阅读
    华为云 <b class='flag-5'>X</b> 实例 CPU 性能测试详解与优化策略