cocos2d-x多线程渲染的一些探讨

可行性:

游戏循环主要包括这几个部分:1,硬件事件,主要就是指触屏事件,按键事件和鼠标事件;2,游戏事件,主要指定时器事件和预定义事件,比如schedule;3,游戏逻辑,对于胖脚本端来说,这个就指的脚本逻辑;4,渲染数据的生成,在引擎里面就是指node的visit,这里计算生成所有即将发往OpenGL的数据,包括顶点纹理坐标等attribute数据,变换矩阵纹理等uniform数据,混合模式等渲染状态;5,通过OpenGL接口把所有数据发往OpenGL。这几个步骤里面,只有第五个步骤需要涉及到OpenGL操作,而前面四个步骤都是为第五个步骤做准备,而第五个步骤不用或者很少需要反馈数据给前面四个步骤。这是一个典型的生产者消费者模式,在很低线程同步开销的情况下课采用多线程处理。

必要性:

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

一些方案:

cocos2d-x3.0之后有一个很大的转变就是不是在visit里面渲染,而是在visit里面生成渲染命令,并把命令发往render类缓存,等待某个时机处理这些命令,即渲染。这是一个典型的命令模式,只要保证这些command的执行处理的数据和主线程(游戏逻辑的执行线程)不一样或者通过加锁做好和主线程的数据互斥,就可以保证线程安全。大多数数据我们都可以在visit(其实是draw)里面生成一份拷贝,而对于较少个数但是每个都包含大量顶点数据的对象,我们可以通过加锁做好互斥,比如粒子系统。较少的线程互斥操作也不会造成太大线程通信开销。游戏主循环也是先执行游戏逻辑相关的四个步骤,然后通过条件变量告知渲染线程数据已经准备好。我们也可以使用双缓存系统,即创建两个渲染命令缓存,在渲染线程使用一个命令缓存进行渲染的时候,主线程逻辑可以把渲染命令发往另一个缓存。如果主线程逻辑确实需要OpenGL处理才能得到的一些数据,我们也可以采用一些较为低效的折中方案。主线程通过类似于schedule的方式把命令发往渲染线程,然后等待,渲染线程维持一个这样的命令队列,每个周期优先处理这个队列,处理完成后通知主线程。这种做法不易多用。说个例子,同步创建纹理并生成sprite的操作,这个生成纹理的部分需要放到渲染线程,这个就可以采用这种方案。而事实上游戏逻辑根本不需要关心这个纹理到底长什么样,主线程可以不用等到渲染线程处理完成这个纹理再继续运行,渲染线程再处理完成这个纹理后,通过schedule告知主线程,主线程更新这个texture2d对象的纹理ID即可,大大提高效率。

时间: 2024-10-11 01:42:41

cocos2d-x多线程渲染的一些探讨的相关文章

Unity4、Unity5移动平台多线程渲染在部分安卓手机上会造成闪退

你看到的crash堆栈可能是这样的: SIGSEGV(SEGV_MAPERR)   #00  pc 0001276c                          /system/lib/libc.so          #01  pc 00013dcc                          /system/vendor/lib/egl/libGLESv2_mtk.so          #02  pc 00013ea2                          /sys

Unity AR多线程渲染不支持导致问题

Unity MultiThreadRendering Error Android平台: VOIDAR以及TANGO AR  均不支持多线程渲染: 导致画面卡顿 黑屏蓝屏

DirectX* 11 多线程渲染的性能、方法和实践

对于在 CPU 上运行的 PC 游戏,渲染通常是主要的性能瓶颈:多线程渲染是一种消除瓶颈的有效方法.本文研究了 DirectX* 11 多线程渲染的性能可扩展性,讨论了多线程渲染的两种基本方法,并介绍了传统多线程延迟着色管线在大型在线游戏<战意*>中的应用.了解更多 原文地址:https://www.cnblogs.com/IDZPRC/p/10912669.html

多线程渲染

首先我们得明确3D引擎使用多线程的目的所在: 1.在CPU上进行的逻辑计算(比如骨骼动画粒子发射等)不影响渲染速度 2.较差的GPU渲染速度的低下不影响逻辑速度 第一个目标已经很明确了,我来解释下需要达到第二个目标的原因:许多动作游戏的逻辑判定是基于帧的,所以在渲染较慢的情况下,逻辑不能跳帧,而仍然需要严格执行才能保证游戏逻辑的正确性,这就导致了游戏速度的放慢,而实际上个人认为渲染保持15帧以上就已经可以正常进行游戏了. 在较差的GPU上跑<鬼泣4><刺客信条><波斯王子4&

浏览器渲染页面的探讨

我们都知道,网页中引用的外部文件: JavaScritp.CSS 等常常会阻塞浏览器渲染页面,执行一大片js代码也会迟滞页面的渲染.假设在 <head> 中引用的某个 JavaScript 文件由于各种不给力需要2秒来加载:或者,我们在页面中插入某段执行起来很耗时的js代码,那么浏览器渲染页面的过程就会被阻塞,直到JS文件下载并执行完后才继续.由此可见,前端性能调优时必须排除任何潜在的渲染阻塞点,让浏览器在最短时间内渲染出整体页面. 先来看看,为什么会发生渲染阻塞? 例如:有如下的html文件

三维引擎设计-多线程渲染(平台API基础和封装大致框架)

第一部分: Linux线程API基础 一:线程创建与结束 (1)pthread_t //线程的标识符类型 (2)pthread_create //用来创建一个线程, 参数线程标识符, 线程属性, 线程运行函数地址 (3)pthread_join //用来等待一个线程的结束, 参数被等待线程标识符,用户自定义指针 (4)pthread_exit //线程非正常结束,参数线程返回代码 二:修改线程属性 (1)pthread_attr_t //线程属性结构类型 (2)pthread_attr_init

渲染优化01

https://unity3d.com/cn/learn/tutorials/temas/performance-optimization/optimizing-graphics-rendering-unity-games   (官方原文链接) 游戏中的图形渲染优化 介绍: 在这篇文章中我们将学习当Unity渲染一帧时,在场景背后到底发生了什么,会出现什么样的问题以及怎么去解决关于渲染的相关问题. 在读这篇文章之前,应该要清楚的认识到:提高渲染性能的方案不是唯一的.因为影响渲染性能的因素有很多,

Unity原生渲染方案

Unity原生渲染方案 作者:3dimensions 本文为原创内容,转载请注明出处. 做这个的动机是想在原生代码中使用Unity的材质系统绘制,同时由原生代码提供绘制数据,省掉动态模型数据“非托管内存→ 托管内存→ 非托管内存”的传输过程.适用于有大量动态模型数据生成的情况,注意,如果不使用Unity的材质系统,并不需要按这个方案做.方案是我在Miloyip的建议下完成的. 一.目标 在Unity中,动态生成三维模型需要把数据填入Mesh对象中,当中Unity内部需要分配内 存及做数据转换,效

Chromium网页渲染机制简要介绍和学习计划

作为一个浏览器,快速地将网页渲染出来是最重要的工作.Chromium为了做到这一点,费尽了心机,做了大量优化工作.这些优化工作是卓有成效的,代表了当今最先进的网页渲染技术.值得一提的是,这些渲染技术不仅适用于网页渲染,也可以应用在原生系统的UI渲染上.例如,在Android系统上,我们就可以看到两者在渲染技术上的相似之处.本文接下来就对Chromium的网页渲染机制进行简要介绍,并且制定学习计划. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! Chrom