多线程渲染

首先我们得明确3D引擎使用多线程的目的所在:

1、在CPU上进行的逻辑计算(比如骨骼动画粒子发射等)不影响渲染速度

2、较差的GPU渲染速度的低下不影响逻辑速度

第一个目标已经很明确了,我来解释下需要达到第二个目标的原因:许多动作游戏的逻辑判定是基于帧的,所以在渲染较慢的情况下,逻辑不能跳帧,而仍然需要严格执行才能保证游戏逻辑的正确性,这就导致了游戏速度的放慢,而实际上个人认为渲染保持15帧以上就已经可以正常进行游戏了。

在较差的GPU上跑《鬼泣4》《刺客信条》《波斯王子4》简直就像是慢镜头一样,完全没法玩。而实际上CPU跑满帧是没有问题的,如果能把逻辑帧和渲染帧彻底分离,即使渲染帧达不到要求,但CPU仍能正确的执行游戏逻辑,就可以解决动作游戏对GPU要求过高的问题。

我们先来看多线程Ogre的两种架构,第一种是middle-level multithread

如上图所示,每个需渲染的实体被复制成了两份,主线程和渲染线程交替更新和渲染同一个实体的两个备份,并在一帧结束时同步,这种解决方案达到了第一个目标而并没有达到第二个目标,同时两份实体的维护也相对复杂,并且没法为更多核数的CPU进行扩展优化。

第二种Ogre多线程的方法是 low-level multithread

如图,将D3D对象复制两份,同样是在帧结束时同步并交换,和上面的优缺点类似。两种多线程Ogre的解决方案都是在引擎层完成的,对上层应用透明,对于用户而言无需考虑多线程细节,这点是非常不错的。

接下来我们来看SIGGRAPH2008上,id soft提出的多线程3D引擎的方案

这里是已PS3的引擎结构为例的,与PC有较大的差别,其中SPU是Cell芯片的8个协处理器,拥有强大的并行能力,id的解决方案在SPU上进行了诸如骨骼动画、形变动画、顶点和索引缓存的压缩、Progressive Mesh的计算等诸多内容,同时与PPU上的物理计算RSX上的渲染工作交错进行,最大化的利用了PS3的硬件结构,最终的游戏产品《Rage》很快就会面世了!

最后是我的解决方案

特点是逻辑完全分离,无需同步,虽然成功的达到了文章开始提出的两个目标,但对于引擎的使用者必须考虑多线程的诸多问题,各种计算需放在哪个线程,如何在两个线程间交互,都需要深入思考,所以要应用到实际的游戏制作,恐怕还有很长的一段路要走。

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

原文地址:https://www.cnblogs.com/skiwnchiwns/p/10345459.html

时间: 2024-11-25 16:47:41

多线程渲染的相关文章

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

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

可行性: 游戏循环主要包括这几个部分:1,硬件事件,主要就是指触屏事件,按键事件和鼠标事件:2,游戏事件,主要指定时器事件和预定义事件,比如schedule:3,游戏逻辑,对于胖脚本端来说,这个就指的脚本逻辑:4,渲染数据的生成,在引擎里面就是指node的visit,这里计算生成所有即将发往OpenGL的数据,包括顶点纹理坐标等attribute数据,变换矩阵纹理等uniform数据,混合模式等渲染状态:5,通过OpenGL接口把所有数据发往OpenGL.这几个步骤里面,只有第五个步骤需要涉及到

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

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

Unity原生渲染方案

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

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

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

Oculus Rift 渲染

Oculus Rift需求使用失真矫正分屏为每个眼睛来消除镜头有关失真. 修正失真是有挑战的.用各种失真参数为不同的镜头类型和个别的眼睛减轻.为了使开发简单,Oculus SDK句柄自动失真修正在Oculus排字处理:它也关心消减延迟时间扭曲和呈现帧为头戴. Oculus SDK做了很多工作,应用的主要工作是执行模拟和渲染立体世界基于追踪姿态.立体视图能被渲染进一个或两个个别的纹理和被提交到排字通过调用ovr_SubmitFrame.我们在这节里详细讨论这个处理. 渲染到Oculus Rift

渲染优化01

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