核心逻辑起点:控制反转与平台无关性在探讨具体的nativeWindow使用场景之前,我们必须建立一个共识:Angular不仅仅是一个运行在浏览器里的Web框架,它是一个平台无关的(PlatformAgnostic WindowRef.nativeWindow的本质,是依赖注入(DependencyInjection)思想的体现。我们将“获取全局上下文”这个行为,封装成一个可被注入的服务。这正是解耦的第一步。 正确的WindowRef做法:通过注入WindowRef,我们可以安全地访问`nativeWindow`。更重要的是,我们可以在服务内部检查当前平台。 逻辑推演与解决方案:通过WindowRef获取`nativeWindow`,我们可以利用RxJS的操作符来控制这种混沌。 我们将`nativeWindow`视为一个数据源(SourceofTruth),通过RxJS的管道将其转化为可控的、平滑的数据流。
Window本身又不对外开放nativeWindow的owner属性,或者说NativeWindow一旦new了之后就无法修改owner属性。 所以今天尝试用NativeWindow和NativeWindowInitOptions来自己做一个窗口。 因为NativeWindow好像没有布局啊,onFocus之类的处理。 又继续找,找到了一个外国佬封装的ExtendedNativeWindow,原理就是针对出错的原因(缺少_systemManager: WindowedSystemManager),自己封装一个给nativeWindow
这里介绍如何使用Drawing绘制内容,然后通过NativeWindow贴图到XComponent的双缓冲实现。 更具体一点来说:先通过Drawing方法将要绘制的所有的图形绘制到一个Bitmap上也就是先在内存空间完成,然后获取位图的像素地址、并将其拷贝到XComponent的NativeWindow地址。 // 通过 OH_NativeWindow_NativeWindowRequestBuffer 获取 OHNativeWindowBuffer 实例int32_t ret = OH_NativeWindow_NativeWindowRequestBuffer (nativeWindow_, &buffer_, &fenceFd_);2.通过 OH_NativeWindow_GetBufferHandleFromNative 获取bufferHandle。 OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow_, buffer_, fenceFd_, region);6.释放内存// 去掉内存映射int
利用 Java 层 SurfaceView 传下来的 Surface 对象,获取 ANativeWindow m_NativeWindow = ANativeWindow_fromSurface(env 设置渲染区域和输入格式 ANativeWindow_setBuffersGeometry(m_NativeWindow, m_VideoWidth, 渲染 ANativeWindow_Buffer m_NativeWindowBuffer; //锁定当前 Window ,获取屏幕缓冲区 Buffer 的指针 ANativeWindow_lock(m_NativeWindow m_FrameBuffer + i * srcLineSize, srcLineSize); } //解锁当前 Window ,渲染缓冲区数据 ANativeWindow_unlockAndPost(m_NativeWindow 释放 ANativeWindow if(m_NativeWindow) ANativeWindow_release(m_NativeWindow); 以上就是 FFmpeg + ANativeWindow
利用 Java 层 SurfaceView 传下来的 Surface 对象,获取 ANativeWindow m_NativeWindow = ANativeWindow_fromSurface(env 设置渲染区域和输入格式 ANativeWindow_setBuffersGeometry(m_NativeWindow, m_VideoWidth, 渲染 ANativeWindow_Buffer m_NativeWindowBuffer; //锁定当前 Window ,获取屏幕缓冲区 Buffer 的指针 ANativeWindow_lock(m_NativeWindow m_FrameBuffer + i * srcLineSize, srcLineSize); } //解锁当前 Window ,渲染缓冲区数据 ANativeWindow_unlockAndPost(m_NativeWindow 释放 ANativeWindow if(m_NativeWindow) ANativeWindow_release(m_NativeWindow); 以上就是 FFmpeg + ANativeWindow
创建EGL环境 Surface转NativeWindow,构建EGLSurface 设置FBO 渲染图片纹理 创建EGL环境 获取EGLDisplay,EGLDisplay实际上是底层显示设备的OpenGL eglGetError()); Release(); return Error::OPENGL_CREATE_CONTEXT_ERROR; } return 0; } Surface转NativeWindow ,构建EGLSurface 可以在主线程中将Surface转为NativeWindow 在EGL线程中通过NativeWindow构建EGLSurface,这个EGLSurface非离屏,可以实现渲染的
-----window init start----------------------------------- // 获取native window ANativeWindow *nativeWindow videoHeight = pCodecCtx->height; // 设置native window的buffer大小,可自动拉伸 ANativeWindow_setBuffersGeometry(nativeWindow pCodecCtx, pFrame) == 0) { // lock native window buffer ANativeWindow_lock(nativeWindow dstStride, src + h * srcStride, srcStride); } ANativeWindow_unlockAndPost(nativeWindow av_frame_free(&pFrame); av_free(pFrame); } } ANativeWindow_release(nativeWindow
private function showTopHandler():void { if (this.stage.nativeWindow.alwaysInFront ) { this.stage.nativeWindow.alwaysInFront=false; showTopBtn.label="前端显示"; } else { this.stage.nativeWindow.alwaysInFront
1.2 NativeWindow,操作系统实现,Android中有Framebuffer和Surface。 Framebuffer对应的就是屏幕 1.2.2 Surface对应的就是Window,一个Activity 一个Dialog 一个Toast 其实都是对应一个Window 1.3 EGL,OpenGL ES和NativeWindow
."); return -1; // Could not open codec } // 获取native window ANativeWindow *nativeWindow videoHeight = pCodecCtx->height; // 设置native window的buffer大小,可自动拉伸 ANativeWindow_setBuffersGeometry(nativeWindow (frameFinished) { // lock native window buffer ANativeWindow_lock(nativeWindow dstStride, src + h * srcStride, srcStride); } ANativeWindow_unlockAndPost(nativeWindow
应用的窗口的 X11 窗口指针,如此即可调用 X11 平台相关逻辑对 UNO 窗口执行一些交互 本文以下的方法需要用到反射 通过阅读 UNO 的源代码,可以看到 Window 类型里面放入了不公开的 NativeWindow 反射的代码如下 var type = MainWindow.GetType(); var nativeWindowPropertyInfo = type.GetProperty("NativeWindow
AppWindow appWindow = nativeWindow.GetAppWindow()! ; }); }); private static void MainWindowCreated(MauiWinUIWindow nativeWindow ; // 扩展标题栏,要自定义标题栏颜色,必须 true nativeWindow.ExtendsContentIntoTitleBar = true activationState); window.Title = Constants.Name; 如果要获取原生的 Window 句柄,可以使用: var nativeWindow (nativeWindow); PInvoke.User32.ShowWindow(windowHandle, PInvoke.User32.WindowShowStyle.SW_MINIMIZE
AppWindow appWindow = nativeWindow.GetAppWindow()! ; }); }); private static void MainWindowCreated(MauiWinUIWindow nativeWindow ; // 扩展标题栏,要自定义标题栏颜色,必须 true nativeWindow.ExtendsContentIntoTitleBar = true activationState); window.Title = Constants.Name; 如果要获取原生的 Window 句柄,可以使用: var nativeWindow (nativeWindow); PInvoke.User32.ShowWindow(windowHandle, PInvoke.User32.WindowShowStyle.SW_MINIMIZE
void frameAvailable() { mCameraTexture.updateTexImage(); draw(); } 通过上面的步骤,就将 OpenGL ES 、EGL、NativeWindow 并最终调用 EGL14.eglSwapBuffers(mEGLDisplay, eglSurface); 将 EGLSurface中的内容输出到 NativeWindow,最终显示出来。
1、重载NativeWindow,加入组件的方式。发现很多控件加不进去~~失败 2、一直处理orderToFrontOf(Main),但子窗口会一直闪烁。
--调用nativeWindow的dequeueBuffer申请绘制内存,获取一个Fence--> if (nativeWindow->dequeueBuffer(nativeWindow, & ->queueBuffer(nativeWindow, buffer, -1); buffer = 0; // dequeue a new buffer int fenceFd // buffer换buffer if (nativeWindow->dequeueBuffer(nativeWindow, &buffer, &fenceFd) == NO_ERROR) { 而对于硬件真机,一般需要处理Fence,其egl_window_surface_v2_t::swapBuffers()应该会被重写,至少需要传递一个有效的Fence过去, nativeWindow ->queueBuffer(nativeWindow, buffer, fenceId(不应该再是-1)); 也就是说,queueBuffer的fenceid不能再是-1了,因为需要一个有效的Fence
const char *name; } SDL_Class; static SDL_Class g_class = { .name = "EGL", }; static SDL_Class g_nativewindow_class = mallocz(sizeof(IJK_EGL_Opaque)); | | | |--vout->opaque_class = &g_nativewindow_class android_surface); |--SDL_VoutAndroid_SetNativeWindow(vout, native_window); //Ijksdl_vout_android_nativewindow.c
callBackOnDraw(callBackOnDraw); eglThread->setRenderModule(RENDER_MODULE_MANUAL); ANativeWindow *nativeWindow = ANativeWindow_fromSurface(env, surface); eglThread->onSurfaceCreate(nativeWindow); } extern "
Renderer的创建是根据SDL_VoutOverlay来的,在查找SDL_VoutOverlay从哪里来的,一路可以搜索到ijkmedia/ijksdl/android/ijksdl_vout_android_nativewindow.c ; } SDL_VoutOverlay的创建和SDL_Vout有关,再查找SDL_Vout的来源,可以找到 ijkmedia/ijksdl/android/ijksdl_vout_android_nativewindow.c opaque->egl) goto fail; vout->opaque_class = &g_nativewindow_class; vout->create_overlay func_onDrawFrame=overlay->func_onDrawFrame; return renderer; } ijksdl\android\ijksdl_vout_android_nativewindow.c
2025 年 5 月 21 日 三、关键 Bug 修复与优化 (一)内存管理与性能优化 修复内存泄露问题:解决了先执行 DetachFlutterEngine 后执行 OnSurfaceDestroy 时,NativeWindow