游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4415|回复: 12

中文显示速度的问题

[复制链接]

1

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2006-8-18 18:37:00 | 显示全部楼层 |阅读模式
我用了IsDBCSLeadByte()和wglUseFontOutlines()函数做了中英文的混合显示,但是速度太慢了,字符少了还可以,但是有很多字符的时候那速度就很慢了,有哪位高手有更好的办法来作吗?

我的做法是循环字符串,然后判断是汉字还是英文,然后创建显示列表,最后调用显示列表。
我QQ:37328764
邮箱:xiehaifeng22@163.com
请高手们帮帮忙啊 [em24] [em24] [em24] [em24] [em24] [em24]

1

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2006-8-18 19:10:00 | 显示全部楼层

Re:中文显示速度的问题

为什么CAD的就那么快
它是怎么解决的?

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2006-8-19 11:18:00 | 显示全部楼层

Re:中文显示速度的问题

用缓冲区,第一次逐像素写到缓冲,以后的绘制就可以整块复制到屏幕

42

主题

137

帖子

137

积分

注册会员

Rank: 2

积分
137
发表于 2006-8-19 11:52:00 | 显示全部楼层

有理

.

0

主题

57

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2006-8-20 21:27:00 | 显示全部楼层

Re: Re:中文显示速度的问题

jk20012001: Re:中文显示速度的问题

用缓冲区,第一次逐像素写到缓冲,以后的绘制就可以整块复制到屏幕


如果再加上位图字体就更完美了,不过局限就是对动态类容的字符串很不合适.

1

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2006-8-21 11:55:00 | 显示全部楼层

Re:中文显示速度的问题

将它写到缓冲区后,如果缓冲区被清空了怎么办?因为我做的东西也是像CAD一样的
可以加很多个文字,况且我也是个GL的初学者。
听一些高手朋友提到用FTGL但是我英文太差了,不知道怎么用,不知道有没有谁能给我一个关于用FTGL输出文字的例子,只能发出源码就可以了,能加上注释的最好,先向好心人说声:"谢谢了。"

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2006-8-21 17:26:00 | 显示全部楼层

Re:中文显示速度的问题

清空了无所谓啊,用一个List保存缓冲区内目前有的char,如果被清空,就会重新绘制到缓冲区,这是内部管理的机制

5

主题

37

帖子

37

积分

注册会员

Rank: 2

积分
37
发表于 2006-8-24 10:03:00 | 显示全部楼层

Re: 中文显示速度的问题

用位图字体应该可以解决你的难题,我的程序里面一直用这个,挺好用。基本思想就是用Windows里的字体输出字符串到内存位图,然后再用用这个位图贴到你想要显示字符串的地方。
代码实例:
注意字体最好在2D模式下显示。用GLuOrtho2D 投影。
void CGLFont::print(float xPosition,  float yPosition,        //位置
                 float r, float g, float b,
                 const char* string)
{
        HBITMAP hbm;
        SIZE size;
glPushMatrix();
        glColor3f(r,g,b);  
        HDC MDC = ::CreateCompatibleDC(0);
               HFONT originFont=CreateFont(-10, 6,0,0,400,0,0,0,GB2312_CHARSET,0,0,0,FF_MODERN,"宋体");
        SelectObject(MDC,originFont);       
        ::GetTextExtentPoint32(MDC,(LPCSTR)string, strlen(string),&size);
        hbm=CreateBitmap(size.cx, size.cy, 1, 1, NULL);
        HBITMAP oldBmp=(HBITMAP)SelectObject(MDC,hbm);
        SetBkColor  (MDC, RGB(0,     0,   0));
        SetTextColor(MDC, RGB(255, 255, 255));
        TextOut(MDC, 0, 0, ,(LPCSTR)string, strlen(string));
        size.cx = (size.cx + 31) & (~31);
        int bufsize =size.cy * size.cx;
        struct {  BITMAPINFOHEADER bih;
        RGBQUAD col[2];
        }bic;
        BITMAPINFO *binf = (BITMAPINFO *)&bic;
        binf->bmiHeader.biSize     = sizeof(binf->bmiHeader);//
        binf->bmiHeader.biWidth    = size.cx;
        binf->bmiHeader.biHeight   = size.cy;
        binf->bmiHeader.biPlanes   = 1;   
        binf->bmiHeader.biBitCount = 1;
        binf->bmiHeader.biCompression = BI_RGB;
        binf->bmiHeader.biSizeImage   = bufsize;
        UCHAR* Bits = new UCHAR[bufsize];       
        ::GetDIBits(MDC,hbm,0,size.cy,Bits,binf,DIB_RGB_COLORS);

        glPixelStorei(GL_UNPACK_ALIGNMENT ,1);
        glRasterPos2f(xPosition,yPosition);
        glBitmap(size.cx,size.cy,0,0,0,0,Bits);
        deleteArray(Bits);   
        SelectObject(MDC, oldBmp);  
        :eleteDC(MDC);
        glColor3i(1,1,1);
        glPopMatrix();
        if(hbm) DeleteObject(hbm);
}

5

主题

37

帖子

37

积分

注册会员

Rank: 2

积分
37
发表于 2006-8-24 10:06:00 | 显示全部楼层

Re:中文显示速度的问题

其中deleteArray(),是我用的一个宏,用delete[] 代替就行。

1

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2006-8-24 21:14:00 | 显示全部楼层

Re:中文显示速度的问题

8楼的,谢谢你给我发源码,我的发开语言用的是C#,不过要是实现你的这段代码也没问题,最主要的是我这里要考虑到3维,不知道你写的这个行不行。

还有 jk20012001,谢谢你了
但是我不知道怎么样用缓冲区
我只知道有前后,左右缓冲。
不知道你的方法运用缓冲是怎么运用的
都怪我是个初学者,
你能不能发个用缓冲的源码在上边让我看看啊

如果实现不行的话,那我只好放弃GL
改用DX了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 06:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表