目前,我将以下一种方式绘制图像:
在加载过程中,使用WIC获取原始位图,并将其作为属性存储在对象中,表示图像( property).
imageScaled.
ID2D1Bitmap *imageScaled property).
当已经创建的图像对象需要调整大小时,我重复步骤2-6。在结果中,在呈现循环中,我只需绘制imageScaled。
目前,我正在考虑删除2-6个步骤,每次都使用呈现循环中每个图像对象传递的imageOriginal绘制缩放效果。
我不知道Direct2d Scale效应到底起了什么作用。如果它每次都做一些类似于步骤2-6的事情,那么,我可能不需要这样做了。
另一方面,在我的呈现循环中,对于超出父视图的对象有基本的跳过算法,因此它们根本不被绘制。在当前的实现中,我可能需要等待可能超出视图的预缩放对象的时间,并且它们目前不会被绘制。通过在渲染循环中实现Scale效应,该问题将得到解决。
有人知道哪种解决方案最快吗?
发布于 2022-09-12 16:50:06
在重写代码之后,目前看来,在呈现循环中使用Scale对于单个图像来说更快。
在此之前,当调用表示UI的对象的setImage方法时,会发生类似的情况:
void ImageObject::setImage(const wchar_t *path)
{
if(!wcscmp(this->path, path))
return;
SafeRelease(&this->originalImage);
// Load original image via WIC
this->scaledImage = RescaleImage(this->originalImage, this->width, this->height);
}在主渲染循环中:
void ImageObject::Render()
// render loop iterates through ImageObject objects array and calls each object's Render method
{
// skip is cached variable simply equals
// (this->x > this->parent->width || this->y > this->parent->height || etc)
if(skip)
return;
renderTarget->DrawBitmap(this->originalImage, rectangle);
}现在是这样的:
void ImageObject::setImage(const wchar_t *path)
{
if(!wcscmp(this->path, path))
return;
SafeRelease(&this->originalImage);
// Obtain originalImage and that's it
}
void ImageObject::Render()
{
if(skip)
return;
globalScale->SetInput(0, this->originalImage);
globalScale->SetValue(D2D1_SCALE_PROP_SCALE, ...);
renderTarget->DrawImage(globalScale, point);
}第一个方法实际上应该更快,因为在呈现中,我只需要绘制简单的位图。
正如我在这篇文章中所写的,我认为第二种方法在大量图像的情况下应该工作得更快,当部分图像脱离屏幕时,但是目前,用这种方法绘制一幅图像比用图像预标度方法绘制一幅图像要快。
https://stackoverflow.com/questions/73637360
复制相似问题