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

    文章

    278

    浏览量

    19946
  • 渲染
    +关注

    关注

    0

    文章

    69

    浏览量

    10917

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

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

收藏 人收藏

    评论

    相关推荐

    socket 多线程编程实现方法

    在现代网络编程中,多线程技术被广泛应用于提高服务器的并发处理能力。Socket编程是网络通信的基础,而将多线程技术应用于Socket编程,可以显著提升服务器的性能。 多线程编程的基本概念 多线
    的头像 发表于 11-12 14:16 340次阅读

    Python中多线程和多进程的区别

    Python作为一种高级编程语言,提供了多种并发编程的方式,其中多线程与多进程是最常见的两种方式之一。在本文中,我们将探讨Python中多线程与多进程的概念、区别以及如何使用线程池与进程池来提高并发执行效率。
    的头像 发表于 10-23 11:48 394次阅读
    Python中<b class='flag-5'>多线程</b>和多进程的区别

    ESP32会不会有多线程问题,需要加锁吗?

    ESP32会不会有多线程问题,需要加锁吗
    发表于 07-19 08:05

    多线程设计模式到对 CompletableFuture 的应用

    最近在开发 延保服务 频道页时,为了提高查询效率,使用到了多线程技术。为了对多线程方案设计有更加充分的了解,在业余时间读完了《图解 Java 多线程设计模式》这本书,觉得收获良多。本篇文章将介绍其中
    的头像 发表于 06-26 14:18 348次阅读
    从<b class='flag-5'>多线程</b>设计模式到对 CompletableFuture 的应用

    bootloader开多线程做引导程序,跳app初始化后直接进hardfualt,为什么?

    如标题,想做一个远程升级的项目,bootloader引导区域和app都是开多线程跑的,就是自己写了个小的任务调度器,没什么功能主要是想让程序快速的响应,延时不会对其他程序造成堵塞,程序测试
    发表于 04-18 06:07

    鸿蒙OS开发实例:【ArkTS类库多线程CPU密集型任务TaskPool】

    CPU密集型任务是指需要占用系统资源处理大量计算能力的任务,需要长时间运行,这段时间会阻塞线程其它事件的处理,不适宜放在主线程进行。例如图像处理、视频编码、数据分析等。 基于多线程并发机制处理CPU密集型任务可以提高CPU
    的头像 发表于 04-01 22:25 834次阅读
    鸿蒙OS开发实例:【ArkTS类库<b class='flag-5'>多线程</b>CPU密集型任务TaskPool】

    鸿蒙APP开发:【ArkTS类库多线程】TaskPool和Worker的对比(2)

    创建Worker的线程称为宿主线程(不一定是主线程,工作线程也支持创建Worker子线程),Worker自身的
    的头像 发表于 03-27 15:44 527次阅读
    鸿蒙APP开发:【ArkTS类库<b class='flag-5'>多线程</b>】TaskPool和Worker的对比(<b class='flag-5'>2</b>)

    鸿蒙APP开发:【ArkTS类库多线程】TaskPool和Worker的对比

    TaskPool(任务池)和Worker的作用是为应用程序提供一个多线程的运行环境,用于处理耗时的计算任务或其他密集型任务。可以有效地避免这些任务阻塞主线程,从而最大化系统的利用率,降低整体资源消耗,并提高系统的整体性能。
    的头像 发表于 03-26 22:09 611次阅读
    鸿蒙APP开发:【ArkTS类库<b class='flag-5'>多线程</b>】TaskPool和Worker的对比

    鸿蒙原生应用开发-ArkTS语言基础类库多线程I/O密集型任务开发

    filePath2 = ...; // 使用TaskPool执行包含密集I/O的并发函数 // 数组较大时,I/O密集型任务任务分发也会抢占主线程,需要使用多线程能力
    发表于 03-21 14:57

    java实现多线程的几种方式

    了多种实现多线程的方式,本文将详细介绍以下几种方式: 1.继承Thread类 2.实现Runnable接口 3.Callable和Future 4.线程池 5.Java 8中
    的头像 发表于 03-14 16:55 693次阅读

    AT socket可以多线程调用吗?

    请问AT socket 可以多线程调用吗? 有互锁机制吗,还是要自己做互锁。
    发表于 03-01 08:22

    什么是多核多线程?多核多线程如何提高程序的运行效率?

    线程无法充分利用多核处理器的并行计算能力。
    的头像 发表于 02-20 10:22 1351次阅读

    linux多线程编程实例

    linux线程
    的头像 发表于 02-15 21:16 461次阅读
    linux<b class='flag-5'>多线程</b>编程实例

    报名启动|OpenHarmony源码转换器—多线程特性转换赛题

    点击蓝字 ╳ 关注我们 开源项目 OpenHarmony 是每个人的 OpenHarmony 原文标题:报名启动|OpenHarmony源码转换器—多线程特性转换赛题 文章出处:【微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。
    的头像 发表于 12-29 16:15 706次阅读
    报名启动|OpenHarmony源码转换器—<b class='flag-5'>多线程</b>特性转换赛题

    揭秘:实时渲染、离线渲染、云渲染和混合渲染的区别

    渲染,就是将3D模型转换成2D图像,并最终呈现在屏幕上的过程。常见的渲染类型有以下几种:实时渲染离线渲染
    的头像 发表于 12-26 08:27 811次阅读
    揭秘:实时<b class='flag-5'>渲染</b>、离线<b class='flag-5'>渲染</b>、云<b class='flag-5'>渲染</b>和混合<b class='flag-5'>渲染</b>的区别