小编hwe*_*eom的帖子

如何在Diesel中为自定义字段类型实现Queryable和Insertable?

我有一个我希望通过Diesel使用的SQL表:

CREATE TABLE records (
    id BIGSERIAL PRIMARY KEY,
    record_type SMALLINT NOT NULL,
    value DECIMAL(10, 10) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

该表生成以下模式:

table! {
    records (id) {
        id -> Int8,
        record_type -> Int2,
        value -> Numeric,
    }
}
Run Code Online (Sandbox Code Playgroud)

Diesel将小数字输出为bigdecimal::BigDecimal,但我想decimal::d128改为使用.我也想映射record_type到枚举,所以我声明我的模型如下:

use decimal::d128;

pub enum RecordType {
    A,
    B,
}

pub struct Record {
    pub id: i64,
    pub record_type: RecordType,
    pub value: d128,
}
Run Code Online (Sandbox Code Playgroud)

我不能使用#derive(Queryable, Insertable)因为非标准类型映射,所以我尝试自己实现这些特征:

impl Queryable<records::SqlType, Pg> for Record {
    type Row = (i64, …
Run Code Online (Sandbox Code Playgroud)

rust rust-diesel

14
推荐指数
2
解决办法
1754
查看次数

高效的Direct2D多线程

我正在为Windows Store编写电子书阅读器应用程序.我正在使用Direct2D + DXGI交换链在屏幕上呈现书页.

我的书内容有时非常复杂(几何,位图,蒙版等),因此渲染它可能需要100毫秒.所以我试图在单独的线程中对位图进行离屏渲染,然后在主线程中显示这个位图.

但是,我无法想象如何有效地做到这一点.

到目前为止,我尝试了两种方法:

  1. 使用ID2D1Factory带有D2D1_FACTORY_TYPE_MULTI_THREADED标志的单个标志,ID2D1BitmapRenderTarget在后台线程中创建并使用它以进行屏幕外渲染.(这另外需要ID2D1Multithread::Enter/LeaveIDXGISwapChain::Present操作).问题是,ID2D1RenderTarget::EndDraw后台线程中的操作有时需要长达100毫秒,并且由于内部Direct2D锁定,主线程渲染在此期间被阻止.

  2. ID2D1Factory在后台线程中使用单独的(如http://www.sdknews.com/ios/using-direct2d-for-server-side-rendering中所述)并关闭内部Direct2D同步.在这种情况下,两个线程之间没有交叉锁定.不幸的是,在这种情况下,我不能ID2D1Factory直接在main中使用结果位图,因为它属于不同的工厂.我必须将位图数据移动到CPU内存,然后将其复制到主内存的GPU内存中ID2D1Factory.这个操作也引入了显着的滞后(我认为这是由于大量的内存访问,但我不确定).

有没有办法有效地做到这一点?

PS此处的所有时间均为Acer Switch 10平板电脑.在常规的Core i7 PC上,两种方法都可以在没有任何明显滞后的情

multithreading direct2d

7
推荐指数
1
解决办法
1205
查看次数

标签 统计

direct2d ×1

multithreading ×1

rust ×1

rust-diesel ×1