VSCode+PlantUML插件繪製軟件時序圖demo

注:

以下參考源碼未使用第三方庫, 例如: plantuml-style-c4等.

本文僅針對時序圖, 其他圖形, 參考官方的文檔即可.

Good Luck~

 

推薦的基本環境:

VScode + PlantUML插件,

 

Tips:

* 源碼文件名應爲***.puml

* 實時預覽使用快捷鍵: Alt+D

* 到處png使用: Ctrl+Shift+P, 然後選擇: "PlantUML: Export current digram" -> "png"即可

* 符號補全也推薦使用Tabnine插件

 

參考資料:

時序圖相關: https://plantuml.com/zh/sequence-diagram

皮膚參數相關: https://plantuml-documentation.readthedocs.io/en/latest/formatting/all-skin-params.html

 

PlantUML的尺寸限制問題:

PlantUML對輸出的圖像大小有限制, 會導致很大的圖不能以稍高的DPI完整輸出, 這個問題需要在VScode的Settings.json裏簡單配置一下:

"plantuml.commandArgs": [
         "-DPLANTUML_LIMIT_SIZE=81920"
],

範例:

源碼:

@startuml MediaPlayer

hide footbox
skinparam {
    ' defaultFontName Abyssinica SIL
    Shadowing false  
    backgroundColor white
    NoteFontColor #OrangeRed
    NoteFontSize 16
    NoteTextAlignment left
    NoteBackgroundColor WhiteSmoke
    NoteColor transparent
    NoteBorderThickness 0
    NoteBorderColor transparent
    NoteBorderThickness 0
    NoteShadowing false
    ParticipantPadding 0
    BoxPadding 20
    dpi 96

    ClassBackgroundColor transparent
    ClassHeaderBackgroundColor lightgreen
    ClassStereotypeFontColor transparent

    SequenceBoxBordercolor sienna
    SequenceBoxFontSize 48
    SequenceBoxFontColor Black
    SequenceBoxBackgroundColor WhiteSmoke
    SequenceLifeLineBackgroundColor WhiteSmoke
    SequenceMessageAlignment center
    SequenceGroupHeaderFontColor White
    SequenceGroupHeaderFontSize 20
    SequenceGroupBackgroundColor DarkOliveGreen
    SequenceGroupBodyBackgroundColor transparent
    SequenceGroupBorderThickness 4
    SequenceGroupBorderColor DarkOliveGreen
    ' transparent
    sequence {
        ParticipantBackgroundColor WhiteSmoke
        ParticipantBorderColor Gray
        ParticipantFontStyle Bold
        ParticipantFontSize 12
        ParticipantPadding 0

        LifeLineBorderColor DimGray
        ArrowColor Black
        ArrowThickness 0.8
        ColorArrowSeparationSpace 30
    }
}

participant AudioTrack

participant AudioSystem

box AudioPolicy
participant AudioPolicyService
participant AudioPolicyManager
participant SwAudioOutputDescriptor
participant AudioPolicyClient
participant AudioPolicyConfig
participant "Output\nDeviceDescriptor" as DeviceDescriptor
' participant "Input\nDeviceDescriptor" as IDeviceDescriptor
participant HwModule
participant OutputProfile

participant InputProfile
participant AudioProfile
end box

box AudioFlinger
participant AudioFlinger
participant AudioHwDevice
participant AudioStreamOut
end box

box PlaybackThread
participant MixerThread
participant Track
participant TrackHandle
end box

box Audio HAL
participant DevicesFactoryHalLocal
participant DeviceHalLocal
participant hw_module_t
participant audio_hw_device_t
end box

AudioPolicyService-[#Blue]->AudioPolicyService:<color blue>**onFirstRef()**</color>

create AudioPolicyClient
AudioPolicyService-->AudioPolicyClient:new
AudioPolicyService-->AudioPolicyManager:new
activate AudioPolicyManager
AudioPolicyClient-->o AudioPolicyManager:**mpClientInterface**

group Load AudioPolicy Config
create AudioPolicyConfig
AudioPolicyManager-->AudioPolicyConfig:new

AudioPolicyManager->AudioPolicyConfig:setDefault()
activate AudioPolicyConfig
create DeviceDescriptor
AudioPolicyConfig-->DeviceDescriptor:new
note right:AUDIO_DEVICE_OUT_SPEAKER
DeviceDescriptor-->o AudioPolicyConfig:**mDefaultOutputDevices**
DeviceDescriptor-->o AudioPolicyConfig:**mAvailableOutputDevices.add()**

create IDeviceDescriptor
AudioPolicyConfig-->IDeviceDescriptor:new
note left:AUDIO_DEVICE_IN_BUILTIN_MIC
IDeviceDescriptor-->o AudioPolicyConfig:**mAvailableInputDevices.add()**

create HwModule
AudioPolicyConfig-->HwModule:new
note right:"primary"

group OutputProfile
create OutputProfile
AudioPolicyConfig-->OutputProfile:new & attach()
note right:"primary"
HwModule-->o OutputProfile:**mModule**
create AudioProfile
AudioPolicyConfig-->AudioProfile:new & addAudioProfile()
note right:AUDIO_FORMAT_PCM_16_BIT\nAUDIO_CHANNEL_OUT_STEREO\n44100
' AudioPolicyConfig->OutputProfile:addAudioProfile()
AudioProfile-->o OutputProfile:**mProfiles**
AudioPolicyConfig->OutputProfile:addSupportedDevice()
DeviceDescriptor-->o OutputProfile:**mSupportedDevices**
note right:AUDIO_DEVICE_OUT_SPEAKER
OutputProfile-->o HwModule:**mOutputProfiles**
end group

end group
deactivate AudioPolicyConfig

HwModule-->o AudioPolicyManager:**mHwModules**




AudioPolicyManager->AudioPolicyClient:loadHwModule()
create AudioFlinger
AudioPolicyClient->AudioFlinger:loadHwModule()
group loadHwModule
activate AudioFlinger
AudioFlinger->AudioFlinger:loadHwModule_l()
activate AudioFlinger

create DevicesFactoryHalLocal

AudioFlinger->DevicesFactoryHalLocal:openDevice()
activate DevicesFactoryHalLocal
DevicesFactoryHalLocal->DevicesFactoryHalLocal:load_audio_interface()
activate DevicesFactoryHalLocal
DevicesFactoryHalLocal->DevicesFactoryHalLocal:hw_get_module_by_class()

create hw_module_t
DevicesFactoryHalLocal-->hw_module_t:new
DevicesFactoryHalLocal->DevicesFactoryHalLocal:audio_hw_device_open()
DevicesFactoryHalLocal->hw_module_t:open()
deactivate DevicesFactoryHalLocal
create audio_hw_device_t
hw_module_t-->audio_hw_device_t:new
create DeviceHalLocal
DevicesFactoryHalLocal-->DeviceHalLocal:new
audio_hw_device_t-->o DeviceHalLocal:**mDev**
deactivate DevicesFactoryHalLocal

create AudioHwDevice
AudioFlinger-->AudioHwDevice:new
DeviceHalLocal-->o AudioHwDevice:**mHwDevice**
AudioHwDevice-->o AudioFlinger:<font size=24><color red>**mAudioHwDevs.add(handle:0xCBA)**</color></font>
end group

AudioFlinger-->AudioPolicyManager:return
deactivate AudioFlinger
deactivate AudioFlinger


group by AudioPolicyManger
HwModule-->o OutputProfile:mPort
AudioHwDevice-->o HwModule:mHandle
note over HwModule:<font size=24><color red>**mHandle:0xCBA**</color></font>
end group

create SwAudioOutputDescriptor
AudioPolicyManager-->SwAudioOutputDescriptor:new
OutputProfile-->o SwAudioOutputDescriptor:mProfile

AudioPolicyManager->OutputProfile:getModuleHandle()
OutputProfile-->AudioPolicyManager:<font size=24><color red>**mModule->mHandle:0xCBA**</color></font>

AudioPolicyManager->AudioPolicyClient:openOutput()
AudioPolicyClient->AudioFlinger:openOutput()
group openOutput
activate AudioFlinger
AudioFlinger->AudioFlinger:openOutput_l()
activate AudioFlinger
AudioFlinger->AudioFlinger:<font size=24><color red>**findSuitableHwDev_l(module:0xCBA)**</color></font>
note over AudioFlinger:
activate AudioFlinger
AudioFlinger-->AudioHwDevice:ret
deactivate AudioFlinger
AudioFlinger->AudioHwDevice:openOutputStream()

create AudioStreamOut
AudioHwDevice-->AudioStreamOut:new
AudioHwDevice-->o AudioStreamOut:**audioHwDev**
AudioHwDevice->AudioStreamOut:open()
activate AudioStreamOut
AudioStreamOut->AudioHwDevice:hwDevice()
AudioHwDevice-->DeviceHalLocal:ret
note left:mHwDevice
AudioStreamOut->DeviceHalLocal:openOutputStream()
deactivate AudioStreamOut
DeviceHalLocal->audio_hw_device_t:open_output_stream()
create MixerThread
AudioFlinger-->MixerThread:new
AudioStreamOut-->o MixerThread:**mOutput**

MixerThread-->o AudioFlinger:<color blue><font size=24>**mPlaybackThreads.add(output:0xABC, )**</font></color>
end group

AudioFlinger-->AudioPolicyManager:<color blue><font size=24>**output:0xABC**</font></color>
deactivate AudioFlinger
deactivate AudioFlinger

AudioPolicyManager->AudioPolicyManager:addOutput()
SwAudioOutputDescriptor-->o AudioPolicyManager:<font size=24><color blue>**mOutputs.add(output:0xABC)**</color></font>

deactivate AudioPolicyManager

-->AudioTrack:new
activate AudioTrack
AudioTrack->AudioTrack:set()
activate AudioTrack
create AudioSystem
AudioTrack->AudioSystem:newAudioUniqueId()
AudioSystem->AudioFlinger:newAudioUniqueId()
activate AudioFlinger
AudioFlinger->AudioFlinger:nextUniqueId()
activate AudioFlinger
deactivate AudioFlinger
deactivate AudioFlinger

AudioTrack->AudioTrack:createTrack_l()
activate AudioTrack

group Get Output For Attr
AudioTrack->AudioSystem:getOutputForAttr()
AudioSystem-->AudioPolicyService:getOutputForAttr()
AudioPolicyService->AudioPolicyManager:getOutputForAttr()
activate AudioPolicyManager

AudioPolicyManager->AudioPolicyManager:getOutputForDevice()
activate AudioPolicyManager
AudioPolicyManager->AudioPolicyManager:getProfileForDirectOutput()
activate AudioPolicyManager
AudioPolicyManager-->HwModule:SEARCH
HwModule-->OutputProfile:\
<font size=24><color green>**MATCH&RETURN(**</color></font>\
<font size=24><color blue>**0xABC**</color></font>\
<font size=24><color green>**)**</color></font>

AudioPolicyManager-->AudioPolicyService:return
deactivate AudioPolicyManager
deactivate AudioPolicyManager
deactivate AudioPolicyManager
AudioPolicyService-->AudioSystem:return
AudioSystem-->AudioTrack:return

end group

AudioTrack->AudioFlinger:<color blue><font size=24>**createTrack(output:0xABC)**</font></color>
activate AudioFlinger

group Create Track
AudioFlinger->AudioFlinger:checkPlaybackThread_l()
note over AudioFlinger:<color blue><font size=24>**mPlaybackThreads.valueFor(output:0xABC)**</font></color>

AudioFlinger->MixerThread:createTrack_l()
create Track
MixerThread-->Track:new
MixerThread-->o Track:**mThread**

create TrackHandle
AudioFlinger-->TrackHandle:new
deactivate AudioFlinger
Track-->o TrackHandle:mTrack
end group

TrackHandle-->o AudioTrack:mAudioTrack
deactivate AudioTrack
deactivate AudioTrack
deactivate AudioTrack

@enduml

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章