大家好:
现在在做一个图片显示的程序,实现拖动浏览地图。(地图已经被切成很多小块小块的方格了)。
当前的做法是每次拖动后,计算出当前需要显示的图片有哪几张(这个有自己的计算方法,用数据库来记录每张小图片的经纬度范围),然后去磁盘读取这几张图片加以显示。所以每次刷新都会进行一次图片文件的读取,严重影响程序的效率。
现在有人提议采用多线程来实现这个过程。一个线程用于预加载图片进入内存,另一个线程用于刷新的时候直接从内存而不是从文件读取图片信息进行显示。预加载的图片除了当前要显示的图片外,还包括了上下左右等边界的图片。
请问这个预加载怎么实现啊?加载进内存的这些图片怎么管理?我刷新的时候怎么去内存找(找文件的时候是根据路径)?关于那些图片满足显示条件。那些图片满足加载条件这个我自己能计算。
举例说明:
1.现有16张图片位置关系如下:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
2.我当前需要显示6图片,同时把1、2、3、5、7、9、10、11图片进行预加载。
3。向右移动图片后(假设刚好移动了一张图片),我需要显示7图片?怎么去内存中找?然后从新预加载4、8、12图片,卸载1、5、9图片。
谁做过相似的工作的请指教。
现在在做一个图片显示的程序,实现拖动浏览地图。(地图已经被切成很多小块小块的方格了)。
当前的做法是每次拖动后,计算出当前需要显示的图片有哪几张(这个有自己的计算方法,用数据库来记录每张小图片的经纬度范围),然后去磁盘读取这几张图片加以显示。所以每次刷新都会进行一次图片文件的读取,严重影响程序的效率。
现在有人提议采用多线程来实现这个过程。一个线程用于预加载图片进入内存,另一个线程用于刷新的时候直接从内存而不是从文件读取图片信息进行显示。预加载的图片除了当前要显示的图片外,还包括了上下左右等边界的图片。
请问这个预加载怎么实现啊?加载进内存的这些图片怎么管理?我刷新的时候怎么去内存找(找文件的时候是根据路径)?关于那些图片满足显示条件。那些图片满足加载条件这个我自己能计算。
举例说明:
1.现有16张图片位置关系如下:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
2.我当前需要显示6图片,同时把1、2、3、5、7、9、10、11图片进行预加载。
3。向右移动图片后(假设刚好移动了一张图片),我需要显示7图片?怎么去内存中找?然后从新预加载4、8、12图片,卸载1、5、9图片。
谁做过相似的工作的请指教。
typdef struct _MapItem
{
int nIndex;
HBITMAP hBitmap;
}MAPITEM;// 定义一个数组
MAPITEM arrMap[9];// 定义当前索引
int nCurIndex = -1;// 加载图片
void LoadBitmaps(int nCurIndex)
{
// 根据 nCurIndex 获得图片路径
....
// 加载文件到 arrMap[4] 并指定 index
....
// 获得 nCurInex 左上文件图片路径及Index
...
// 加载文件到 arrMap[0] 并指定 index
// 获得 nCurInex 中上文件图片路径及Index
...
// 加载文件到 arrMap[1] 并指定 index
...
/// 如此类推
}// 选择图片
HBITMAP NextBmp(int nDirection)
{
// nDirection 0: 左上 1:左中 如此类推
HBITMAP = arrMap[nDirection].hBitmap;
nCurIndex = arrMap[nDirection].nIndex;
// 这里可以转为多线程加载
LoadBitmaps(nCurIndex);
return HBITMAP;
}基于以上的思路就可以实现LZ的要求。
以上代码没有涉及资源释放
经过这两天的思考和尝试,大概思路和你说的差不多。只是还有一些问题不是很清楚。
1.怎么把各种图片的文件读入内存以位图句柄存储?我之前用的IImage接口读取的png或gif格式的图片,然后他有一个Draw函数直接就绘制在DC中了。中间没有可以获得的位图句柄。请问怎么比较方便的读取各种格式的图片以获得句柄?
2.用一个数组(或类似的东西,我想的是map,可以存其他图片信息)储存这些预加载的位图句柄,当需要更新的时候,只是更新其中需要更新的部分,并不是把满足的图片重新加载一遍,原来已经加载的就还保留,只加载新加入的,并删掉不用了的。请问这个怎么解决不较好?就是对这个预加载图片的管理