┌────────┐说明: 1. 左边的<<大边框>>是<<图形数据>>
│ │ 2. 左边的<<小边框>>是<<屏幕当前显示区域>>
│ │ 3. <<屏幕当前显示区域>>可以在<<大边框>>内自由的活动
│ │ 4. 得到<<屏幕当前显示区域>>的<<图形数据>>是需要大量时间来计算
│ ┌───┐ │ 5. 当<<屏幕当前显示区域>>被显示过以后就叫<<显示过的区域>>
│ │ │ │目的: 求一个思路能够满足:
│ │ │ │ 最大可能的利用<<显示过的区域>>减少冗余计算(实在太占用CPU了)
│ │ │ │
│ └───┘ │
│ │ 各位高手帮忙给我个思路。
└────────┘
│ │ 2. 左边的<<小边框>>是<<屏幕当前显示区域>>
│ │ 3. <<屏幕当前显示区域>>可以在<<大边框>>内自由的活动
│ │ 4. 得到<<屏幕当前显示区域>>的<<图形数据>>是需要大量时间来计算
│ ┌───┐ │ 5. 当<<屏幕当前显示区域>>被显示过以后就叫<<显示过的区域>>
│ │ │ │目的: 求一个思路能够满足:
│ │ │ │ 最大可能的利用<<显示过的区域>>减少冗余计算(实在太占用CPU了)
│ │ │ │
│ └───┘ │
│ │ 各位高手帮忙给我个思路。
└────────┘
这个区域不是个规则矩形阿!
请教!
你用这样的代码就可以解决
void CXXView::OnDraw(CDC* pDC)
{
CRect rcClient;
GetClientRect(&rcClient);
if (m_bBitmap)
{
//画你想要画的
m_bBitmap = FALSE;
}
pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(),
&m_MemDC, 0, 0, SRCCOPY);
}
m_MemDC是成员变量在OnSize里创建,或者OnCreate(如果大小不改变)
void CXXView::OnSize(UINT nType, int cx, int cy)
{
if (IsWindow(m_hWnd))
{
if (m_MemDC.GetSafeHdc())
m_MemDC.DeleteDC();
if (m_Bitmap.GetSafeHandle())
m_Bitmap.DeleteObject();
CDC* pDC = GetDC();
m_MemDC.CreateCompatibleDC(pDC);
m_Bitmap.CreateCompatibleBitmap(pDC, cx, cy);
m_MemDC.SelectObject(&m_Bitmap);
}
CView::OnSize(nType, cx, cy);
}
如果是FALSE 那么着新出现的数据我就没有绘制出来 显然不行
如果是TURE 那么我需要重画多大的区域呢? 如果全部重画那么我牺牲了太多的CPU时间(特殊:本工程处理数据量实在大 本工程使用在PPC下CPU时间宝贵) 如果部分重画那么又回到了我的难点!这个区域是个不规则矩形怎么办?
我已经采用的双缓冲了 可就是不知道怎么去精确维护。
我也想一次性计算好 8过实在是计算量有点大阿!
基本上<<图形数据>>需要大约3分钟的时间计算。对于一个实时的系统来说让用户等待3分钟
-_-!!
认为处理图形数据和绘制应该是两个独立的过程,不要因为显示去处理图形数据我的意见是:
不错!过程是互相独立的! 可是出现这种<<问题>>呢?
<<问题>> = 用户可以自由的使用<<屏幕当前显示区域>>来浏览<<图形数据>>
我无法预先知道用户下一步会看到什么位置!也就是说<<图形数据>>这块内容的是否需要计算取决于用户把<<屏幕当前显示区域>>移动到那个位置。
认为用多线程,一边处理一边更新试试我的意见是:
多线程只是手段,还是避免不了要去判断 那些区域显示过了不要去计算 那些区域还未显示需要去计算的问题。
认为用多线程,一边处理一边更新试试我的意见是:
多线程只是手段,还是避免不了要去判断 那些区域显示过了不要去计算 那些区域还未显示需要去计算的问题。======================================
可以程序一起来就用后台线程去计算,尝试所有内容都计算好。或者可以让线程优先计算当前要显示的内容?如果当前要显示的已经计算过,可以直接显示。另:存储的时候就放计算好的内容可不可以 ?
2.建立一个 <<已显示过的矩形链表类>> 来记录所有现实过的矩形数据处理办法是:
当 <<屏幕当前显示区域>> 位置发生改变的时候 立刻通过<<已显示过的矩形链表类>> 中的纪录计算出一个最小的需要重画的区域。那么重画该区域并添加到<<已显示过的矩形链表类>> 中。并刷新<<缓冲位图类>>
认为:可以程序一起来就用后台线程去计算,尝试所有内容都计算好。或者可以让线程优先计算当前要显示的内容?如果当前要显示的已经计算过,可以直接显示。另:存储的时候就放计算好的内容可不可以 ?我的意见:
1)一起来就计算,尝试所有内容都计算好.
这点可能性不大 因为不是PC机上使用 是PDA上用的(1.计算量>>ARM的计算力 2.耗电 3.影响别的程序运行)
2)或者可以让线程优先计算当前要显示的内容?
这是十分必要的 我现在就在确定这个问题的解决办法。
3)如果当前要显示的已经计算过,可以直接显示。
就是这个意思,难度在于判断那些显示过 那些没有显示过
另:存储的时候就放计算好的内容可不可以 ?
我存储的数据是图形数据 不是位图 无法直接显示的 而且还要支持缩放 再缩放的时候图形数据必须重新计算的
2.建立一个 <<已显示过的矩形链表类>> 来记录所有现实过的矩形数据应该是2.建立一个 <<已显示过的矩形链表类>> 来记录所有现实过的矩形尺寸数据
CreateRectRgn/CombineRgn将每次处理的图形组成一个大的区域,这样你每次只要用PtInRegion
判断一下边界点是不是在已处理RGN之内就可以了。你的需求有点像内存池技术,可以参考一下相关资料,重申一下不建议把每次的处理区域弄得大小,这样用户的感觉反而慢
如何区分已处理和未处理的图形建议你用区域RGN
CreateRectRgn/CombineRgn将每次处理的图形组成一个大的区域,这样你每次只要用PtInRegion
判断一下边界点是不是在已处理RGN之内就可以了我的意见:
很有点意思 明天我做下 再来和你聊
看半天不明白是不是我理解错了,不就是设置一个剪切区域吗?怎么设置内?
“这样你的显示过的矩形链表类会非常碎“无论是
.建立一个 <<已显示过的矩形链表类>> 来记录所有现实过的矩形数据还是建立一个 <<已显示过的矩形链表类>> 来记录所有现实过的矩形尺寸数据。下一次用户要求显示的区域,在链表中很难找到一个正好匹配,即使是差一个pixel.