李锦俊(mybios)的blog

游戏开发 C++ Cocos2d-x OpenGL DirectX 数学 计算机图形学 SQL Server

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  86 Posts :: 0 Stories :: 370 Comments :: 0 Trackbacks

公告

QQ:30743734
EMain:mybios@qq.com

常用链接

留言簿(16)

我参与的团队

最新随笔

搜索

  •  

积分与排名

  • 积分 - 366593
  • 排名 - 67

最新评论

阅读排行榜

评论排行榜

前段时间看了很多很多的3D相关的基础书,感觉上学到了很多东西,但是不知道做什么好。后来,用DXUT做了两个小游戏,连连看和纸牌,虽然都是2D的,但是感觉上还是觉得自己进步了。

接下来的一段日子里,是时候继续学3D的东西了,于是萌生了个做游戏引擎的想法。我是个想做就做的人,虽然我也知道自己是不自量力,但是,只要我肯去做,即使做不好,也起码能学到东西啊,把学过的东西拿来用一番,就能有感觉了。

说说引擎部分的构建,引擎部分的FrameWork主要参考了GPG3的1.2那个框架模式,采用Unicode编译,感觉上那个模式比较好用,但是太复杂了点,于是我简化了他,基本上只保留了任务系统。使用平台无关的插件方式把Win32和Direct3D9的模块做了出来(当然只封装了一小部分函数),把Ogre的基础库全部拿来主义(哈哈,主要就是数学库、工具库等等)。而声音引擎也留了接口,很好扩展了。

然后,现在正在做GUI部分,主要还是说说GUI的渲染部分吧。GUI其中有两个我认为比较关键的地方,其一是渲染文字部分,其二是渲染窗口部分。下面说说我的做法
文字渲染部分:
我的做法是使用FreeType2读取TTF文件,然后当要渲染文字的时候,看哪个用到的文字就load哪个文字,先获得这个文字的大小,然后在贴图中找到一个空闲的区域(我的贴图大小是512×512,也可以设置),然后blt到贴图中,真正渲染的时候就把这个贴图纹理坐标贴到两个三角形上就完成了一个文字的渲染了。
在贴图中找空闲区域我有个比较特别的做法,就是每个需要渲染的文字维护一个RefCount引用计数,例如一个屏幕里10个“我”字,那么“我”的引用计数就是10,当“我”字不需要再渲染的时候(引用计数为0),此文字的贴图区域就可以被其他文字所覆盖。
窗口渲染部分:

class GAMECORE_EXPORT GUIRenderCache
{
protected:
    
// 不允许显式创建,只可以继承
    GUIRenderCache(void);
public:
    
virtual ~GUIRenderCache(void);

    
// 添加到渲染队列
    void AddCache(const GUIRenderQuad& quad)
    
{
        m_vtGUIRenderQuad.insert(GUIRenderQuadPtr(
new GUIRenderQuad(quad)));
    }



    
// 渲染需要Cache队列
    void RenderCache(void)
    
{
        
// 从新Cache队列
        if(m_bDirty)
        
{
            ClearCacheList();
            DoCache();
            m_bDirty 
= false;
        }

        
// 添加到渲染器
        for(VectorGUIRenderQuad::const_iterator iter = m_vtGUIRenderQuad.begin() ; iter != m_vtGUIRenderQuad.end() ; iter ++)
        
{
            Systems::GetSingleton().GetGUIRendererSystem()
->AddCache(*iter);
        }

    }

    
// 清空cache队列
    void ClearCacheList(void)
    
{
        m_vtGUIRenderQuad.clear();
    }

protected:

    
// Cache需要渲染的项目
    virtual void DoCache(){};

    VectorGUIRenderQuad m_vtGUIRenderQuad;    
// 渲染队列
    bool m_bDirty; // 需要重新Cache需要渲染的项目
}
;



每个Window(一个Window是一个抽象类,Static/Button/Dialog等等所有窗口都是继承于Window)都继承于GUIRenderCache对象,当窗口的某个属性(如WindowText)改变时,就会把m_bDirty标记设置成true。每帧渲染的时候调用RenderCache。那么如果窗口的属性没有改变,就只需要把m_vtGUIRenderQuad的东西渲染出来;如果属性改变了(即m_bDirty为true),则调用DoCache,由继承类(如Static/Button等)改写这个函数,计算贴图坐标、三角形坐标等等东西都放在这个函数里。总的来说,Cache之后速度会比Cache之前快起码一半以上。

好了,睡觉去了。
posted on 2006-12-19 21:30 李锦俊(mybios) 阅读(4846) 评论(10)  编辑 收藏 引用 所属分类: 3D引擎开发

Feedback

# re: 这段时间开发3D引擎啊,正在做GUI部分 2006-12-20 02:00 P.Dragon
偶正在学习游戏编程,可以交个朋友吗??
偶的blog. http://www.tws8.net  回复  更多评论
  

# re: 这段时间开发3D引擎啊,正在做GUI部分 2006-12-20 12:12 LOGOS
支持,慢慢来,能写些东西总比我什么都不写的好  回复  更多评论
  

# re: 这段时间开发3D引擎啊,正在做GUI部分 2006-12-21 00:27 李锦俊
To LOGOS:
谢谢支持。
写点东西只是为了笔记一下,以后自己看着也可以一笑置之。呵呵


TO P.Dragon:
你的Blog不错,收藏了,呵呵
可以加我
QQ:30743734
MSN:Mybios@hotmail.com
EMain:mybios@21cn.com  回复  更多评论
  

# re: 这段时间开发3D引擎啊,正在做GUI部分 2006-12-22 09:33 HAOIW
我现在也在学习编程
可以交个朋友吗??
我的QQ 490082378
邮箱 haoiw@126.com  回复  更多评论
  

# re: 这段时间开发3D引擎啊,正在做GUI部分 2006-12-22 15:30 小山日志
偶也在学游戏编程,现期是看看2D的,在写“潜艇大战”^_^  回复  更多评论
  

# re: 这段时间开发3D引擎啊,正在做GUI部分 2006-12-22 20:30 李锦俊
@小山日志
祝你成功:)  回复  更多评论
  

# re: 这段时间开发3D引擎啊,正在做GUI部分 2007-03-05 19:10 csdn.wuyazhe(我的宝贝叫阿刺)
不错。交流一下,QQ:32610303  回复  更多评论
  

# re: 这段时间开发3D引擎啊,正在做GUI部分 2007-10-16 17:41 littlewater
这么一说估计做一个LIST就比较方便了嘛……
我以前也做了一个简单的窗口机制,不过做到一半没有继续了……
  回复  更多评论
  

# re: 这段时间开发3D引擎啊,正在做GUI部分 2008-01-04 09:52 小七
你好 我也是在研究3D的gui部分,很喜欢做游戏,希望以后大家一起研究,QQ354257900  回复  更多评论
  

# re: 这段时间开发3D引擎啊,正在做GUI部分 2008-02-01 16:27 tanglehua
很高兴看到这篇文章,受益良多.本人也想做游戏方面的开发,这是我的邮箱tlhad@126.com,可以多交流一下.  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理