{Multi-Threaded Mesh Skinning Showing Promise}

From: http://www.garagegames.com/community/blogs/view/14899

多线程网格皮肤化显示约定

网格皮肤化, 是对象渲染过程中的一部分, 这一过程由 TSSkinMesh::render() 完成。TSSkinMesh::render() 会调用 UpdateSkin() , 然后再调用 Parent::render() 。Parent::render() 会创建一个渲染实例。然而, 顶点缓存(vertex buffer) 被创建后, 并不会被立即使用。据与此, 使用一个"Promise" 来表示一个尚未准备好但最终会准备好的东西的想法诞生了。与许多网络案例相似, 网格的肤化也是如此。

#ifndef _PROMISE_H_
#define _PROMISE_H_

// This is a rough draft
template <typename T>
class Promise {
protected:
    // Return the promised data. Undefined results if isReady() is false.
    virtual T* get() = 0;

public:
    virtual ~Promise() { }

    // Returns true if the promised data is ready.
    vritual bool isReady() const = 0;

    // Blocks until the promised data is ready, and returns it.
    virtual T* resolve() {
        while(!isReady()) {
            return get();
        }
    }
};

#endif

然后, 在渲染实例对象中存储一个 Promise* 指针 而不在是一个顶点缓存(vertex buffer) 指针。在向设备发送绘制数据之前, 调用某个 promise 实例的 resolve() 方法, 可达到在未准备好之前的等待操作。

#ifndef _SIMPLE_PROMISE_H
#define _SIMPLE_PROMISE_H

template <typename T>
class SimplePromise : public Promise<T> {
    protected:
        T *mPtr;
        virtual T *get() { return mPtr; }

    public:
        SimplePromise(T *ptr) : mPtr = ptr {  }
        virtual bool isReady() const { return true; }
        virtual boid set(T *ptr) { mPtr = ptr; }
};

#endif

于是, 可以创建 ThreadedPromise 类来表示使用一个线程来完成某个约定(promise)。然后, 在创建一个 PromisedFulfilerThread 类, 该类可以操作一个ThreadedPromise 类实例的集合。由于加锁、释放锁也是需要时间的,不适合对一个集合进行简单操作, 也就是说, 将锁置于 PromisedFulfilerThread 类中是不合适。通过重新对问题进行考虑, 将互斥锁(mutex)置于 PromisedPromise 类中更为合适。通过测试发现, 主线程(Thread main) 会对渲染实例进行批处理操作, 开始绘制, 当进入到一个尚未准备就绪的 Promise 中时,停下来空转。如果主线程可以在需要时选取若干 promise 实例, 然后完成它,还是可以提升渲染性能的。

TSSkinBatcher -- Threaded Skin Promise Metrics
   - Promises batched to threads: 134050
   - Fulfilled before resolve: 91382
   - Promises blocked on resolve: 42668 [31.83%]
      + Worker thread processed 15065 [35.31%]
      + Main thread processed 27603 [64.69%] 

可以发现,134k 次皮肤请求中,91k 次在主线程请求之前在Worker线程种得到处理;42k次的 promise 阻塞了主线程。在这42k次请求中, 在主线程准备访问它们之前, 15k个 promise在Worker线程种得到处理...

#ifndef _THREADEDPROMISE_H
#define _THREADEDPROMISE_H

template<typename T>
class ThreadedPromise : public Promise<T> {

    public:

    virtual T* resolve() {
        PROFILE_SCOPE(ThreadedPromise_Resolve);
        #ifdef ENABLE_THREADED_PROMISE_METRICS
        if(_isReady()) {
            Atomic::Value32::Increment(&smNoBlockResolves);
            return get();
        }
        #else
        if(_isReady()) {
            returng get();
        }
        #endif

        // Interlock op, take control of promise
        if(mInterlockState == ilsPromiseNoState &&
           (Atomic::Value32::Increment(&mInterlockState) == ilsPromiseAcquired)) {
               #ifdef ENABLE_THREADED_PROMISE_METRICS
               Atomic::Value32::Increment(&smMainThreadResolveBlocks);
               #endif
               return set(reinterpret_cast<T*>(mFulfilerFunction(mFunctionData)));
        }
        while(!_isReady()) {
            Platform::sleep(0);
        }

        #ifdef ENABLE_THREADED_PROMISE_METRICS
        Atomic::Value32::Increment(&smWorkerThreadResolveBlocks);
        #endif
        return get();
    }    // ...
时间: 2024-08-30 14:26:05

{Multi-Threaded Mesh Skinning Showing Promise}的相关文章

UMA - Unity Multipurpose Avatar

UMA version 1.0.1.0R Unity 4.3 What is UMA? UMA - Unity Multipurpose Avatar, is an open avatar creation framework, it provides both base code and example content to create avatars. Using the UMA pack, it ?s possible to customize the code and content

安全工具

Here is a list of security tools that have been collected from the internet. These tools are specifically aimed toward security professionals and enthusiasts/hobbyists for testing and demonstrating security weaknesses. These tools are created for the

IT英语4-计算机英语缩写术语

1.CPU 3DNow!(3D no waiting,无须等待的3D处理) AAM(AMD Analyst Meeting,AMD分析家会议) ABP(Advanced Branch Prediction,高级分支预测) ACG(Aggressive Clock Gating,主动时钟选择) AIS(Alternate Instruction Set,交替指令集) ALAT(advanced load table,高级载入表) ALU(Arithmetic Logic Unit,算术逻辑单元) 

在VS2010环境开发Teamcenter ITK

前言 这个是几个月前学习ITK开发时,领导要求整理的学习笔记.最近同事要做ITK开发,就发给他了.感觉这篇文章对别人还是有帮助的,决定分享出来. ITK的开发分两种:batch program和handler ,其实就是exe和dll.因为teamcenter底层是用c实现的,ITK也开放了相关接口,ITK开发本质上就是纯粹的C开发.有C/C++开发基础的上手应该很快. 系统环境:Windows 7 X64 开发环境:VS2008 + VS2010 ultimate Teamcenter Ver

unity内部:内存 和 性能(以及Unity5的升级优化)

      我们的脚本代码里经常会需要访问gameObject引用或者某个组件的引用,最好的方式当然是在脚本Awake的时候就把这些可能访问的东西都缓存下来:如果需要访问临时gameObject实例的某属性或者临时某组件的gameObject实例,在能够确保组件一定存在(可以使用[RequireComponent( typeof(AudioSource ))] 如果没有自动添加移除不了!)的情况下,可以用属性访问,毕竟属性访问比GetComponent要快上一倍,但是如果不能确定组件是否存在,甚

【Heritrix基础教程之3】Heritrix的基本架构

Heritrix可分为四大模块: 1.控制器CrawlController 2.待处理的uri列表  Frontier 3.线程池 ToeThread 4.各个步骤的处理器 (1)Pre-fetch processing chain:主要处理DNS-lookup, robots.txt,认证,抓取范围检查等. (2)Fetch Processing chain:抓取处理器. 对于每一个协议,均有一个类作支持,如FetchHTTP. (3)Extractor processing chain:内容

C# 笔试题,看你会几道题

1.       Which interface you need to implement to support for each? IEnumerator IEnumerable IComparer IComparable All of the above None of the above   2.       What is the “internal” keyword used for? To make a method to be used internally by the dec

线程与进程-- 简单的解释

最近这段时间小编有点自卑,但是还是要按时的冒一下泡!!!!!! 在学习过程中经常听到进程与线程的概念,这几天了解了下线程与进程之间的关系,把自己的想法分享一下: 感谢:http://www.tuicool.com/articles/vMfIjy 进程(process)和线程(thread)是操作系统的基本概念. 最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂. 假设我们每个人都有一个房子( 想想眼里就都是泪 ),这个房子有一个很洋气的名字,叫做”Process“,房子里面有

Unity3D - 图形性能优化

Unity官方文档中有一篇是讲图形性能优化的,这篇文章无疑是指导Unity开发优化的最佳文章.Unity圣典曾翻译过旧的版本,但是太老旧了,跟最新的文档差别很大.我试着翻译一下最新的文档,点击查看原文链接. Optimizing Graphics Performance  图形性能优化 Good performance is critical to the success of many games. Below are some simple guidelines for maximizing