=========================
更新:经过几天的谷歌搜索和实验,我找到了大多数这些愚蠢问题的答案.查看我提交的答案.
=========
Android Window的责任是什么?
以下是一些问题:
编辑:添加更多问题:
各种类的职责是什么,例如Window,View,Canvas,Surface以及它们如何相互协作?
通常一个Activity有多少个窗口?
3.一个活动中的所有视图都将附加到Window吗?附加是什么意思?
每个窗口都有表面?每个画布都有表面?
View负责focus/keyEvent/manager,而Cavus只负责"绘图"操作.
WindowManager负责Window堆叠?这与SurfaceFlinger有什么关系?
View不拥有Surface,视图包含的Window拥有?
使用canvas通过调用surface.lockCanvas()得到View.
何时调用onDraw(Canvas)?如何以及谁传递画布参数?
Canvas有尺寸吗?Window的表面总是全屏吗?
再次编辑:
看完Romain Guy http://www.youtube.com/watch?v=duefsFTJXzc&feature=feedwll&list=WL提供的精彩演示后,几个问题得到解决并添加了几个问题:)
据我了解,DirectFB为多种图形卡提供硬件加速.此外,它比X11更小,更快,占用的内存更少.为什么呢,它不是比现在更主流吗?
这是我真正不确定的:普通的GTK +/Qt程序需要移植到它吗?在DirectFB网站上,有一个将Firefox移植到它的项目.如果GTK +能够直接使用DirectFB,为什么这甚至是必要的呢?我(可能错误地)理解它的方式是Firefox应该输出到GTK +,它应该输出到DirectFB,它应该输出到硬件.如果我错了,请纠正我.
谢谢,
哈桑
我正在尝试为嵌入式平台开发GUI应用程序,没有任何窗口,我正在使用DirectFB,这非常适合我的需求.
由于我开发的嵌入式功能并不强大,我真的想尝试在我自己的Ubuntu桌面上进行开发.问题是Framebuffer与X.org冲突导致我离开整个桌面,并关闭X.org只是为了查看我的更改结果.
有一个适合我需要的好的帧缓冲模拟器吗?Qt有一个名为QVFb,但它只适用于开发Qt应用程序,而DirectFB的VNC后端总是崩溃.
那么,有什么想法吗?
我正在研究基于Linux的嵌入式系统.它使用Qt进行窗口化,没有Xserver.我的目标是拍摄屏幕截图.
我尝试过使用FBgrab.它失败了,因为我没有,/dev/fb0
因为内核中没有启用帧缓冲区.我们正在运行基于Qt的应用程序以在屏幕上显示UI(HDMI).我也在QT网站上尝试了使用QPixmap和抓取窗口的屏幕截图应用程序.这也是一个失败,因为我无法在系统中运行两个QAppliction,因为它会影响显示.
有没有其他方法来拍摄屏幕?
我有一个使用 GLUT 开发的小型 OpenGL 应用程序。在没有 X-Server 的情况下,使用 OpenGL 直接渲染到 Linux 帧缓冲区 (fbdev) 的最佳选择是什么?我知道 GLUT 需要 X,所以我不是在寻找在没有 X 的情况下使用 GLUT 的方法。
我打算使用的帧缓冲设备已确认与fbi
和一起使用mplayer
。
我已经完成(或者我认为我已经完成了)一项非常详尽的研究,并找到了一些可能有用的资源和库。但大部分信息都有些过时,我不确定该相信什么。
因此,虽然很多 SO 答案都提到 DirectFB 和 Mesa 作为解决方案,但我无法让自己对这些选项充满信心,因为可以找到的材料很少。
所以,如果你能在这里指出我正确的方向,给我任何例子,我将不胜感激。我错过了什么?
由于问题被标记为重复而进行编辑:
相关问题的答案建议使用 DRM。我打算在尚不支持主线 Linux 内核的基于 Allwinner H3 的嵌入式计算机上运行我的代码。目前,它在内核版本 3.14 上运行,我认为它不支持 DRM。
那么,有没有其他选择?
我需要一种非常快速的方式来显示屏幕上的数据缓冲区.我首先尝试访问linux framebuffer,事实证明这是非常好的.然后我了解了directFB,我喜欢它提供的额外功能(如快速memcpy,动态调整图像大小,不需要额外的代码等).但后来我遇到了麻烦 - 所有的例子都是从文件中加载的图像.据我所知,它的'DataBuffer'类型没有示例/教程.在查看了文档和源代码之后,我设法编译了这样的东西:
DFBSurfaceDescription sdsc;
DFBDataBufferDescription ddsc;
DFBDataBufferDescriptionFlags ddscf = (DFBDataBufferDescriptionFlags)DBDESC_MEMORY;
IDirectFBDataBuffer *dbuffer;
IDirectFBImageProvider *provider;
ddsc.flags = ddscf;
ddsc.file = NULL;
ddsc.memory.data = m_z;
ddsc.memory.length = 640*480;
DFBCHECK (DirectFBInit (&argc, &argv));
DFBCHECK (DirectFBCreate (&dfb));
DFBCHECK (dfb->SetCooperativeLevel (dfb, DFSCL_FULLSCREEN));
sdsc.flags = DSDESC_CAPS;
sdsc.caps = (DFBSurfaceCapabilities)(DSCAPS_PRIMARY | DSCAPS_FLIPPING);
DFBCHECK (dfb->CreateSurface( dfb, &sdsc, &primary ));
DFBCHECK (primary->GetSize (primary, &screen_width, &screen_height));
DFBCHECK (dfb->CreateDataBuffer(dfb, &ddsc, &dbuffer));
DFBCHECK (dbuffer->CreateImageProvider(dbuffer, &provider));
DFBCHECK (provider->GetSurfaceDescription (provider, &sdsc));
DFBCHECK (dfb->CreateSurface( dfb, &sdsc, &fbwindow ));
DFBCHECK (provider->RenderTo (provider, fbwindow, NULL)); …
Run Code Online (Sandbox Code Playgroud) 我正在尝试为directfb教程添加一个包.我按照http://wiki.openwrt.org/doc/devel/packages中的说明进行操作.目前包已成功下载到dl文件夹,甚至在build目录中编译,但是当我将install部分添加到makefile时,我得到了依赖性错误:
Package directfb_tutorials is missing dependencies for the following libraries:
libdirect-1.4.so.0
libdirectfb-1.4.so.0
libfusion-1.4.so.0
libpthread.so.0
Run Code Online (Sandbox Code Playgroud)
包Makefile(我把它放在package/utils/directfb_tutorials /下):
include $(TOPDIR)/rules.mk
PKG_NAME:=DFBTutorials
PKG_VERSION:=0.5.0
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=http://www.directfb.org/downloads/Extras/
PKG_MD5SUM:=13e443a64bddd68835b574045d9025e9
PKG_LICENSE:=LGPLv2.1
PKG_LICENSE_FILES:=COPYING
PKG_FIXUP:=autoreconf
PKG_INSTALL:=1
include $(INCLUDE_DIR)/package.mk
define Package/directfb_tutorials
TITLE:=directfb_tutorials
SECTION:=utils
CATEGORY:=Utilities
URL:=http://directfb.org
DEPENDS:=+libdirectfb
endef
define Package/directfb_tutorials/description
DirectFB Tutorials
endef
define Build/Configure
$(call Build/Configure/Default,)
endef
define Package/directfb_tutorials/Build/Compile
$(MAKE) -C $(PKG_BUILD_DIR)
endef
define Package/directfb_tutorials/install
$(INSTALL_DIR) $(1)/bin/dfb_tutorials
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/image/image $(1)/bin/dfb_tutorials/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/simple/simple $(1)/bin/dfb_tutorials/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/keybuffer/keybuffer $(1)/bin/dfb_tutorials/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/text/text $(1)/bin/dfb_tutorials/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/sprite/sprite $(1)/bin/dfb_tutorials/
endef
$(eval $(call BuildPackage,directfb_tutorials))
Run Code Online (Sandbox Code Playgroud)
将+ …
我正在尝试安装 GTK-DFB,并且需要 cairo。当我尝试从源代码构建它时,它抛出:
checking for cairo's PNG functions feature...
configure: WARNING: Could not find libpng in the pkg-config search path
checking whether cairo's PNG functions feature could be enabled... no
configure: error: recommended PNG functions feature could not be enabled
Run Code Online (Sandbox Code Playgroud)
想法?
谢谢
我的颜色值有六位,红色,绿色和蓝色各有两位.所以黑色表示为二进制000000
,红色110000
,蓝色000011
,黄色111100
等.
我必须将此颜色转换为24位rgb值,以将其传递给图形层(DirectFB).由于三个(二进制11)将变为255(0xFF),我使用以下公式,其中85(= 255/3)作为转换因子.
r = (color_6bit >> 4) * FACTOR;
g = ((color_6bit >> 2) & 0x3) * FACTOR;
b = (color_6bit & 0x3) * FACTOR;
color_32bit = (r << 16)| (g << 8) | b;
Run Code Online (Sandbox Code Playgroud)
这样可以正确转换颜色(白色[0x3F - > 0xFFFFFF],红色[0x30 - > 0xFF0000]等).
现在,这些颜色是要在电视上显示的字幕的文本和背景颜色,我们有测试流,其中嵌入了视频中的参考调色板.当我将使用此公式获得的八位颜色绘制到屏幕上时,它与视频中存在的参考颜色不完全匹配 - 它相当接近,但存在差异.
我是否正确进行转换或是否有任何标准算法将两位rgb颜色值转换为八位rgb值?DirectFB可以在内部使用一些不同的表示(如RGB565)吗?
对于它的价值,当因子85被替换为48(通过反复试验找到的值)时,颜色几乎完全匹配.