Android下SF合成流程重学习之Refresh流程

2024-02-19 06:36

本文主要是介绍Android下SF合成流程重学习之Refresh流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        Android下SF合成流程重学习之Refresh流程



引言

在前面初步分析完成了Android下SF合成流程重学习之Invalidate流程,我们接下来继续下面的分析。当有事务的更新或者有Buffer的更新便会触发后面刷新的流程,即Refresh流程!




一. onMessageRefresh

文件:frameworks/native/services/surfaceflinger/Surfaceflinger.cpp
void SurfaceFlinger::onMessageRefresh() {ATRACE_CALL();mRefreshPending = false;//这里的主要逻辑是搜集需要送显的layer的情况,封装成compositionengine::CompositionRefreshArgs参数传递//给CompositionEngine做进一步操作compositionengine::CompositionRefreshArgs refreshArgs;const auto& displays = ON_MAIN_THREAD(mDisplays);// display 的数量,把当前displaydevice 记录下来refreshArgs.outputs.reserve(displays.size());for (const auto& [_, display] : displays) {refreshArgs.outputs.push_back(display->getCompositionDisplay());}// 把当前layer记录下来mDrawingState.traverseInZOrder([&refreshArgs](Layer* layer) {if (auto layerFE = layer->getCompositionEngineLayerFE())refreshArgs.layers.push_back(layerFE);});// 把当前有queueframe的layer记录下来, 有Buffer的layerrefreshArgs.layersWithQueuedFrames.reserve(mLayersWithQueuedFrames.size());for (sp<Layer> layer : mLayersWithQueuedFrames) {if (auto layerFE = layer->getCompositionEngineLayerFE())refreshArgs.layersWithQueuedFrames.push_back(layerFE);}...// 主要逻辑在present里面mCompositionEngine->present(refreshArgs);}

前面主要搜集需要送显的layer的情况,封装成compositionengine::CompositionRefreshArgs参数传递给CompositionEngine做进一步操作。并且最最主要合成及调用Hal composer送显的逻辑都在在present里面了。




二. CompositionEngine::present

文件:frameworks/native/services/surfaceflinger/CompositionEngine/src/CompositionEngine.cppvoid CompositionEngine::present(CompositionRefreshArgs& args) {ATRACE_CALL();ALOGV(__FUNCTION__);// 根据是否还有layer没有消费掉,判断再调起一次刷新preComposition(args);{// latchedLayers is used to track the set of front-end layer state that// has been latched across all outputs for the prepare step, and is not// needed for anything else.LayerFESet latchedLayers;for (const auto& output : args.outputs) {// 计算各个区域大小以及创建hwc layeroutput->prepare(args, latchedLayers);}}// 更新layerCompositionStateupdateLayerStateFromFE(args);for (const auto& output : args.outputs) {// 逻辑在output.cpp的present里面output->present(args);}
}

2.1 preComposition

在这里插入图片描述

void CompositionEngine::preComposition(CompositionRefreshArgs& args) {ATRACE_CALL();ALOGV(__FUNCTION__);bool needsAnotherUpdate = false;mRefreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);//调用了layer->onPreComposition做composition前的准备。进去看没做啥实际操作for (auto& layer : args.layers) {if (layer->onPreComposition(mRefreshStartTime)) {needsAnotherUpdate = true;}}mNeedsAnotherUpdate = needsAnotherUpdate;
}

其主要逻辑就是调用了layer->onPreComposition做composition前的准备。进去看没做啥实际操作。


2.2 Output::prepare

在这里插入图片描述

prepare主要的作用是收集可见的Layers并计算各个区域大小以及创建hwc layer!

//frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp
void Output::prepare(const compositionengine::CompositionRefreshArgs& refreshArgs,LayerFESet& geomSnapshots) {...rebuildLayerStacks(refreshArgs, geomSnapshots);
}void Output::rebuildLayerStacks(const compositionengine::CompositionRefreshArgs& refreshArgs,LayerFESet& layerFESet) {...// Process the layers to determine visibility and coveragecompositionengine::Output::CoverageState coverage{layerFESet};collectVisibleLayers(refreshArgs, coverage);...
}void Output::collectVisibleLayers(const compositionengine::CompositionRefreshArgs& refreshArgs,compositionengine::Output::CoverageState& coverage) {...for (auto layer : reversed(refreshArgs.layers)) {// Incrementally process the coverage for each layerensureOutputLayerIfVisible(layer, coverage);// TODO(b/121291683): Stop early if the output is completely covered and// no more layers could even be visible underneath the ones on top.}...
}

其主要逻辑在ensureOutputLayerIfVisible里面。

2.3 ensureOutputLayerIfVisible

文件:frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cppvoid Output::ensureOutputLayerIfVisible(sp<compositionengine::LayerFE>& layerFE,compositionengine::Output::CoverageState& coverage) {....// 创建OutputLayerauto result = ensureOutputLayer(prevOutputLayerIndex, layerFE);...}

各个layer区域的计算结果可以通过adb shell dumpsys SurfaceFlinger看到,通过区域的计算把区域为空的layer过滤掉.

区域

ensureOutputLayer将创建Output layer,这些layer最后是要显示到屏幕上的

文件: frameworks/native/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.hOutputLayer* ensureOutputLayer(std::optional<size_t> prevIndex,const sp<LayerFE>& layerFE) {// 判断当前的outputlayer 集合里面有没有当前的layer,如果没有则新创建一个auto outputLayer = (prevIndex && *prevIndex <= mCurrentOutputLayersOrderedByZ.size())? std::move(mCurrentOutputLayersOrderedByZ[*prevIndex]): BaseOutput::createOutputLayer(layerFE);auto result = outputLayer.get();mPendingOutputLayersOrderedByZ.emplace_back(std::move(outputLayer));return result;}文件:frameworks/native/services/surfaceflinger/CompositionEngine/src/Display.cppstd::unique_ptr<compositionengine::OutputLayer> Display::createOutputLayer(const sp<compositionengine::LayerFE>& layerFE) const {auto result = impl::createOutputLayer(*this, layerFE);if (result && mId) {auto& hwc = getCompositionEngine().getHwComposer();auto displayId = *mId;// 创建hwclayerauto hwcLayer = std::shared_ptr<HWC2::Layer>(hwc.createLayer(displayId),[&hwc, displayId](HWC2::Layer* layer) {hwc.destroyLayer(displayId, layer);});ALOGE_IF(!hwcLayer, "Failed to create a HWC layer for a HWC supported display %s",getName().c_str());// 更新state.hwcresult->setHwcLayer(std::move(hwcLayer));}return result;
}

可以看到prepare主要的作用是遍历layer计算各个区域大小,过滤掉空区域的layer以及创建hwc layer。


2.4 updateLayerStateFromFE

在这里插入图片描述

它的核心逻辑是跟新更新OutputlayerState的参数,即layer的状态信息


文件:frameworks/native/services/surfaceflinger/Layer.cppvoid Layer::prepareCompositionState(compositionengine::LayerFE::StateSubset subset) {using StateSubset = compositionengine::LayerFE::StateSubset;switch (subset) {case StateSubset::BasicGeometry:prepareBasicGeometryCompositionState();break;case StateSubset::GeometryAndContent:prepareBasicGeometryCompositionState();prepareGeometryCompositionState();preparePerFrameCompositionState();break;case StateSubset::Content:preparePerFrameCompositionState();break;case StateSubset::Cursor:prepareCursorCompositionState();break;}
}C++
文件:frameworks/native/services/surfaceflinger/Layer.cppvoid Layer::prepareCompositionState(compositionengine::LayerFE::StateSubset subset) {using StateSubset = compositionengine::LayerFE::StateSubset;switch (subset) {case StateSubset::BasicGeometry:prepareBasicGeometryCompositionState();break;case StateSubset::GeometryAndContent:prepareBasicGeometryCompositionState();prepareGeometryCompositionState();preparePerFrameCompositionState();break;case StateSubset::Content:preparePerFrameCompositionState();break;case StateSubset::Cursor:prepareCursorCompositionState();break;}
}

这部分也可以通过adb shell dumpsys SurfaceFlinger看出来有哪些属性。

image




三. Output::present

如果说前面的都是洒洒水,开胃菜。那么从这里开始就是大餐了。

文件:frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cppvoid Output::present(const compositionengine::CompositionRefreshArgs& refreshArgs) {ATRACE_CALL();ALOGV(__FUNCTION__);//设置 Display的dataspace, colormodeupdateColorProfile(refreshArgs);// 设置outputlayer的dispFrame和sourceCrop等以及将outputlayer属性设给hwcupdateAndWriteCompositionState(refreshArgs);// 设置display的颜色矩阵,对全屏有效setColorTransform(refreshArgs);// FrameBuffer里面没做啥操作beginFrame();// 选择合成策略,判断是device还是GPU合成,如果是device合成,直接present,如果要走GPU合成则需要validateprepareFrame();// 一般不走devOptRepaintFlash(refreshArgs);// GPU合成主要逻辑在此,device合成没做啥finishFrame(refreshArgs);// device合成设置release fence,GPU合成需要present给hwcpostFramebuffer();
}

先关注device合成,涉及GPU部分单独分析(简单带过)!


3.1 updateAndWriteCompositionState


文件:frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cppvoid Output::updateAndWriteCompositionState(const compositionengine::CompositionRefreshArgs& refreshArgs) {ATRACE_CALL();ALOGV(__FUNCTION__);if (!getState().isEnabled) {return;}mLayerRequestingBackgroundBlur = findLayerRequestingBackgroundComposition();// 如果是有背景模糊的layer则强制使用GPU合成bool forceClientComposition = mLayerRequestingBackgroundBlur != nullptr;for (auto* layer : getOutputLayersOrderedByZ()) {// 遍历outputlayer,计算DisplayFrame, SourceCrop 等参数layer->updateCompositionState(refreshArgs.updatingGeometryThisFrame,refreshArgs.devOptForceClientComposition ||forceClientComposition,refreshArgs.internalDisplayRotationFlags);if (mLayerRequestingBackgroundBlur == layer) {forceClientComposition = false;}// 将layer属性设给hwclayer->writeStateToHWC(refreshArgs.updatingGeometryThisFrame);}

这部分参数也可以通过adb shell dumpsys SurfaceFlinger看到:

屏幕显示区域.png



3.2 setColorTransform

文件:frameworks/native/services/surfaceflinger/CompositionEngine/src/Display.cppvoid Display::setColorTransform(const compositionengine::CompositionRefreshArgs& args) {Output::setColorTransform(args);if (!mId || CC_LIKELY(!args.colorTransformMatrix)) {return;}auto& hwc = getCompositionEngine().getHwComposer();// 将上层设的colorTransformMatrix 设给hwc,这个效果作用于全屏,比如护眼模式下,改变的就是这个colorTransformMatrixstatus_t result = hwc.setColorTransform(*mId, *args.colorTransformMatrix);ALOGE_IF(result != NO_ERROR, "Failed to set color transform on display \"%s\": %d",mId ? to_string(*mId).c_str() : "", result);
}

setColorTransform 设置颜色矩阵给屏幕,作用于屏幕显示,所有的layer都受影响,护眼效果就是改变的这个值。


3.3 beginFrame

在这里插入图片描述

最终调用到FramebufferSurface,并没有执行具体的逻辑:

//frameworks/native/services/surfaceflinger/DisplayHardware/FramebufferSurface.cpp
status_t FramebufferSurface::beginFrame(bool /*mustRecompose*/) {return NO_ERROR;
}

3.4 prepareFrame

在这里插入图片描述

它的核心逻辑是选择合成策略,判断是device还是GPU合成,如果是device合成,直接present,如果要走GPU合成则需要validate。让我们通过代码具体分析:

文件:frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cppvoid Output::prepareFrame() {...const auto& outputState = getState();if (!outputState.isEnabled) {return;}// 选择合成类型,如果是device合成,则跳过validate,直接present送显chooseCompositionStrategy();// 把合成类型送到frameBufferSurface,没啥逻辑mRenderSurface->prepareFrame(outputState.usesClientComposition,outputState.usesDeviceComposition);
}void Output::chooseCompositionStrategy() {// The base output implementation can only do client composition// 默认使用GPU合成,针对没有hwc的设备auto& outputState = editState();outputState.usesClientComposition = true;outputState.usesDeviceComposition = false;outputState.reusedClientComposition = false;
}文件:frameworks/native/services/surfaceflinger/CompositionEngine/src/Display.cppvoid Display::chooseCompositionStrategy() {...// Default to the base settings -- client composition only.Output::chooseCompositionStrategy();...// Get any composition changes requested by the HWC device, and apply them.std::optional<android::HWComposer::DeviceRequestedChanges> changes;auto& hwc = getCompositionEngine().getHwComposer();// 从HWC device获得合成类型的改变,这个根据hwc能力来选择device还是GPU合成if (status_t result = hwc.getDeviceCompositionChanges(*mId, anyLayersRequireClientComposition(),&changes);result != NO_ERROR) {ALOGE("chooseCompositionStrategy failed for %s: %d (%s)", getName().c_str(), result,strerror(-result));return;}//如果有变化则设置给对应的layerif (changes) {applyChangedTypesToLayers(changes->changedTypes);applyDisplayRequests(changes->displayRequests);applyLayerRequestsToLayers(changes->layerRequests);applyClientTargetRequests(changes->clientTargetProperty);}// Determine what type of composition we are doing from the final state// 决定最后的合成类型auto& state = editState();state.usesClientComposition = anyLayersRequireClientComposition();state.usesDeviceComposition = !allLayersRequireClientComposition();
}文件:frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer.cppstatus_t HWComposer::getDeviceCompositionChanges(DisplayId displayId, bool frameUsesClientComposition,std::optional<android::HWComposer::DeviceRequestedChanges>* outChanges) {...if (!frameUsesClientComposition) {sp<Fence> outPresentFence;uint32_t state = UINT32_MAX;// 如果所有的layer都能走device合成,则在hwc里面直接present,若有不支持device合成的情况,则走GPU合成,会走validate逻辑error = hwcDisplay->presentOrValidate(&numTypes, &numRequests, &outPresentFence , &state);if (!hasChangesError(error)) {RETURN_IF_HWC_ERROR_FOR("presentOrValidate", error, displayId, UNKNOWN_ERROR);}if (state == 1) { //Present Succeeded.// present成功,数据直接提交给了hwcstd::unordered_map<HWC2::Layer*, sp<Fence>> releaseFences;error = hwcDisplay->getReleaseFences(&releaseFences);displayData.releaseFences = std::move(releaseFences);displayData.lastPresentFence = outPresentFence;displayData.validateWasSkipped = true;displayData.presentError = error;return NO_ERROR;}// Present failed but Validate ran.} else {// 这个分支走不到error = hwcDisplay->validate(&numTypes, &numRequests);}// 接收hwc过来的change,对于device合成不走,GPU合成走的逻辑,这个后续GPU合成专门分析...

prepareFrame 的作用是根据hwc的能力选择合成方式,如果是device合成则直接走hwc present上屏,如果是GPU合成后面则走hwc validate,然后根据hwc过来的变化改变layer的合成方式。用另外一种方式表达就是首先将合成策略给HWC看是否接受,然后如果有变化就将变化应用于layer


3. 5 Output::finishFrame

文件: frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cppvoid Output::finishFrame(const compositionengine::CompositionRefreshArgs& refreshArgs) {ATRACE_CALL();ALOGV(__FUNCTION__);if (!getState().isEnabled) {return;}// Repaint the framebuffer (if needed), getting the optional fence for when// the composition completes.// 主要针对GPU合成的逻辑auto optReadyFence = composeSurfaces(Region::INVALID_REGION, refreshArgs);// device合成直接returnif (!optReadyFence) {return;}// swap buffers (presentation)mRenderSurface->queueBuffer(std::move(*optReadyFence));
}

composeSurface的主要核心逻辑是针对GPU合成,对于device合成,则直接return了。


3.6 Output::postFramebuffer

在这里插入图片描述

这块的核心逻辑主要是对于device合成设置release fence,GPU合成需要present给hwc。我们通过代码来看下:

文件:frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cppvoid Output::postFramebuffer() {...// device合成获取release fenceauto frame = presentAndGetFrameFences();mRenderSurface->onPresentDisplayCompleted();for (auto* layer : getOutputLayersOrderedByZ()) {sp<Fence> releaseFence = Fence::NO_FENCE;if (auto hwcLayer = layer->getHwcLayer()) {if (auto f = frame.layerFences.find(hwcLayer); f != frame.layerFences.end()) {releaseFence = f->second;}}if (outputState.usesClientComposition) {releaseFence =Fence::merge("LayerRelease", releaseFence, frame.clientTargetAcquireFence);}// 将releasefence放到mslot里面,这个是dequeueBuffer等的fencelayer->getLayerFE().onLayerDisplayed(releaseFence);}
...
}文件:frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer.cppstatus_t HWComposer::presentAndGetReleaseFences(DisplayId displayId) {ATRACE_CALL();RETURN_IF_INVALID_DISPLAY(displayId, BAD_INDEX);auto& displayData = mDisplayData[displayId];auto& hwcDisplay = displayData.hwcDisplay;// device合成直接returnif (displayData.validateWasSkipped) {// explicitly flush all pending commandsauto error = static_cast<hal::Error>(mComposer->executeCommands()); RETURN_IF_HWC_ERROR_FOR("executeCommands", error, displayId, UNKNOWN_ERROR);RETURN_IF_HWC_ERROR_FOR("present", displayData.presentError, displayId, UNKNOWN_ERROR);return NO_ERROR;}//GPU 合成走presentauto error = hwcDisplay->present(&displayData.lastPresentFence);RETURN_IF_HWC_ERROR_FOR("present", error, displayId, UNKNOWN_ERROR);std::unordered_map<HWC2::Layer*, sp<Fence>> releaseFences;error = hwcDisplay->getReleaseFences(&releaseFences);RETURN_IF_HWC_ERROR_FOR("getReleaseFences", error, displayId, UNKNOWN_ERROR);displayData.releaseFences = std::move(releaseFences);return NO_ERROR;
}

3.6 postComposition

文件: frameworks/native/services/surfaceflinger/SurfaceFlinger.cppvoid SurfaceFlinger::postComposition()
{ATRACE_CALL();ALOGV("postComposition");nsecs_t dequeueReadyTime = systemTime();// release Bufferqueuelayerfor (auto& layer : mLayersWithQueuedFrames) {layer->releasePendingBuffer(dequeueReadyTime);}...// mPreviousPresentFences[0]是这一帧的present fence,mPreviousPresentFences[1]是上一帧的present fencemPreviousPresentFences[1] = mPreviousPresentFences[0];mPreviousPresentFences[0] =display ? getHwComposer().getPresentFence(*display->getId()) : Fence::NO_FENCE;...// 这个有关vsync,是校验presentfence释放的时间戳if (display && display->isPrimary() && display->getPowerMode() == hal::PowerMode::ON &&presentFenceTime->isValid()) {mScheduler->addPresentFence(presentFenceTime);}....
}

postComposition的作用就是释放上一帧显示的Buffer,然后重新设置当前帧的present fence,以及根据presentfence时间戳判断是否重新打开HW Vsync和软件Vsync进行校准。至此,SurfaceFlinger刷新的主体函数分析完了,可以看出来,如果是走device合成,SurfaceFlinger是直接把layer信息提交给hwc,由hwc去合成.




写在最后

好了今天的博客Android下SF合成流程重学习之Refresh流程就到这里了。总之,青山不改绿水长流先到这里了。如果本博客对你有所帮助,麻烦关注或者点个赞,如果觉得很烂也可以踩一脚!谢谢各位了!!

这篇关于Android下SF合成流程重学习之Refresh流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/723799

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss