注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

为着理想勇敢前进

 
 
 

日志

 
 

资源的内存管理及多线程预读之我的实现  

2007-05-12 05:58:45|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
看到云风的blog谈这个话题(http://blog.codingnow.com/2007/05/mutilthread_preload.html),正好我以前也刚好做过同样的工作,我谈谈我实现这个是怎么做的吧。

刚开始是把资源放到std::map里面。渲染的时候根据一个字符串来查找,如果没找到就让这个资源先空着,比如一个模型没找到就先画一个空包围盒,一个纹理没加载就先按散色光颜色来画。而资源管理的模块就去异步的加载用到的资源。主线程会在两次渲染之间的时候去删掉长期不用的资源。
这里说要在两次渲染之间的时候删掉不用资源,其实也可以看成是给主线程post一个消息,主线程在消息处理里面删资源,因为主线程处理消息的时候是在两帧渲染之间。
当然更通用的结构是渲染也用timer做,但是当时那个项目之前的代码没有那么做,而是把渲染放到PeekMessage而又Peek不到消息的处理里面。这种做法是对FPS的控制很糟糕,有的时候FPS高了是浪费CPU。

很快就发现std::map太慢了,改用非标准的hash_map至稍微快了一点,还是很慢。于是就把资源标示保留下来,在启动的时候把所有的资源的标示都加载到内存,这一点和云风的想法有异曲同工之处,这样,每一帧渲染的时候只需要从资源标示的结构里面看一个内存指针是否为NULL就知道一个资源是否已经加载。

其实异步的加载,是另外后台跑一个线程用完成端口来进行重叠IO的,不过这个对主逻辑是透明的,所有代码没有一个锁。嘿嘿。

说所有代码没有一个锁也是经过了一些磨难的,最早的时候线程间有一处地方需要向加载资源的线程查询一些状态,对资源加载线程用了一个send去查询。后来把这些状态转移到了资源标示那个结构里面,主线程就可以自己在内存里面查,相反,资源加载进程需要更新是否加载的状态才需要post把资源传给主线程。这样所有线程间通讯都是post,零共享数据。爽。

  评论这张
 
阅读(706)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018