blink渲染知识15- gl命令的生成和处理(command buffer)

看看下面的stack:

是在render线程合成时的callstack, 主要是处理compositorframe中的renderpass里面的quard,并把它们draw到gl的context上面。我们主要研究从此开始的gl的操作的过程。



他调用gl操作开始绘制:

#0 Init (_size=5,_command=299, this=0x85f00730) at../../gpu/command_buffer/common/cmd_buffer_common.h:52

注意,已经进入了commandbuffer里面了。

#1 SetCmd<gpu::gles2::cmds::DrawElements> (this=0x85f00730) at../../gpu/command_buffer/common/cmd_buffer_common.h:61

#2 SetHeader (this=0x85f00730) at../../gpu/command_buffer/common/../common/gles2_cmd_format_autogen.h:1913

#3 Init (_index_offset=0, _type=5123, _count=6, _mode=4,this=0x85f00730) at../../gpu/command_buffer/common/../common/gles2_cmd_format_autogen.h:1916

#4 DrawElements (index_offset=0, type=5123, count=6, mode=4,this=<optimized out>) at../../gpu/command_buffer/client/gles2_cmd_helper_autogen.h:419

#5 gpu::gles2::GLES2Implementation::DrawElements(this=0xa0803100, mode=4, count=6, type=5123, indices=0x0) at../../gpu/command_buffer/client/gles2_implementation.cc:878

#6 0x9bed9e1e in cc::GLRenderer::DrawQuadGeometry(this=this@entry=0x9f9fc000, frame=frame@entry=0xa1cff338,draw_transform=..., quad_rect=...,matrix_location=matrix_location@entry=0)

at ../../cc/output/gl_renderer.cc:2285

#7 0x9bedc310 in cc::GLRenderer::DrawSolidColorQuad(this=0x9f9fc000, frame=0xa1cff338, quad=0xa086f790) at../../cc/output/gl_renderer.cc:1545

#8 0x9bed7366 in cc::DirectRenderer::DrawRenderPass(this=this@entry=0x9f9fc000, frame=frame@entry=0xa1cff338,render_pass=render_pass@entry=0x9f7c92e0) at../../cc/output/direct_renderer.cc:386

#9 0x9bed754a in cc::DirectRenderer::DrawFrame(this=0x9f9fc000,

//这个函数会根据frame中的renderpass,遍历他们,并且把renderpass中的quard一个一个调用gl操作绘制出来。

render_passes_in_draw_order=0xa1cff63c,device_scale_factor=<optimized out>, device_viewport_rect=...,device_clip_rect=...,

disable_picture_quad_image_filtering=false) at../../cc/output/direct_renderer.cc:232

#100x9bf1263a in cc::LayerTreeHostImpl::DrawLayers(this=0xa0818c80, frame=0xa1cff620, frame_begin_time=...) at../../cc/trees/layer_tree_host_impl.cc:1605

#110x9bf18a34 in cc::SingleThreadProxy::DoComposite(this=this@entry=0xa085c220, frame_begin_time=...,frame=frame@entry=0xa1cff620) at../../cc/trees/single_thread_proxy.cc:432

#120x9bf19284 in cc::SingleThreadProxy::CompositeImmediately(this=0xa085c220, frame_begin_time=...) at../../cc/trees/single_thread_proxy.cc:350

#130x9bf08e3e in cc::LayerTreeHost::Composite(this=this@entry=0xa0803400, frame_begin_time=...) at../../cc/trees/layer_tree_host.cc:685

#140x9bf6feea in android_webview::HardwareRenderer::DrawGL(this=this@entry=0x9f923f80,stencil_enabled=stencil_enabled@entry=false,framebuffer_binding_ext=0, draw_info=draw_info@entry=0xa1cff8a8)

at ../../android_webview/browser/hardware_renderer.cc:224

#150x9c5d1af8 in android_webview::AwContents::DrawGL(this=<optimized out>, draw_info=0xa1cff8a8) at../../android_webview/native/aw_contents.cc:435

#160x9c6d5bea in draw_gl_50 (this=0x9f9e4fa0, data=0xa1cff964,what=<optimized out>) at../../third_party/android_plat_support/draw_gl_functor.cpp:103

#17android::(anonymous namespace)::DrawGLFunctor::operator()(this=0x9f9e4fa0, what=<optimized out>, data=0xa1cff964) at../../third_party/android_plat_support/draw_gl_functor.cpp:58

#180xb66971ea in ?? () from/tmp/tshao-adb-gdb-libs/system/lib/libhwui.so

#190xb668a754 in ?? () from/tmp/tshao-adb-gdb-libs/system/lib/libhwui.so

#200xb6680a34 in ?? () from/tmp/tshao-adb-gdb-libs/system/lib/libhwui.so

#210xb667ea76 in ?? () from/tmp/tshao-adb-gdb-libs/system/lib/libhwui.so

#220xb667e636 in ?? () from/tmp/tshao-adb-gdb-libs/system/lib/libhwui.so

#230xb668db42 in ?? () from/tmp/tshao-adb-gdb-libs/system/lib/libhwui.so

#240xb669d836 in ?? () from/tmp/tshao-adb-gdb-libs/system/lib/libhwui.so

#250xb669e750 in ?? () from/tmp/tshao-adb-gdb-libs/system/lib/libhwui.so

#260xb66a027c inandroid::uirenderer::renderthread::RenderThread::threadLoop()() from /tmp/tshao-adb-gdb-libs/system/lib/libhwui.so

#270xb6c564d6 in android::Thread::_threadLoop(void*) () from/tmp/tshao-adb-gdb-libs/system/lib/libutils.so

#280xb6de0f4e in android::AndroidRuntime::javaThreadShell(void*) () from/tmp/tshao-adb-gdb-libs/system/lib/libandroid_runtime.so

#290xb6c56046 in ?? () from/tmp/tshao-adb-gdb-libs/system/lib/libutils.so

#300xb6e9b2e4 in __pthread_start(void*) () from/tmp/tshao-adb-gdb-libs/system/lib/libc.so

#310xb6e992d4 in __start_thread () from/tmp/tshao-adb-gdb-libs/system/lib/libc.so

#320x00000000 in ?? ()



GLES2Implementation是实现了GLES2Interface,并使用commandbuffer。

voidGLES2Implementation::DrawElements(

-》GLES2CmdHelper::DrawElements(GLenummode,

GLsizei count,

GLenum type,

GLuint index_offset) {

gles2::cmds::DrawElements* c= GetCmdSpace<gles2::cmds::DrawElements>();

if (c) {

c->Init(mode,count, type, index_offset);

}

上述的DrawElements定义在gles2_cmd_format_autogen.h中,


cmd_buffer_helper.h中定义了GetCmdSpace:

template<typename T>

T*GetCmdSpace() {

COMPILE_ASSERT(T::kArgFlags == cmd::kFixed,Cmd_kArgFlags_not_kFixed);

int32space_needed = ComputeNumEntries(sizeof(T));

T* data =static_cast<T*>(GetSpace(space_needed));

ForceNullCheck(data);

return data;

}



void*GetSpace(int32 entries) {


if (entries >immediate_entry_count_) {

WaitForAvailableEntries(entries);

if (entries> immediate_entry_count_)

returnNULL;

}


CommandBufferEntry* space = &entries_[put_];

//可见,分配cmd是从一个固有的buffer里面分配。

put_ +=entries;

immediate_entry_count_ -= entries;


DCHECK_LE(put_, total_entry_count_);

return space;

}


那么这个entries_缓冲何时分配的,何时提交出去?

是boolCommandBufferHelper::AllocateRingBuffer() {分配的,

实际是调用如下函数创建的sharedmemory:

scoped_refptr<Buffer>CommandBufferService::CreateTransferBuffer(size_tsize,) {

*id = -1;


scoped_ptr<SharedMemory> shared_memory(new SharedMemory());

if (!shared_memory->CreateAndMapAnonymous(size))

return NULL;


static int32next_id = 1;

*id =next_id++;


if(!RegisterTransferBuffer(

*id,MakeBackingFromSharedMemory(shared_memory.Pass(), size))) {

*id = -1;

return NULL;

}


returnGetTransferBuffer(*id);

}


既然生成glcommand是直接在使用了sharedmemory的ringbuffer里分配的cmdentry, 那么这些cmds如何交给gpu的?


InProcessCommandBuffer::InitializeOnGpuThread(这个函数里面建立了inprocess command buffer使用的各种组件。

搞清楚gpuScheduler,GLES2Decoder,CommandParser之间的关系。

CommandParser知道保存cmds的sharedmemory地址,并且维护一个get/putindex, 从getindex取cmd,当getindex == put index时表明取完了。

CommandParser有processCommand函数处理一个command,也有processAllCommands函数处理所有的commands,实际处理工作交给其handler_,也就是gles2::GLES2Decoder::Create创建的decoder的DoCommand()函数

实际的decoder是GLES2DecoderImpl。


Gles2DecoderImpl::DoCommand其实根据cmd类型,调用对应的handle函数:

比如对于DrawElementscmd调用GLES2DecoderImpl::HandleDrawElements

->error::ErrorGLES2DecoderImpl::DoDrawElements(

->glDrawElements。

->GLApiBase::glDrawElementsFn

会调用从driver拿到的gl的drawElements函数。


我们看看实际的执行gl命令的callstack:

#0 gfx::GLApiBase::glDrawElementsFn(this=0x9e591218, mode=4, count=6,

//这个函数会调用driver里面拿到的drawElements操作。

type=5123,indices=0x0) at gen/ui/gl/gl_bindings_autogen_gl.cc:2956

#1 0x9c6b3d70 ingpu::gles2::GLES2DecoderImpl::DoDrawElements(this=this@entry=0x9f765900, function_name=<optimized out>,instanced=instanced@entry=false, mode=<optimized out>,count=count@entry=6,

type=type@entry=5123, offset=0, primcount=primcount@entry=0) at../../gpu/command_buffer/service/gles2_cmd_decoder.cc:6584

#2 0x9c6b3e62 ingpu::gles2::GLES2DecoderImpl::HandleDrawElements(this=this@entry=0x9f765900, immediate_data_size=<optimized out>,c=...) at ../../gpu/command_buffer/service/gles2_cmd_decoder.cc:6620

#3 0x9c6b7f5c ingpu::gles2::GLES2DecoderImpl::DoCommand(this=0x9f765900, command=299, arg_count=<optimized out>,cmd_data=0x94547730) at../../gpu/command_buffer/service/gles2_cmd_decoder.cc:3709

#4 0x9c692fa6 ingpu::CommandParser::ProcessCommand(this=0x9e5bc448)

//commandparser的实际工作交给commanddecoder

at../../gpu/command_buffer/service/cmd_parser.cc:67

#5 0x9c6bbb7a ingpu::GpuScheduler::PutChanged(this=0x9f8ddb30) at

//putChanged,就是告诉说commandbuffer里面的命令内容有变化,会调用commandparser处理里面的命令。

../../gpu/command_buffer/service/gpu_scheduler.cc:81

#6 0x9c6beeb0 inRun (object=<optimized out>, this=0xa1cff340) at../../base/bind_internal.h:134

#7 MakeItSo(weak_ptr=..., runnable=...) at ../../base/bind_internal.h:882

#8 base::internal::Invoker<1,base::internal::BindState<base::internal::RunnableAdapter<void(gpu::InProcessCommandBuffer::*)()>, void(gpu::InProcessCommandBuffer*), void(base::WeakPtr<gpu::InProcessCommandBuff

er>)>, void(gpu::InProcessCommandBuffer*)>::Run(base::internal::BindStateBase*)(base=0x9e5bc460) at ../../base/bind_internal.h:1169

#9 0x9c6930ce inRun (this=0x9f73a8a0) at ../../base/callback.h:401

#10gpu::CommandBufferService::Flush(this=0x9f73a880,

//这里会修改put_offset,然后调用一个putoffset change callback:

put_offset_change_callback_,其实是GpuScheduler::PutChanged

put_offset=<optimized out>) at../../gpu/command_buffer/service/command_buffer_service.cc:81

#11 0x9c6bfd3a ingpu::InProcessCommandBuffer::FlushOnGpuThread(this=0x9eed1e40, put_offset=465) at../../gpu/command_buffer/service/in_process_command_buffer.cc:510

#12 0x9c6becfe inRun (a1=@0x9e57d958: 465, object=<optimized out>,this=0xa1cff3a0) at ../../base/bind_internal.h:190

#13 MakeItSo(a2=@0x9e57d958: 465, weak_ptr=..., runnable=...) at../../base/bind_internal.h:909

#14base::internal::Invoker<2,base::internal::BindState<base::internal::RunnableAdapter<void(gpu::InProcessCommandBuffer::*)(int)>, void(gpu::InProcessCommandBuffer*, int), void(base::WeakPtr<gpu::InProcessCom

mandBuffer>,int)>, void (gpu::InProcessCommandBuffer*,int)>::Run(base::internal::BindStateBase*) (base=0x9e57d940) at../../base/bind_internal.h:1253

#15 0x9b933468 inRun (this=0xa1cff3c0) at ../../base/callback.h:401

#16android_webview::DeferredGpuCommandService::RunTasks(this=this@entry=0x9e58da00) at../../android_webview/browser/deferred_gpu_command_service.cc:180

#17 0x9b933630 inandroid_webview::DeferredGpuCommandService::ScheduleTask(base::Callback<void()> const&) (this=0x9e58da00, task=...) at../../android_webview/browser/deferred_gpu_command_service.cc:101

#18 0x9c6bf212 inQueueTask (task=...,this=0x9eed1e40) at../../gpu/command_buffer/service/in_process_command_buffer.h:177

#19gpu::InProcessCommandBuffer::Flush(this=0x9eed1e40, put_offset=465) at../../gpu/command_buffer/service/in_process_command_buffer.cc:559

#20 0x9ba0cae8 ingpu::CommandBufferHelper::Flush(this=0xa0883698) at../../gpu/command_buffer/client/cmd_buffer_helper.cc:156

#21 0x9b9374c8 inandroid_webview::ParentOutputSurface::SwapBuffers
//就是把commandbuffer给flush了,也就是让gpu执行命令

(this=0xac926cc0,frame=<optimized out>) at../../android_webview/browser/parent_output_surface.cc:22

#22 0x9b8a2cea incc::GLRenderer::SwapBuffers(this=0x9f8e0000, metadata=...) at../../cc/output/gl_renderer.cc:2357

#23 0x9b8d3874 incc::LayerTreeHostImpl::SwapBuffers(this=0x9f765580,

//parentcompositor合成完成后,调用swapbuffer。我认为,此时


frame=...) at../../cc/trees/layer_tree_host_impl.cc:1687

#24 0x9b8dd350 incc::SingleThreadProxy::CompositeImmediately

//parentcompositor的合成

(this=0x9f8abac0,frame_begin_time=...) at ../../cc/trees/single_thread_proxy.cc:364

#25 0x9b8ccef6 incc::LayerTreeHost::Composite(this=this@entry=0xa1bf7a00, frame_begin_time=...) at../../cc/trees/layer_tree_host.cc:685

#26 0x9b933fea inandroid_webview::HardwareRenderer::DrawGL(this=this@entry=0x9eed1c00,stencil_enabled=stencil_enabled@entry=false,framebuffer_binding_ext=0, draw_info=draw_info@entry=0xa1cff8a8)

at../../android_webview/browser/hardware_renderer.cc:224

#27 0x9bf95d58 inandroid_webview::AwContents::DrawGL(this=<optimized out>, draw_info=0xa1cff8a8) at../../android_webview/native/aw_contents.cc:435

#28 0x9c099e8a indraw_gl_50 (this=0x9f8ff690, data=0xa1cff964, what=<optimizedout>) at../../third_party/android_plat_support/draw_gl_functor.cpp:103

#29android::(anonymous namespace)::DrawGLFunctor::operator()(this=0x9f8ff690, what=<optimized out>, data=0xa1cff964) at../../third_party/android_plat_support/draw_gl_functor.cpp:58

#30 0xb66ae1ea in?? () from /tmp/tshao-adb-gdb-libs/system/lib/libhwui.so

#31 0xb66a1754 in?? () from /tmp/tshao-adb-gdb-libs/system/lib/libhwui.so

#32 0xb6697a34 in?? () from /tmp/tshao-adb-gdb-libs/system/lib/libhwui.so

#33 0xb6695a76 in?? () from /tmp/tshao-adb-gdb-libs/system/lib/libhwui.so

#34 0xb6695636 in?? () from /tmp/tshao-adb-gdb-libs/system/lib/libhwui.so

#35 0xb66a4b42 in?? () from /tmp/tshao-adb-gdb-libs/system/lib/libhwui.so

#36 0xb66b4836 in?? () from /tmp/tshao-adb-gdb-libs/system/lib/libhwui.so

#37 0xb66b5750 in?? () from /tmp/tshao-adb-gdb-libs/system/lib/libhwui.so

#38 0xb66b727c inandroid::uirenderer::renderthread::RenderThread::threadLoop()() from

//render线程,那么可以说明,gpu 线程,其实就是render线程。

/tmp/tshao-adb-gdb-libs/system/lib/libhwui.so

#39 0xb6c6d4d6 inandroid::Thread::_threadLoop(void*) () from/tmp/tshao-adb-gdb-libs/system/lib/libutils.so

#40 0xb6df7f4e inandroid::AndroidRuntime::javaThreadShell(void*) () from/tmp/tshao-adb-gdb-libs/system/lib/libandroid_runtime.so

#41 0xb6c6d046 in?? () from /tmp/tshao-adb-gdb-libs/system/lib/libutils.so

#42 0xb6eb22e4 in__pthread_start(void*) () from/tmp/tshao-adb-gdb-libs/system/lib/libc.so

#43 0xb6eb02d4 in__start_thread () from /tmp/tshao-adb-gdb-libs/system/lib/libc.so

#44 0x00000000 in?? ()


那么。我们可以看出来:

在render线程执行DrawGL的过程中,函数SingleThreadProxy::CompositeImmediately会先调用DoComposite来完成合成工作,这里会遍历compositorframe里面的renderpass,并针对所有的quard生成glcmds,保存到commandbuffer里面。


当DoComposite完成后,会调用LayerTreeHostImpl::SwapBuffers,实际上执行的工作是:flush当前的commandbuffer里面的gl命令,也就是在glcontext下面执行gl命令。

Chromium内核指纹浏览器防关联技术深度解析 浏览器指纹技术通过Canvas渲染、WebGL参数等数百个特征生成用户唯一标识,在数字身份管理领域具有重要应用价值。Chromium内核凭借其开源特性和模块化架构,成为实现虚拟身份隔离的理想技术载体。通过修改WebGL渲染管线、重写Canvas绘图API等技术手段,可以在内核层实现动态指纹生成,有效解决多账号管理场景下的身份关联问题。现代防关联系统需要同时处理网络特征、硬件指纹、行为模式等多维数据,其中Chromium的沙箱机制和进程隔离设计为构建安全可靠的虚拟身份环境提供了底层支持。这些技术在电商运营、数 阅读详情

相关推荐

OGL现代图形(顶点/纹理/状态命令/Shader)和底层渲染顺序(CommandBuffer协同并行/帧前后/drawcall过程)-持续更新

一、OGL显卡中的帧缓存区(非输入的原始顶点和像素数据) 1) 颜色缓存,  左前,右前,左后,右后和任意数量的辅助颜色缓存; OGL 3.1辅助颜色缓存没有,不支持立体观察(VR), 是使用左颜色缓存(启用双缓存是左前,左后颜色缓存,启用单缓存是左前颜色缓存) 2) 深度缓存 3) 模板缓存 4) 累积缓存(累计存储,拷贝回源颜色缓存的,OGL 3.1后已废弃) 二、Vertex Sh

自由理想的足迹 6252

Chromium硬件加速渲染的OpenGL命令执行过程分析

在Chromium中,由于GPU进程的存在,WebGL端、Render端和Browser端的GPU命令是代理给GPU进程执行的。Chromium将它们要执行的GPU命令进行编码,然后写入到一个命令缓冲区中,最后传递给GPU进程。GPU进程从这个命令缓冲区读出GPU命令之后,就进行解码,然后调用对应的OpenGL函数。本文就详细分析WebGL端、Render端和Browser端执行GPU命令的过程。。

老罗的Android之旅 2万+

Chrome内核解析 -- 绘制引擎基础篇:绘图上下文(RenderingContext, GraphicsContext)

转载请注明出处:http://blog.youkuaiyun.com/yunchao_he/article/details/41698169 众所周知,使用OpenGL/D3D绘图,或者GDI, GTK/Cario, QT, X11, Skia等与绘图相关的库时,有绘图上下文(GraphicsContext)这个概念。它和进程上下文有类似之处,只不过它保存绘图有关的信息,比如当前申请的Buffer, Texture, FBO等对象,以及这些对象的属性,如Texture的tile mode(repeat, mirror

yunchao的专栏: HTML5/Chromium/Web, Graphics, Android 4103

GPU Command Buffer

原文链接 http://www.chromium.org/developers/design-documents/gpu-command-buffer。 This are mostly just notes on the GPU command buffer GPU Command Buffer系统是Chrome通过OpenGL或OpenGL ES(或者ANGLE模拟的OpenGL ES)与

jaylinzhou的专栏 4837

native内存泄漏分析

一.摘要 我们在分析内存泄漏时java内存泄漏我们可以集成LeakCanary来进行监控,出现问题时会打印出泄漏时的引用关系,那么我们native内存泄漏时如何分析呢?native内存泄漏我们可以通过malloc_debug工具来进行监控,详细的介绍请参考: https://android.googlesource.com/platform/bionic/+/master/libc/malloc_debug/README.md 二.如何使用 默认情况下高通的手机已经包含了mal...

aa787282301的博客 5160

视觉伪装(下):WebGL 渲染器与厂商特征的底层伪造与屏蔽

本文深入探讨了WebGL指纹检测的风控逻辑与对抗策略。文章指出WebGL是风控系统识别指纹浏览器的核心武器,通过三维检测模型(身份维、能力维、行为维)实现精准识别。作者详细拆解了伪造WebGL指纹的技术路径,包括在Blink层拦截GLGetString调用实现零延迟替换,基于显卡型号模板裁剪扩展列表和参数,并深入GPU进程层面解决渲染行为一致性难题。文章强调要避免JS层Hook的低级方案,而应系统性地改造Chromium底层架构,实现各维度特征的无缝伪造。最后指出行为维对抗是最大挑战,需要介入GPU命令缓冲

数据知道的博客 806

android频繁点击ui崩溃,部分机型刷新UI频率过高 Crash (Android底层 so包调用问题)

Crash 日志如下Process: io.dcloud.H5F4AB8B7Flags: 0xd8be44Package: io.dcloud.H5F4AB8B7 v1 (1.0)Build: Android/rk3288/rk3288:5.1.1/LMY48W/yx109271031:userdebug/test-keysBuild fingerprint: 'Android/rk3288/rk...

weixin_34307867的博客 1234

从Playwright到自研:构建指纹浏览器的技术栈选型与路线图

本文详细介绍了如何从零构建一款工业级指纹浏览器的技术方案与实践路线。文章指出传统基于JS注入的指纹修改方案已无法应对现代风控系统,必须通过修改Chromium内核实现底层伪装。技术栈涵盖Chromium源码定制、Node.js/Rust中间层、加密CDP协议和Electron前端。实施分为五个阶段:环境容器隔离、自动化特征清除、基础指纹伪装、高级渲染指纹干扰和网络层TLS指纹重塑。文章特别强调设备模板系统的重要性以避免配置矛盾,并指出性能优化和版本更新的挑战。最终目标是打造一个在硬件一致性、API行为和网络

数据知道的博客 589

Chromium硬件加速渲染的OpenGL上下文调度过程分析

Chromium的每一个WebGL端、Render端和Browser端实例在GPU进程中都有一个OpenGL上下文。这些OpenGL上下文运行在相同线程中,因此同一时刻只有一个OpenGL上下文处于运行状态。这就引发出一个OpenGL上下文调度问题。此外,事情有轻重缓急,OpenGL上下文也有优先级高低之分,优先级高的要保证它的运行时间。本文接下来就分析GPU进程调度运行OpenGL上下文的过程。

老罗的Android之旅 1万+

ESP32搭配FT6236触摸屏:从芯片手册到完整I2C驱动代码的保姆级解析

本文详细解析了ESP32搭配FT6236触摸屏的I2C驱动开发过程,从芯片手册解读到完整代码实现。通过硬件架构分析、寄存器配置、I2C通信封装及触摸数据处理等步骤,提供了一套完整的驱动解决方案,帮助开发者快速掌握ESP32与触摸屏的交互技术。

weixin_29174385的博客 296

常见的十大量化投资策略(附源码)

量化投资策略是利用量化的方法,进行金融市场的分析、判断和交易的策略、算法的总称。著名的量化投资策略有以下10种(注:策略源码模板不能直接用于实盘交易,仅供探讨交流) 01、海龟交易策略 海龟交易策略是一套非常完整的趋势跟随型的自动化交易策略。这个复杂的策略在入场条件、仓位控制、资金管理、止损止盈等各个环节,都进行了详细的设计,这基本上可以作为复杂交易策略设计和开发的模板。 海龟交易策略源码:https://www.myquant.cn/docs/python_strategyies/110 0.

小壁虎的春天 2万+

webview同步合成

问题 Chrome合成器现在已经有了软件模式,但是只靠这一点还不能解决现有Android Webview的使用/滥用问题。 目前Android Webview系统的渲染情况如下: ● Nonmodal(非模态) 用户无法通过WebView API指定WebView是处于软件模式还是硬件模式。相反地,canvas是一层接一层的传递给draw调用的,而这个canvas的后端存储可以是硬的也可以

jaylinzhou的专栏 1445

基于boot + 双app升级方案

基于boot+双app的升级方案

weixin_44654285的博客 4517

【Unity 渲染】GL、Graphics、CommanderBuffer

unity 渲染

qq_22849251的博客 753

软件测试工程师最常用的Linux系统命令大全(汇总)

cd命令这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径。

1334

知识图谱实战应用8-从文本关系抽取到知识图谱关系构建流程贯通

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用8-从文本关系抽取到知识图谱关系构建流程贯通。我们从文本数据中采集到关键信息,并抽取出其中的关系信息,然后在存入图数据库中,整个过程实现自动化,我这里将举一个文本例子进行抽取。 对于知识图谱的构建是将实体、概念和它们之间的关系都以图表形式呈现出来的一种数据结构。要构建一个知识图谱,需要从不同的数据源中采集到相关信息,并将这些信息整合在一起,最终形成一个全面而且精确的知识图谱。

微学AI的博客 2545

android频繁点击ui崩溃,Android UI频繁更新 Crash (底层调用问题)

频繁刷新UI导致Crash ***未响应关闭硬件加速 可以减缓Crash频率 但是无法解决问题另外关闭硬件加速会导致UI加载速度缓慢,卡顿Crash 日志如下Process: io.dcloud.H5F4AB8B7Flags: 0xd8be44Package: io.dcloud.H5F4AB8B7 v1 (1.0)Build: Android/rk3288/rk3288:5.1.1/LMY...

weixin_36263738的博客 1056

浏览器解析HTML的过程及编程实现

需要注意的是,上述示例代码只是简化的演示,并未涵盖浏览器解析HTML的所有细节和复杂性。实际上,浏览器的HTML解析引擎还会处理一系列的特殊情况、错误容错和性能优化等方面的内容,以确保能够正确解析各种类型的HTML代码。HTML(超文本标记语言)是构建网页的基础语言,浏览器负责将HTML代码解析并渲染成可视化的网页。本文将详细介绍浏览器解析HTML的过程,并提供相应的编程示例代码。希望以上内容能帮助您理解浏览器解析HTML的过程,并通过提供的示例代码更好地了解如何在编程中实现这一过程。

ByteJolt的博客 322

入门图形学:CommandBuffer

unity提供给我们的commandbuffer可是个好东西,最近我正好用上了,所以来学习理解一下。 unity commandbuffer manual 按惯例先上官方介绍。 command buffer包含一系列渲染命令,类似于opengl的gl.xxx渲染命令函数但也不尽相同,最重要可以渲染开发者指定的object到延迟渲染的gbuffer中,在场景渲染后进行渲染。 那么我们就可以通过command buffer去特定渲染一些物体,特别是在延迟渲染等后处理中操作。...

羊羊的博客 6662

Autosar NvM配置-手动配置Nvblock及使用-基于ETAS软件

NVM作为存储协议栈中最顶层的模块,是必须要掌握的。目前项目基本使用MCU带的Dflash模块,使用Fee模拟eeprom。在项目前期阶段,应该充分讨论需要存储的内容,包括应用数据,诊断数据等,用以评估Dflash空间是否够用。本文基于ETAS软件介绍NVBlock配置生成NVM参数及使用。使用NVBlock配置生成,基本不用手写代码,还是比较方便的。对于Nv block的划分,建议将同时写的一类数据放到一个block中,因为block除了data以外,Fee还会增加一些header数据,占用不少内存。

赞的博客 1886

【Bug已解决】Claude Code Auto-update failed 自动更新失败的解决方案

方案适用场景推荐指数清理残留重新安装已经损坏,需要快速恢复可用⭐⭐⭐⭐⭐修复目录权限权限不足导致更新反复失败⭐⭐⭐⭐⭐关闭自动更新网络/安全软件环境不稳定⭐⭐⭐切换原生安装方式想从根源规避 npm 更新问题⭐⭐⭐⭐自检修复脚本团队/服务器环境需要自动化恢复⭐⭐⭐报错的本质是自动更新过程中的文件替换操作因权限不足或被中断而处于不完整状态,而不是 Claude Code 本身的功能缺陷。遇到问题先清理残留文件再重新安装,不要在损坏状态上反复尝试修复;

一键难忘的博客 1万+

Unity Shader-Command Buffer的使用(景深与描边效果重置版)

Command Buffer是Unity5新增的一个灰常灰常强大的功能。先祭出官方介绍和文档。我们在渲染的时候,给OpenGL或者DX的就是一系列的指令,比如glDrawElement,glClear等等,这些东西目前是引擎去调用的,而Unity也为我们封装了更高一级的API,也就是CommandBuffer,可以让我们更加方便灵活地实现一些效果。CommandBuffer最主要的功能是可以预定义一些列的渲染指令,然后将这些指令在我们想要的时机进行执行。本篇文章简单介绍一下CommandBuffer的使用,

puppet_master的专栏 4万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

How Chromium paint layer called

08-14 15:35:25.502 4959 5015 D Neo,/RenderLayer.cpp::paintLayer:1855: called 08-14 15:35:25.532 4959 5015 E chromium: #00 0x00d4ccc3 /system/lib/libwebviewxx.so WebCore::RenderLayer::paintLayer(...

Neo_Zhang888的博客 311

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Google-chrome启动出错的解决办法

【】ERROR:gles2_cmd_decoder.cc(5071)] Error: 5 for Command kResizeCHROMIUM遇到这个问题困扰一上午,试过重新安装deb包,删除重新安装的办法都行不通。无奈先记录在这里。

杜继恒的博客 2725

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android 改变RenderThread调度策略提高性能

一,通过设置绘画的RenderThread线程的调度策略来提高性能 默认情况下每个进程的绘画线程RenderThread的调度策略是SCHED_OTHER, 并且优先级为-10. 设置系统属性sys.use_fifo_ui为1后,则表示每个进程的绘画线程RenderThread的调度策略变更为SCHED_FIFO,并且实时优先级为1. 调度器 名称 解释 SCHED_OTHER 默认 标

pillarbuaa的专栏 4592

Android WebView简要介绍和学习计划

我们通常会在App的UI中嵌入WebView,用来实现某些功能的动态更新。在4.4版本之前,Android WebView基于WebKit实现。不过,在4.4版本之后,Android WebView就换成基于Chromium的实现了。基于Chromium实现,使得WebView可以更快更流畅地显示网页。本文接下来就介绍Android WebView基于Chromium的实现原理,以及制定学习计划。

老罗的Android之旅 7万+
上一篇: blink渲染知识14 - 阶段总结
下一篇: blink渲染知识16 - raster干了什么
csshell2002
博客等级 码龄11年 30粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值