热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DirectFB编程

一、简介DirectFB是一个轻量级的提供硬件图形加速,输入设备处理和抽象的图形库,它集成了支持半透明的视窗系统以及在LinuxFramebuffer驱动之上的多层显示。它是一个用

一、简介

DirectFB是一个轻量级的提供硬件图形加速,输入设备处理和抽象的图形库,它集成了支持半透明的视窗系统以及在LinuxFramebuffer驱动之上的多层显示。它是一个用软件封装当前硬件无法支持的图形算法来完成硬件加速的层。DirectFB是为嵌入式系统而设计。它是以最小的资源开销来实现最高的硬件加速性能。

 

DirectFB的组成

1、基本库函数

这部分代码在lib目录下,它分为三个部分:

direct: 里面是一些公共函数,其中包括哈希表、链表、线程、调试信息、signal处理、优化过的memcpy和平台相关的一些函数。 
fusion:它有两个版本,一个是针对单进程的,要求所有应用程序在一个进程中运行,这相对来说比较简单。另外一个是针对多进程的,应用程序可以在多个进程中运行。它实现了一些进程间通信机   制,其中包括互斥、共享内存、共享内存中的vector实现、带引用计数的内核对象和reactor等。多进程版本还需要一个内核模块linux-fusion的支持。 
voodoo: 不清楚(若那位高手知道,请补充一下,谢谢)。

2、对第三方组件库的包装

这部分代码在interfaces目录下。Interfaces可能会引起别人的误解,因为它并不是DFB对外提供的接口,而是把第三方组件纳入DFB的接口。它包括三类:

字体:字体有点阵字体和矢量字体之分,矢量字体又有诸如truetype之类几种格式。前者可能比较简单,而后者的处理相当复杂,要借助如freetype等第三方程序库来实现。
     DFB定义了IDirectFBFont接口来处理字体,在第三方字体程序库上加上一个adapter就可以在DFB中使用了。 
图片:图片格式的种类很多,像BMP之类的位图处理可能比较简单,而像JPG和PNG等的图片,采用了高级的压缩技术,解压算法比较复杂,通常需要第三方程序库的支持。
     DFB定义了IDirectFBImageProvider接口来处理图片,在第三方图片程序库上加上一个adapter就可以在DFB中使用了。 
视频:视频格式更多,解压算法也更复杂,自然也要借助第三方库来实现。
     DFB定义了IDirectFBVideoProvider接口来处理视频,在第三方视频程序库上加上一个adapter就可以在DFB中使用了。

3、核心代码

这部分代码在src目录下。它可以分为两大类:
核心组件。DFB的core由多个部分组成,每个部分称为一个core_part,都实现同一个接口CorePart。这个接口并不描述它们的功能,而是用于管理的。初看这些函数时,可能会感到有些奇怪。最好要先了解DFB采用的master/slave模型:第一个运行应用程序是master进程,后来运行的应用程序是slave进程。master进程负责初始化和~初始化arena,它只能在所有slave退出之后才能退出。而slave进程则可以随时加入arena,也可以随时退出arena。

核心组件包括下面几个组件:

dfb_core_clipboard: 剪切板。 
dfb_core_colorhash:调色板。 
dfb_core_gfxcard:图形卡,主要完成基本的绘图功能,如绘直线、填充等等。 
dfb_core_input:输入设备。 
dfb_core_layers:分层功能,好像要硬件支持,通常都只有一个层。 
dfb_core_screens:逻辑屏幕(可能像X一样支持多个屏幕吧,不太清楚,有时间再研究)。 
dfb_core_system:显示输出,把gfxcard绘制后的图形数据输出到屏幕上,即可以通过fbdev输出到本机屏幕上,也可以通过sdl/x11/vnc输出到远程主机的屏幕上。对于像sdl/x11等,也包括对输入事件的处理。 
dfb_core_wm:窗口管理器。
以上这些core_part,有的是直接实现的,比如clipboard。有的只是一层包装,具体的实现在一个独立的共享库中,在运行时通过参数来控制加载具体的实现,如system。

对外接口。这主要是给上层应用程序使用的。其中包括

IDirectFBInputDevice: 输入设备 
IDirectFBScreen: 屏幕。 
IDirectFBSurface: 绘图表面。 
IDirectFBPalette: 调色板。 
IDirectFBFont: 字体 
IDirectFBImageProvider:图片 
IDirectFBVideoProvider:视频 
IDirectFBWindow:窗口 
DirectFBEventBuffer: 事件缓冲

4、窗口管理器

这部分代码在wm目录下。DFB实现了两个窗口管理器。

default:实现了基本的窗口管理功能,支持一些快捷键。 
unique:功能也很弱,不过架构还可以,加入自己的功能很方便。

5、 输入设备

这部分代码在inputdrivers目录下。其实这些代码并不是真正的驱动,只是一个adapter层,它把从linux设备文件读到的事件,转换成DFB自己的事件格式,然后调用dfb_input_dispatch把事件分发出去。

6、输出设备

这部分代码在system目录下。这也是一个adapter层,主要对显示设备的抽象,有的也包括对输入事件的处理。其中包括:

fbdev: 输出到frame buffer。 
osx:   输出到mac os上。 
vnc:  输出到Virtual Network Computing(类似于微软远程桌面的一个协议)。 
x11:  输出到X Window上,在0.9.24仍然有问题,建议使用SDL。 
sdl:  输出到Simple DirectMedia Layer。

 

DirectFB中的重要术语

1、Blitting
Blitting是在拷贝图像数据的进程中所引用。举一个最简单的例子就是当两个Surface有相同的大,颜色深度和像素格式时Blitting其中一个Surface到另一个Surface。在这个过程中内存只被复制而没有被处理(就像复制其他任何类型的数据一样)。alpha通道的传输,或者从一种像素格式到另一种像素格式的传输。许多图形显卡包含了一个硬件Blitting来完成多种格式的传输。

2、Surface
Surface是内存中一个图像以一种具体的像素格式被保存的一块保留区域。一个Surface可以位于视频和/或系统内存中。可以在一个Surface上进行画图操作或者把一个Surface Blitting到另一个。(见1.21节)
在全屏模式下时,屏幕中的可视区表示为”主Surface”,所以可以直接在屏幕的可视区完成图形操作。
每个Surface都可以选择双缓冲,图形操作将首先在辅助缓冲区中执行然后在Flip()被调用之后变得合法。在许多情况下建议在主Surface中使用双缓冲来防止闪烁。

3、SubSurface
SubSurface使用和正规Surface相同的接口。它代表父类Surface的一个部分并且没有为自己分配任何系统或视频存储空间。

4、Layer
依靠于图形硬件可以有一个或者多个显示层。一个标准的PC显卡只有一个层,但是,就像机顶盒就可能支持2个或更多的层。不同的层在显存中占据着不同的区域,通常通过alpha混合来组合,这由显示硬件自动完成。如果最底层的内容发生了改变将不会被重绘,上一层的内容保持不变。今天,许多PC显卡也支持额外的可以缩放可以从YUV转为RGB的层(视频层)。这个层不能进行颜色混合和设置成保持完全的不透明。variosDirectFB图形驱动支持视频层。

5、Window / Windowstack
通常一个层的surface的内容受控于集成的窗体系统,这意味着属于这个层的窗体在一个可配置的背景上。每个窗体有它自己的一个surface,这个surface 被窗体系统用来生成构成重叠窗体的图像。

6、reactor模式
DFB中的消息,无论是进程内的,还是进程间的,都是通过reactor来传递的。这是一种简单的发布-订阅机制,谁关心谁就注册。不先弄清楚reactor的机制,很容易就被消息的流向搞糊涂了。

7、加锁术语。加锁/解锁动作常用lock/unlook、acquire/release、 wait/release等术语,而DFB里使用skirmish_prevail/skirmish_dismiss。

8、引用计数术语。增加/减少引用计数常用ref/unref、addref/release等术语。DFB里使用了ref/unref,同时增加了几个动作:link/unlink用于增加和减少全局引用计数,ref增加的计数,只要应用程序退出,fusion自动释放这个引用计数。而link增加的引用计数非要用unlink减少才行,应用程序退出时不会自动减少。inherit: 继承另外一个对象的引用计数,即把被继承的对象的引用计数加到继承者身来,不但如此,当被继承的对象的引用计数增减时,自动增减继承者的引用计数。

9、注册/注销术语。注册/注销常用register/unregister等术语,DFB使用了attach/detatch。

10、内核对象的宏。DFB用宏FUSION_OBJECT_METHODS去实现一个fusion 11、object的子类,FUSION_OBJECT_METHODS是在object.h里定义的。像CoreWindow和CoreSurface等内核对象,都调用这个宏去实现自己的方法。

12、CorePart的宏。DFB用宏DFB_CORE_PART去实现一个core part,DFB_CORE_PART是在core_parts.h定义的。

13、动态模块的加载。DFB并不要求动态加载模块实现特定的接口函数,而当模块被加载时(dlopen时),把自己安装到框架中。模块使用了gcc的__attribute__((constructor))扩展,模块被加载时,该函数自动执行,然后调用direct_modules_register注册自己。

14、cardstate:我开始被blit函数弄糊涂了,并不像WIN32下那样要求指明源和目标。后来才知道它是调用另外的函数去设置源和目标,而不是通过参数来指定。

   

 

二、编译与安装

1、资源下载

需下载如下资源

DirectFB:DirectFB-1.6.1.tar.gz,
Fusion:   linux-fusion-8.10.2.tar.gz 
Example:  DirectFB-examples-1.6.0.tar.gz

DirectFB 提供3种形式的下载方式: git, cvs 和压缩包。

地址:http://directfb.org/
或  :git clone git://git.directfb.org/git/directfb/core/DirectFB.git
     git clone git://git.directfb.org/git/directfb/core/linux-fusion.git

 

2、编译和安装Fusion

# tar zxf linux-fusion-8.10.2.tar.gz
# cd linux-fusion-8.10.2
# make
# make install

注意:

1) Run 'make' and 'make install'. It builds and installs the module
   for the running kernel version as reported by 'uname -r'.
   If you want to build for another kernel, edit the Makefile.

2) Either run 'modprobe fusion' manually or add "fusion" to "/etc/modules".

3) Create the fusion device(s) if not using devfs or udev:

        mkdir /dev/fusion
        mknod /dev/fusion/0 c 250 0

        ...if you need more than one session

        mknod /dev/fusion/1 c 250 1
        mknod /dev/fusion/2 c 250 2

        ...and so on (currently limited to eight sessions)

4) Add udev rules to /etc/udev/rules.d/40-fusion.rules if using udev:

        KERNEL=="fusion[0-9]*", NAME="fusion/%n", GROUP="video", MODE="0660"

        ...customize to suit your needs

 

3、编译和安装DirectFB

# tar zxf DirectFB-1.6.1.tar.gz
# cd DirectFB-1.6.1
# ./configure --enable-x11 --enable-multi --enable-debug --enable-trace
# make
# make install

 

注意:为使pkg-config能够找到DirectFB,需要添加寻索路径:/usr/local/lib/,有两种方式

 

方式1:

首先执行:vi /etc/ld.so.conf.d/qt-i386.conf ,并添加如下内容

/usr/local/lib/

然后执行:

ldconfig

 

方式2:

首先执行:

cd DirectFB-1.6.1
find . -name "*.pc"

然后将搜索出的“*.pc”文件copy至目录/usr/lib/pkgconfig,执行:

DirectFB编程

 

4、编译和安装Example

# tar -zxvf DirectFB-examples-1.6.0.tar.gz
# cd DirectFB-examples-1.6.0
# ./configure --enable-debug
# make
# make install

 

 

三、运行示例

# depmod -a
# modprobe fusion # 安装 fusion 内核模块
# cd /usr/local/bin
# ./df_window

报错如下:

~~~~~~~~~~~~~~~~~~~~~~~~~~| DirectFB 1.6.1 |~~~~~~~~~~~~~~~~~~~~~~~~~~
        (c) 2001-2012  The world wide DirectFB Open Source Community
        (c) 2000-2004  Convergence (integrated media) GmbH
      ----------------------------------------------------------------

(*) DirectFB/Core: Multi Application Core. (2015-03-22 11:51) [ DEBUG ][ TRACE ]
(*) Fusion/SHM: Using MADV_REMOVE (2.6.32.0 >= 2.6.19.2)
(*) Direct/Thread: Started 'Fusion Dispatch' (-1) [MESSAGING OTHER/OTHER 0/0] <10485760>...
(*) Direct/Thread: Started 'Fusion Deferred' (-1) [MESSAGING OTHER/OTHER 0/0] <10485760>...
(!) Direct/Util: Opening '/dev/fb0' failed!
    --> The requested operation or an argument is (currently) not supported
(-) [ 3047: -STACK- ]
  #0  0x00e431c3 in direct_try_open () from /usr/local/lib/libdirect-1.6.so.0 [0xe19000]
  #1  0x0044aa61 in dfb_fbdev_open () from /usr/local/lib/directfb-1.6-0/systems/libdirectfb_fbdev.so [0x447000]
  #2  0x0044b2e7 in system_initialize () from /usr/local/lib/directfb-1.6-0/systems/libdirectfb_fbdev.so [0x447000]
  #3  0x007a6178 in dfb_system_core_initialize () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #4  0x00737d5c in dfb_core_part_initialize () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #5  0x00734987 in dfb_core_initialize () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #6  0x006f41aa in DirectFB::ICore_Real::Initialize() () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #7  0x006f106e in CoreDFB_Initialize () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #8  0x007351ea in dfb_core_arena_initialize () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #9  0x0072e303 in dfb_core_create () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #10 0x006efb00 in DirectFBCreate () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]

(!) DirectFB/FBDev: Error opening framebuffer device!
(-) [ 3047: -STACK- ]
  #0  0x0044aa61 in dfb_fbdev_open () from /usr/local/lib/directfb-1.6-0/systems/libdirectfb_fbdev.so [0x447000]
  #1  0x0044b2e7 in system_initialize () from /usr/local/lib/directfb-1.6-0/systems/libdirectfb_fbdev.so [0x447000]
  #2  0x007a6178 in dfb_system_core_initialize () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #3  0x00737d5c in dfb_core_part_initialize () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #4  0x00734987 in dfb_core_initialize () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #5  0x006f41aa in DirectFB::ICore_Real::Initialize() () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #6  0x006f106e in CoreDFB_Initialize () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #7  0x007351ea in dfb_core_arena_initialize () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #8  0x0072e303 in dfb_core_create () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #9  0x006efb00 in DirectFBCreate () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]

(!) DirectFB/FBDev: Use 'fbdev' option or set FRAMEBUFFER environment variable.
(-) [ 3047: -STACK- ]
  #0  0x0044aa61 in dfb_fbdev_open () from /usr/local/lib/directfb-1.6-0/systems/libdirectfb_fbdev.so [0x447000]
  #1  0x0044b2e7 in system_initialize () from /usr/local/lib/directfb-1.6-0/systems/libdirectfb_fbdev.so [0x447000]
  #2  0x007a6178 in dfb_system_core_initialize () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #3  0x00737d5c in dfb_core_part_initialize () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #4  0x00734987 in dfb_core_initialize () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #5  0x006f41aa in DirectFB::ICore_Real::Initialize() () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #6  0x006f106e in CoreDFB_Initialize () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #7  0x007351ea in dfb_core_arena_initialize () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #8  0x0072e303 in dfb_core_create () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #9  0x006efb00 in DirectFBCreate () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]

(!) DirectFB/Core: Could not initialize 'system_core' core!
    --> A general initialization error occured
(-) [ 3047: -STACK- ]
  #0  0x00737d5c in dfb_core_part_initialize () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #1  0x00734987 in dfb_core_initialize () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #2  0x006f41aa in DirectFB::ICore_Real::Initialize() () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #3  0x006f106e in CoreDFB_Initialize () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #4  0x007351ea in dfb_core_arena_initialize () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #5  0x0072e303 in dfb_core_create () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]
  #6  0x006efb00 in DirectFBCreate () from /usr/local/lib/libdirectfb-1.6.so.0 [0x6bd000]

df_window.c <136>:
    (#) DirectFBError [DirectFBCreate( &dfb )]: A general initialization error occured

解决方法:

执行:vi /etc/grub.conf

修改
kernel /vmlinuz-2.6.15-1.2054_FC5 ro root=LABEL=/ rhgb quiet

为:
kernel /vmlinuz-2.6.15-1.2054_FC5 ro root=LABEL=/ rhgb quiet vga= 788

再次运行:

# ./df_window

效果如下

DirectFB编程

DirectFB编程

 

 

四、编程

程序1:在屏幕中间画一条水平直线

//draw_line.c
#include 
#include 
#include 

//这是最上层的接口,所有的函数入口均由它(IDirectFB)而来
static IDirectFB *dfb = NULL;

//主平面,也就是“屏幕”了。在交互层使用DFSCL_FULLSCREEN,它是主层平面。
static IDirectFBSurface *primary = NULL;

//这里存储主平面的高和宽,从而为其它的操作提供支持
static int screen_width = 0;
static int screen_height = 0;

//用以检测错误的宏定义,用来检测大部分的函数的返回是否正常。只适合用在小的测试程序
#define DFBCHECK(x...)                                               \
{                                                                    \
     DFBResult err = x;                                              \
     if (err != DFB_OK)                                              \
     {                                                               \
           fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ );    \
           DirectFBErrorFatal( #x, err );                            \
     }                                                               \
}


int main (int argc, char **argv)
{
    //为了创建一个平面,需要定义一个平面描述子(surface description)
    DFBSurfaceDescription dsc;

    //初始化
    DFBCHECK (DirectFBInit (&argc, &argv));
    DFBCHECK (DirectFBCreate (&dfb));
    DFBCHECK (dfb->SetCooperativeLevel (dfb, DFSCL_FULLSCREEN));

    //设定dsc的一些属性,现在可以不用关心
    dsc.flags = DSDESC_CAPS;
    dsc.caps = DSCAPS_PRIMARY | DSCAPS_FLIPPING;

    //使用我们设定的dsc创建主平面(primary)
    DFBCHECK (dfb->CreateSurface( dfb, &dsc, &primary ));

    //得到主平面的宽与高
    DFBCHECK (primary->GetSize (primary, &screen_width, &screen_height));

    //通过画一个和主平面同等大小的矩形来清空主平面;默认颜色为黑色
    DFBCHECK (primary->FillRectangle (primary, 0, 0, screen_width, screen_height));

    //为了能显示画出来的线,先设置一下线的颜色,线的位置在屏幕的中间
    DFBCHECK (primary->SetColor (primary, 0x80, 0x80, 0xff, 0xff));
    DFBCHECK (primary->DrawLine (primary,0, screen_height / 2,screen_width - 1, screen_height / 2));

    //显示
    DFBCHECK (primary->Flip (primary, NULL, 0));

    //等待5秒后,程序自动退出
    sleep(5);
    primary->Release( primary );
    dfb->Release( dfb );
    return 23;
}

编译

gcc -L/usr/local/lib -I/usr/local/include/directfb -ldirectfb -lpthread draw_line.c -o draw_line

运行

DirectFB编程

 

程序2:移动鼠标绘制线条

#include 
#include 

static IDirectFB                *dfb = NULL;
static IDirectFBDisplayLayer    *layer = NULL;
static IDirectFBSurface            *surface = NULL;
static IDirectFBEventBuffer        *events = NULL;

static int screen_width = 0;
static int screen_height = 0;

int main(int argc, char *argv[])
{
    int pitch;
    int i,j;
    int quit = 0;
    int x = 0, y = 0, old_x = 0, old_y = 0;

    DirectFBInit(&argc, &argv);
    DirectFBCreate(&dfb);

    dfb->GetDisplayLayer(dfb, DLID_PRIMARY, &layer);
    dfb->CreateInputEventBuffer(dfb, DICAPS_ALL, DFB_TRUE, &events);
    layer->SetCooperativeLevel(layer, DLSCL_EXCLUSIVE);
    layer->GetSurface(layer, &surface);

    surface->GetSize(surface, &screen_width, &screen_height);

    surface->SetColor(surface, 0, 56, 0 , 0xff);
    surface->FillRectangle(surface, 0, 0, screen_width, screen_height);

    while(!quit)
    {
        DFBEvent    evt;
        events->WaitForEvent(events);    //等待事件

        while(!quit && events->GetEvent(events, &evt) == DFB_OK)
        {
            if(evt.clazz == DFEC_INPUT)
            {
                switch(evt.input.type)
                {
                case    DIET_KEYPRESS: //响应键盘事件
                    if(evt.input.key_symbol == DIKS_ESCAPE) //退出程序
                    {
                        quit = 1;
                    }
                    else     if(evt.input.key_symbol == DIKS_SMALL_C)  //清屏
                    {
                        surface->SetColor(surface, 0, 56, 0 , 0xff);//设置当前色
                        surface->FillRectangle(surface, 0, 0, screen_width, screen_height);
                    }
                    break;

                case    DIET_AXISMOTION:
                    if(evt.input.flags & DIEF_AXISREL)
                    {
                        switch(evt.input.axis)
                        {
                        case DIAI_X:
                            x+=evt.input.axisrel;
                            break;
                        case DIAI_Y:
                            y+=evt.input.axisrel;
                            break;
                        default :
                            break;
                        }//switch(evt.input.axis){

                        if(x <0)
                        {
                            x = 0;
                        }
                        if(y <0)
                        {
                            y = 0;
                        }
                    }

                    surface->SetColor(surface, 0, 0xff, 0, 0xff);
                    surface->DrawLine(surface, old_x, old_y, x, y);
                    old_x = x;
                    old_y = y;
                    break;

                default:
                    break;
                }//switch
            }//if
        }//while(!quit && events->GetEvent(events, &evt) == DFB_OK){
    }//while(!quit){

    surface->Release(surface);
    layer->Release(layer);
    dfb->Release(dfb);

    return 0;
}

编译

gcc -L/usr/local/lib -I/usr/local/include/directfb -ldirectfb -lpthread DynamicLine.c -o DynamicLine

运行

DirectFB编程


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 1.RoIPoolingRoIPooling顾名思义对Roi进行Pooling操作,主要用于目标检测任务。RoI(Regionofinterest&# ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
author-avatar
-啊-亮---_252_980
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有