cc::gfx::GLES3Device::doInit(const cc::gfx::DeviceInfo &) GLES3Device.cpp:79
cc::gfx::Device::initialize(const cc::gfx::DeviceInfo &) GFXDevice.cpp:67
cc::gfx::DeviceAgent::doInit(const cc::gfx::DeviceInfo &) DeviceAgent.cpp:68
cc::gfx::Device::initialize(const cc::gfx::DeviceInfo &) GFXDevice.cpp:67
cc::gfx::DeviceValidator::doInit(const cc::gfx::DeviceInfo &) DeviceValidator.cpp:76
cc::gfx::Device::initialize(const cc::gfx::DeviceInfo &) GFXDevice.cpp:67
cc::gfx::DeviceManager::tryCreate<…>(const cc::gfx::DeviceInfo &, cc::gfx::Device **) GFXDeviceManager.h:162
cc::gfx::DeviceManager::create(const cc::gfx::DeviceInfo &) GFXDeviceManager.h:105
cc::gfx::DeviceManager::create() GFXDeviceManager.h:72
cc::Engine::init() Engine.cpp:123
cc::CocosApplication::init() CocosApplication.cpp:56
cc::BaseGame::init() BaseGame.cpp:73
Game::init() Game.cpp:55
cocos_main(int, const char **) Game.cpp:65
cc::GameInputProxy::handleAppCommand(int) AndroidPlatform.cpp:533
cc::handleCmdProxy(android_app *, int) AndroidPlatform.cpp:704
process_cmd android_native_app_glue.c:177
cc::AndroidPlatform::loop() AndroidPlatform.cpp:827
cc::AndroidPlatform::run(int, const char **) AndroidPlatform.cpp:808
android_main(android_app *) JniCocosEntry.cpp:38
android_app_entry android_native_app_glue.c:210
__pthread_start(void*) 0x00000000e84c5828
__start_thread 0x00000000e847c5ce
cc::gfx::SwapchainAgent::doInit(const cc::gfx::SwapchainInfo &) SwapchainAgent.cpp:50
cc::gfx::Swapchain::initialize(const cc::gfx::SwapchainInfo &) GFXSwapchain.cpp:45
cc::gfx::SwapchainValidator::doInit(const cc::gfx::SwapchainInfo &) SwapchainValidator.cpp:51
cc::gfx::Swapchain::initialize(const cc::gfx::SwapchainInfo &) GFXSwapchain.cpp:45
cc::gfx::Device::createSwapchain(const cc::gfx::SwapchainInfo &) GFXDevice.h:234
cc::Root::createRenderWindowFromSystemWindow(cc::ISystemWindow *) Root.cpp:119
cc::Root::initialize(cc::gfx::Swapchain *) Root.cpp:82
js_cc_Root__initialize(se::State &) jsb_scene_auto.cpp:4918
jsbFunctionWrapper(const v8::FunctionCallbackInfo<…> &, bool (*)(se::State &), const char *) HelperMacros.cpp:99
js_cc_Root__initializeRegistry(const v8::FunctionCallbackInfo<…> &) jsb_scene_auto.cpp:4923
v8::internal::FunctionCallbackArguments::Call(v8::internal::CallHandlerInfo) 0x00000000bd00ba24
cc::gfx::GLES3Swapchain::doInit(const cc::gfx::SwapchainInfo &) GLES3Swapchain.cpp:117
cc::gfx::Swapchain::initialize(const cc::gfx::SwapchainInfo &) GFXSwapchain.cpp:45
SwapchainInit::execute() SwapchainAgent.cpp:50
cc::MessageQueue::executeMessages() MessageQueue.cpp:249
cc::MessageQueue::flushMessages() MessageQueue.cpp:236
cc::MessageQueue::consumerThreadLoop() MessageQueue.cpp:277
decltype(*std::__ndk1::forward<cc::MessageQueue*>(fp0).*fp()) std::__ndk1::__invoke<void (cc::MessageQueue::*)() noexcept, cc::MessageQueue*, void>(void (cc::MessageQueue::*&&)() noexcept, cc::MessageQueue*&&) type_traits:3815
void std::__ndk1::__thread_execute<std::__ndk1::unique_ptr<std::__ndk1::__thread_struct, std::__ndk1::default_delete<std::__ndk1::__thread_struct>>, void (cc::MessageQueue::*)() noexcept, cc::MessageQueue*, 2u>(std::__ndk1::tuple<std::__ndk1::unique_ptr<std::__ndk1::__thread_struct, std::__ndk1::default_delete<std::__ndk1::__thread_struct>>, void (cc::MessageQueue::*)() noexcept, cc::MessageQueue*>&, std::__ndk1::__tuple_indices<2u>) thread:273
void* std::__ndk1::__thread_proxy<std::__ndk1::tuple<std::__ndk1::unique_ptr<std::__ndk1::__thread_struct, std::__ndk1::default_delete<std::__ndk1::__thread_struct>>, void (cc::MessageQueue::*)() noexcept, cc::MessageQueue*>>(void*) thread:284
__pthread_start(void*) 0x00000000e84c5828
__start_thread 0x00000000e847c5ce
3.1 V8的API定义了几个基本概念:句柄(handle)、作用域(scope)、上下文环境(Context)、模板(Templates)。
4.1 Jsb绑定机制,实现为上一小结JavaScript调用c++的方式
手动绑定的c++接口位置:engine\native\cocos\bindings\manual
自动绑定:工程构建时通过Cmake 脚本engine\native\cmake\predefine.cmake批量 生成jsb2.0可绑定得c++方法到:工程目录\build\android\proj\build\Debug\xxxxxx\armeabi-v7a\generated\cocos\bindings\auto,swig工具配置文件目录: engine\native\tools\swig-config
基于反射的旧方式:jsb.reflection.callStaticMethod,支持从 ts 端直接调用 Native 端的接口,性能较jsb慢
4.2 共享内存:共享 CPP 的内存到 JS ,实现类:bindings::NativeMemorySharedToScriptActor。
se::ScriptEngine::start() ScriptEngine.cpp:772
cc::CocosApplication::init() CocosApplication.cpp:95
cc::BaseGame::init() BaseGame.cpp:73
Game::init() Game.cpp:55
cocos_main(int, const char ) Game.cpp:65
cc::GameInputProxy::handleAppCommand(int) AndroidPlatform.cpp:533
cc::handleCmdProxy(android_app *, int) AndroidPlatform.cpp:704
process_cmd android_native_app_glue.c:177
cc::AndroidPlatform::loop() AndroidPlatform.cpp:827
cc::AndroidPlatform::run(int, const char ) AndroidPlatform.cpp:808
android_main(android_app *) JniCocosEntry.cpp:38
se::ScriptEngine::evalString(const char *, unsigned int, se::Value *, const char *) ScriptEngine.cpp:880
setCanvasCallback(se::Object *) Engine.cpp:97
se::ScriptEngine::callRegisteredCallback() ScriptEngine.cpp:758
se::ScriptEngine::start() ScriptEngine.cpp:800
cc::CocosApplication::init() CocosApplication.cpp:95
cc::BaseGame::init() BaseGame.cpp:73
Game::init() Game.cpp:55
cocos_main(int, const char ) Game.cpp:65
cc::GameInputProxy::handleAppCommand(int) AndroidPlatform.cpp:533
cc::handleCmdProxy(android_app *, int) AndroidPlatform.cpp:704
process_cmd android_native_app_glue.c:177
cc::AndroidPlatform::loop() AndroidPlatform.cpp:827
cc::AndroidPlatform::run(int, const char ) AndroidPlatform.cpp:808
android_main(android_app *) JniCocosEntry.cpp:38
android_app_entry android_native_app_glue.c:210
__pthread_start(void*) 0x00000000e84c5828
__start_thread 0x00000000e847c5ce
cc::gfx::SwapchainAgent::doInit(const cc::gfx::SwapchainInfo &) SwapchainAgent.cpp:50
cc::gfx::Swapchain::initialize(const cc::gfx::SwapchainInfo &) GFXSwapchain.cpp:45
cc::gfx::SwapchainValidator::doInit(const cc::gfx::SwapchainInfo &) SwapchainValidator.cpp:51
cc::gfx::Swapchain::initialize(const cc::gfx::SwapchainInfo &) GFXSwapchain.cpp:45
cc::gfx::Device::createSwapchain(const cc::gfx::SwapchainInfo &) GFXDevice.h:234
cc::Root::createRenderWindowFromSystemWindow(cc::ISystemWindow *) Root.cpp:119
cc::Root::initialize(cc::gfx::Swapchain *) Root.cpp:82
js_cc_Root__initialize(se::State &) jsb_scene_auto.cpp:4918
jsbFunctionWrapper(const v8::FunctionCallbackInfo<…> &, bool (*)(se::State &), const char *) HelperMacros.cpp:99
js_cc_Root__initializeRegistry(const v8::FunctionCallbackInfo<…> &) jsb_scene_auto.cpp:4923
v8::internal::FunctionCallbackArguments::Call(v8::internal::CallHandlerInfo) 0x00000000bd00ba24
resources\app.asar.unpacked\builtin\builder@types\public\build-result.d.ts
engine\platforms\native\builtin*.js 编译为-> jsb-adapter/web-adapter.js //web接口封装
engine\platforms\native\engine*.js 编译为-> jsb-adapter/engine-adapter.js //引擎接口封装
engine\templates\native\index.ejs -> main.js
engine\templates\launcher\application.ejs -> application.js
有空补
Cocos 渲染管线有内置的两种渲染管线:前向渲染管线、延迟渲染管线,和可自定义的渲染管线:
引擎默认使用 前向渲染管线,前向渲染管线的执行流程如下图所示:
前向渲染主要包括 ShadowFlow 和 ForwardFlow 两个阶段:
目前引擎提供了试验版本的内置 延迟渲染管线,对于光照数量比较多的项目可以使用 延迟渲染管线 来缓解光照计算的压力。延迟管线的执行流程如下图所示:
内置的延迟渲染管线主要包括 ShadowFlow 和 MainFlow 两个过程:
自定义渲染管线以数据流(Dataflow)的形式概括了渲染的整个流程,用渲染图(RenderGraph)描述。
渲染图由不同的渲染节点组成,比如渲染通道(RenderPass),计算通道(ComputePass)等。每个渲染通道有数据输入与输出,比如渲染目标(RenderTarget)、深度模板(DepthStencil)、贴图(Texture)等。这些输入与输出会在计算节点间构成链接关系,形成数据流。
在渲染通道、计算通道节点下,可以有渲染队列(RenderQueue)子节点,用于控制渲染的顺序。渲染队列节点下,可以有渲染内容(RenderContent)子节点,用于控制渲染的内容。
渲染内容 可以是 场景、屏幕 矩形,也可以是计算任务的 分发(Dispatch),不同的通道支持不同的渲染内容。
自定义渲染管线 的【渲染通道、渲染队列、渲染内容】构成一个森林:
自定义渲染管线的【渲染通道、渲染资源】构成一个有向无环图(DAG):
有空补
10.1 原生平台 JavaScript 调试
Android 真机调试
如果游戏只有在真机上才能运行,那就必须用真机对打包后的游戏进行调试。调试步骤如下:
adb shell ip -4 -br addr
查询手机IP地址
Windows 平台及 Mac 平台调试
在 Windows 平台及 Mac 平台下调试游戏,步骤与真机调试类似,将工程用 IDE 编译运行之后,此时便可进行调试。步骤如下:
A. c++ 源码中使用se引擎获取js堆栈接口
通过在 C++ 中断点我们能很便捷地看到 C++ 的调用栈,但并不能同时看到 JS 的调用栈,这个割裂的过程常常会破坏调试的体验
源码中使用ScriptEngine引擎的这个接口,可以获取当前js调用栈:
se::ScriptEngine::getInstance()->getCurrentStackTrace()
或 :
utils::getStacktraceJS()
B. Android 平台下使用LLDB工具注入命令(慎用,自测总是闪退,报解析错误):
断点后LLDB终端输入如下命令:
po se::ScriptEngine::getInstance()->getCurrentStackTrace()